由于实数在内存中是以浮点数形式存储的,阶码所占的位数决定实数的表数范围,尾数所占的位数决定实数的精度,ANSI C 并没有明确规定三种浮点类型的阶码和尾数所占的位数,不同的C编译器分配给阶码和尾数的位数是不同的,无论怎样,浮点数在内存中存储时其尾数所占的位数都是有限的,因此其所能表示的实数的精度也是有限的。
听起来很复杂?换句话说就是浮点数并非真正意义上的实数,只是其在某种范围内的近似。
如下列代码中:
float a = 876.4444;
printf("a = %f", a);
运行结果却是:
a = 846.444397
这正是因为float型变量仅能接收实型常量的7位有效数字,在有效数字后面输出的数字都是不准确的。
因此,浮点数大小比较由于精度问题,如果直接比较可能会出错,所以在比较的时候可以设定一个很小的数值(精度),当二者差小于设定的精度时,就认为二者是相等的。
比如:设置精度为1E-2,也就是0.01。对于两个浮点数a、b,如果fabs(a-b)<=1E-2,那么就是相等了;类似的判断大于的时候,就是if ((a>b)&&(fabs(a-b)>1E-2)); 判断小于的时候,就是if ((a<b)&&(fabs(a-b)>1E-2));。
当然,精度的设置应有计算过程中需求而定,但要记住的是,只能用近似的方法比较浮点数的大小。