一、浮点变量不可用“==” 或“!=” 与数字比较
float i = 9.3654564;
if(i == 9.3654564)
{
printf("test ok\n");
}
else
{
printf("test error\n");
}
运行结果为test error
无论是 float 还是 double 类型的变量,都有精度限制。
所以一定要避 免将浮点变量用“==”或“!=”与数字比较,应该设法转化成“>=”或“<=”形式。
我没法理解为什么精度限制,就无法用“==”或“!=”与数字比较。
通过《深入理解计算机系统第三版》 P22
(3.14 + 1e20) - 1e20 结果为0.0,而3.14 + (1e20 - 1e20) = 3.14。浮点数只能表示近似值
【1e20表示1*10的20次方】
二、那么该如何判断两个浮点数相等?
假设浮点变量的名字为 x,应当将 if (x == 0.0) // 隐含错误的比较
转化为 if ((x>=-EPSINON) && (x<=EPSINON)) 其中 EPSINON 是允许的误差(即精度)。
float的精度误差在1e-6 ==> 1*10^-6 ==> 1/10^6 ==>也就是0.000001
double精度误差在1e-15 ==>也就是0.000000000000001
例:判断float a,b是否相等
if(fabs(a-b) < 1e-6)
printf("a等于b\n");
else
printf("a不等于b");
另外注意fabs()和abs()的区别:fabs()是对浮点数求绝对值,abs()是对整数求绝对值。
或者自定义精度值:
#define EPSILON 0.000001 //根据精度需要
if ( fabs( fa - fb) < EPSILON )
{
printf("fa<fb\n");
}