C:while循环使用浮点永远不会终止[重复]

问题描述 投票:3回答:4

这个问题在这里已有答案:

通过执行此代码:

float f = 1.0;
while (f != 0.0) {
    f = f - 0.1;
    printf("%.1f\n", f);
}

预计它将运行10次并停止,但结果是它不可避免地进入堆栈溢出。即使我改变while循环使得f变为低于1.0的任何其他值,也会发生同样的情况;

有人在乎解释吗?

c floating-point precision
4个回答
3
投票

比较浮点数是否存在平等/不平等是危险的。 float数字本质上是不精确的,因为没有足够的位来表示float数的连续性质。

任何时候你比较floats,你应该比较floats在彼此的特定范围内。例如:

while ((f - 0.0) > 0.00001)

2
投票

为什么代码永远循环?

典型的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);
}

1
投票

这是一个浮点问题。试试>而不是!=

float f = 1.0;
while (f > 0.0) {
    f = f - 0.1;
    printf("%.1f\n", f);
}

0
投票

最好不要在浮点上进行循环。 它甚至需要一些编码标准,如https://wiki.sei.cmu.edu/confluence/display/c/FLP30-C.+Do+not+use+floating-point+variables+as+loop+counters的规则FLP30-C

© www.soinside.com 2019 - 2024. All rights reserved.