因為float和double類型的資料有資料精度,是以直接用“==”或者“!=”做比較會出現很多的問題,這類比較一般都使用宏定義一個資料精度,在精度允許誤差範圍内則認為兩個數相等。
以最常見的問題做分析:
float a 與0作比較程式:
我們經常不這樣寫代碼
if(a == 0.0)
{
printf("a equal 0");
}
而是這樣寫
#define EPSINON 1e-6
if(fabs(a-0.0) < EPSINON)
{
printf("a equal 0");
}
下面的代碼将為我們解開疑惑:
1 #include <stdio.h>
2 #include <math.h>
3 #define EPSINON 1e-6
4
5 int main(int argc,char *argv[])
6 {
7 float a = 120.02;
8 float b = 120;
9 float c = 0.02;
10
11
12 if(a-b == c)
13 {
14 printf("%f - %f = %f\n",a,b,c);
15 }
16 printf("a = %f,b = %f,a-b = %f\n",a,b,a-b);
17
18
19 return 0;
20 }
執行結果如下:
[email protected]:~/c_language$ ./a.out
a = 120.019997,b = 120.000000,a-b = 0.019997
從以上代碼就可以看出精度在float和double比較中的重要性