在C语言中的浮点数
在C语言中的浮点数
今天我在C语言中玩浮点数,代码如下:
float a = 0.0; a += 0.8; if(a == 0.800000) printf("correct");
if语句没有被执行,因此我打印了a的值,结果是0.800000。
主函数如下:
void main(){ float a=0.0f; a=a+0.1f; if(a==0.1f) printf( "1correct"); a += 0.1f; if(a==0.2f) printf( "2correct"); a += 0.1f; if(a==0.3f) printf( "3correct"); a += 0.1f; if(a==0.4f) printf( "4correct"); if(a==0.5f) printf( "5correct"); a += 0.1f; if(a==0.6f) printf( "6correct"); a += 0.1f; if(a==0.7f) printf( "7correct"); a += 0.1f; if(a==0.8f) printf( "8correct"); }
以下程序输出结果为:
1correct2correct3correct4correct5correct6correct
没有打印出7correct和8correct。
请问有人能够解释一下吗?
浮点数在C语言中的问题及解决方法
在C语言中,有许多十进制的小数无法用有限数量的二进制位精确表示出来。因此,在使用浮点数时,直接进行精确等于的比较通常是不可行的。如果真的需要进行比较,可以通过检查它们是否在一个小范围内来实现:
if ( a > 0.799999 && a < 0.800001 ) printf( "correct" );
如果可能的话,尽量使用整数而不是浮点数或双精度数。例如,在循环计数器或数组索引中不要使用浮点数。虽然浮点数可以用于模拟物理现象、天气预测等许多应用,但是浮点数也有许多微妙之处需要注意。
总结起来,浮点数在C语言中的问题主要是由于无法精确表示某些十进制小数,导致进行精确等于比较时出现误差。解决方法是通过检查浮点数是否在一个小范围内来替代精确等于的比较操作。另外,在可以使用整数的情况下,尽量使用整数来避免浮点数带来的问题。