#include<stdio.h>
#include<conio.h>
main()
{
float i=0.0;
while(i!=1.0)
{
i+=0.1;
printf("%f",i);
}
getch(
}
为什么它的输出是无限的?任何人都可以告诉我应该做些什么来使这个有限?
答案 0 :(得分:2)
在你想迭代浮点数的情况下,你应该考虑迭代整数并除以浮点数。
在你的情况下:
#include<stdio.h>
main()
{
int i=0;
while(i!=10)
{
i+=1;
printf("%f",i/10.0f);
}
}
通过这种方式,您可以获得最佳近似值,并且不会因添加浮点数而累积舍入误差。
答案 1 :(得分:2)
循环是无限的,因为在计算机的浮点运算下,添加0.1十次不等于1.
这是因为计算机使用二进制数来进行算术运算,而数字0.1
不能表示为终止二进制数。因此,计算机必须选择一个二进制数,该二进制数确实终止并且适合float
作为0.1的近似值。遗憾的是,将这种近似值的十个副本一起添加并不会产生等于1的浮点数是不够精确的。
如果更改循环中的格式字符串以显示更高的精度,则可以看到循环中i
的值不准确:
0.10000000149011611938
0.20000000298023223877
0.30000001192092895508
0.40000000596046447754
0.50000000000000000000
0.60000002384185791016
0.70000004768371582031
0.80000007152557373047
0.90000009536743164062
1.00000011920928955078
通常,您不应该将浮点数进行比较以获得相等性。您可以使用不等式比较,检查两个数字是否几乎相等,它们的差异是否小于epsilon的某个小固定值,或者使用整数进行迭代,并且只在需要时转换为浮点数。其他答案已经解释了这些替代方案,所以我不会在这里进入。
答案 2 :(得分:0)
浮点数不准确。
因此,像平等这样的东西很久以前已经飞出了窗外。
答案 3 :(得分:0)
你无法比较那样的浮点数,因为它们不精确。你可以在一个范围内检查。
#define epsilon 0.000005
main()
{
float i=0.0;
while(!(i > 1.0 - epsilon && i < 1.0 + epsilon))
{
i+=0.1;
printf("%f",i);
}
getch();
}