这个问题在这里已有答案:
通过执行此代码:
float f = 1.0;
while (f != 0.0) {
f = f - 0.1;
printf("%.1f\n", f);
}
预计它将运行10次并停止,但结果是它不可避免地进入堆栈溢出。即使我改变while循环使得f变为低于1.0的任何其他值,也会发生同样的情况;
有人在乎解释吗?
比较浮点数是否存在平等/不平等是危险的。 float
数字本质上是不精确的,因为没有足够的位来表示float
数的连续性质。
任何时候你比较float
s,你应该比较float
s在彼此的特定范围内。例如:
while ((f - 0.0) > 0.00001)
为什么代码永远循环?
典型的float
可以准确地代表大约232个数字,0.1
不是其中之一。所以代码更像。
float f = 1.0;
while (f != 0.0) {
f = f - a_number_close_to_one_tenth;
printf("%.1f\n", f);
}
重复减法“错过”0.0。
相反,使用>=
和代码将迭代预期的次数(或者可能再次)。使用更高精度的打印来查看原因。
float f = 1.0;
while (f >= 0.0) {
f = f - a_number_close_to_one_tenth;
printf("%.17e\n", f);
}
这是一个浮点问题。试试>
而不是!=
float f = 1.0;
while (f > 0.0) {
f = f - 0.1;
printf("%.1f\n", f);
}
最好不要在浮点上进行循环。 它甚至需要一些编码标准,如https://wiki.sei.cmu.edu/confluence/display/c/FLP30-C.+Do+not+use+floating-point+variables+as+loop+counters的规则FLP30-C