#include<stdio.h>
#include<conio.h>
main()
{
float i=0.0;
while(i!=1.0)
{
i+=0.1;
printf("%f",i);
}
getch(
}
为什么它的输出是无限的?有人能告诉我应该做些什么来限制它吗?
最佳答案
循环是无限的,因为在计算机的浮点运算下,加0.1十次不等于1。
这是因为计算机使用二进制数进行算术运算,而数字0.1
不能表示为终止二进制数。因此,计算机必须选择一个二进制数,该二进制数终止并符合一个近似于0.1的float
。不幸的是,将这个近似值的十个副本加在一起不会产生一个等于1的浮点数,这是不够精确的。
如果更改循环中的格式字符串以显示更高的精度,则可以看到循环中i
的值不精确:
0.10000000149011611938
0.20000000298023223877
0.30000001192092895508
0.40000000596046447754
0.50000000000000000000
0.60000002384185791016
0.70000004768371582031
0.80000007152557373047
0.90000009536743164062
1.00000011920928955078
一般情况下,不应比较浮点数是否相等。您可以使用不等式比较,检查两个数字的差是否小于epsilon的某个小固定值,或者使用整数进行迭代,并且只在需要时转换为浮点。其他的答案已经解释了这些选择,所以我不在这里讨论它们。