浮點數與0值的比較
阿新 • • 發佈:2018-12-17
在函式中,根據問題領域所容許的的精度,定義一個誤差上限(一個極小數)。然後在浮點計算時,計算結果與這個誤差上限作比較,而不是與0作比較。如果與0進行比較,誤差會使程式結果發生改變,如下圖中的球一元二次方程式的解,由於誤差,所以程式結果出現錯誤。
測試結果
其程式碼如下
#include "stdio.h" #include "math.h" void A(double a,double b,double c) { double x1; double x2; double d = b*b - 4*a*c; if(a=0) { x1=x2 =-c/b; printf("x1=%f,x2=%f\n",x1,x2); } else if(d=0) { x1=x2=-b/(2*a); printf("x1=%f,x2=%f\n",x1,x2); } else if(d >0)//d>0 { x1 = (-b+sqrt(d))/(2*a); x2 = (-b-sqrt(d))/(2*a); printf("x1=%f,x2=%f\n",x1,x2); } else { printf("無實根\n"); } } int main() { A(0,1,1); A(1,2,1); A(2,1,2); A(0,1,2); A(1,2,1); A(1,4,2); A(1,1,1); return 0; }
但是如果使用#define,將其精度確定,減少其誤差,那可以得到正確的答案。
如下
而結果也會得到正確的結果
其程式碼如下
#include "stdio.h" #include "math.h" #define EPS 0.0000001 void A(double a,double b,double c) { double x1; double x2; double d = b*b - 4*a*c; if(-EPS<=a && a<=EPS) { x1=x2 =-c/b; printf("x1=%f,x2=%f\n",x1,x2); } else if(-EPS<=d && d<=EPS)//d==0 { x1=x2=-b/(2*a); printf("x1=%f,x2=%f\n",x1,x2); } else if(d > EPS)//d>0 { x1 = (-b+sqrt(d))/(2*a); x2 = (-b-sqrt(d))/(2*a); printf("x1=%f,x2=%f\n",x1,x2); } else { printf("無實根\n"); } } int main() { A(0,1,1); A(1,2,1); A(2,1,2); A(0,1,2); A(1,2,1); A(1,4,2); A(1,1,1); return 0; }