① 用c語言編寫一個函數,判斷兩個實數是否相等,兩數誤差在0.0001內認為相等
#include <stdio.h>
#include <stdbool.h>
bool equivalence(double x, double y)
{
double z = x - y;
if(-0.0001<z && z<0.0001)
{
return true;
}
else
{
return false;
}
}
int main(int argc,char *argv[])
{
double a,b;
scanf("%lf %lf",&a,&b);
if(equivalence(a,b))
{
printf("相等 ");
}
else
{
printf("不相等 ");
}
return 0;
}
運行結果
西安盛圖軟體科技
② C語言浮點數誤差的解決
浮點數表示法的確存在精度丟失的問題,是由於最低有效位的限製造成的。而且一般其實際表示的數值會比規定的要小。比如2.6的浮點數表示為40266666H,而該數實際的值是2.5999999,這樣計算的結果是0.0999999比0.1小,不能輸出0.1,產生精度丟失,而如果將其表示更改為40266667H,其表示的實際值是2.6000001,而這個數可以輸出0.1的結果的。所以如果要使計算能夠得出正確結果,可以嘗試在輸入的時候將有效位數擴展,以確保得出正確結果。
比如要輸出2.6的結果,可以設sx=2.6000001,這樣可以使浮點數表示結果為大於2.6的盡可能小的值。如果要輸出2.1的結果,可以設sx=2.1000001。
int k=0;
float sx=2.6000001;
③ 求教ierfc函數的C/C++函數實現
求教ierfc函數的C/C++函數實現
懸賞分:30 - 離問題結束還有 14 天 15 小時
現在有一個Q函數
Q函數可以很容易的通過erfc函數求得
erfc(x)=(2/根號π)*∫exp(-t²/2)dt 其中 積分上限是正無窮 下限是x
現在問題是要求Q的反函數,有人說可以通過erfc的反函數求得(即ierfc)
可是我不會 也沒有查到 請知道ierfc函數的或者能夠解決我問題的大蝦賜教 不甚感激
回答:
下面這個是在MATLAB環境下的解決方案,希望能給你點啟發,
起到拋磚引玉的作用
使用二分法計算erfc函數的反函數M程序
function c=finverse_erfc(z);
% count inverse function of erfc[complementary error function]
% Author email of the program:% [email protected]
a=600;
b=0;
if z>1 | z<0;
error([[' z takes a error value!'],...
['; Please check it''s value!']]);
end
c=(a+b)/2;
while abs(erfc(c)-z)>1e-6;
c=(a+b)/2;
if erfc(c)-z<0;
a=c;
else
b=c;
end
end
% c是你要的值
④ 在C語言中erfc函數怎麼表示,也就是x的誤差補償函數,急求高人指點。。。
float用printf("%f"來表示,double用printf("%ld"來表示。
把英文幫助找出來了,自己看看吧。
函數原型:
#include <math.h>
double erfc(double x);
float erfcf(float x);
long double erfcl(long double x);
Link with -lm. 編譯時需要鏈接 -lm
DESCRIPTION 說明
The erfc() function returns the complementary error function of x, that is, 1.0 - erf(x).
RETURN VALUE 返回值
On success, these functions return the complementary error function of x, a value in the range [0,2].
If x is a NaN, a NaN is returned.
If x is +0 or -0, 1 is returned.
If x is positive infinity, +0 is returned.
If x is negative infinity, +2 is returned.
If the function result underflows and proces an unrepresentable value, the return value is 0.0.
If the function result underflows but proces a representable (i.e., subnormal) value, that value is returned, and a range error occurs.
⑤ erfc函數在c語言中用什麼頭文件
#include<math.h>
⑥ c語言求平均數,最後有誤差;麻煩幫我看一下,謝謝!
定義為float型,保留6位小數,最後的數字出現誤差是正常的,原因是float型精度不足。解決方法:ave不用float型,改為double型。
⑦ C語言中怎麼用erfc函數我的是vc6,函數庫裡面沒有這個函數。求代碼〒_〒
void calroot(double a, double b, double c)
{
double dert;
double value;
if (a == 0)
{
printf("元二程!\n");
return;
}
dert = b *b - 4 * a * c;
⑧ C語言浮點運算感覺很奇怪同樣的數,算出來結果卻不一樣,這是怎麼回事
計算機存儲和運算都是以二進制處理的,而表達式是十進制的,那麼存儲或運算時是要轉換成二進制,計算完成後輸出還要再轉換成十進制。
那麼你應該明白二進制每一位權重都是2^N,此處N為位號,位號分布如下:
...3,2,1,0(小數點) -1,-2,-3...
權重分布如下:
...2^3,2^2,2^1,2^0 (.小數點)2^-1,2^-2,2^-3
例如一個二進制的1.111(B)=1.875(D)
整數部分:1的位號為0,因此1*2^0=1*1=1
小數點向右第一個1:位號為-1,因此1*2^-1=1*1/2=0.5
小數點向右第二個1:位號為-2,因此1*2^-2=1*1/4=0.25
小數點向右第三個1:位號為-3,因此1*2^-3=1*1/4=0.125
合起來1+0.5+0.25+0.125=1.875,其他位依此類推。
無需想得太多,你可以明顯看到,二進制小數表達的數都是不同級別減半後的累加。與十進制的某些小數沒有一一對應,顯然轉換必然會發生誤差。
另一方面,存儲時CPU會對十進制小數會進行編碼,float的尾數長度為23位,階碼8位,符號佔1位,共32位。double是64位,無論如何精度都是有限的,因此也會存在誤差,1.1*100時編譯器會將表達式先轉換二進制並運算運算,運算後再編碼存儲到變數中或臨時變數中,而運算是由CPU直接處理的,因此你可以看到有個0.000002的誤差數,而printf是個函數,對誤差進行了修正。
PS:簡單了解下浮點數的編碼方式網頁鏈接
⑨ c語言計算誤差,求2的59次方與標准差2
我這里有2個方法計算的2的59次方,結果一致,希望能幫到你:
#include<stdio.h>
#include<string.h>
int
main(){
long
long
a
=
1;
a
=
a
<<
59;
printf("a
=
%lld\n",
a);
double
d
=
1;
int
i
=
59;
while(i--)
d
=
d*2;
printf("d
=
%f\n",
d);
return
0;
}
⑩ 求誤差函數erf C語言程序代碼!!!急!!!!
C99標准開始就有誤差函數的內部實現,所以只要包含<math.h>頭文件即可。
調用格式為:
float erff( float arg ); /* 單精度誤差函數 */
double erf( double arg ); /* 雙精度誤差函數 */
long double erfl( long double arg ); /* 長雙精度誤差函數 */