1
int i = 0;
double n = 1.24;
    for (; int(n) != n; i++) {
        n *= 10;
    }

为什么会进入死循环?它不应该在两个循环后停止吗?

4

3 回答 3

9

1.24不能完全表示为 a double。如果你检查 的初始值n,你会发现它是1.239999999999999991118215802998747...

至于为什么循环永远不会停止,一旦n超过最大值的值double,它就会自动转换为+Infinity,这是一个特殊的浮点值。一旦你达到了那个点,就n停止改变,int(n) != n永远不会满足。

于 2012-12-17T12:59:01.130 回答
4

因为 double 不是数字的精确表示,并且条件 int(n) == n 从未达到。阅读此http://en.wikipedia.org/wiki/Floating_point

于 2012-12-17T12:58:38.043 回答
1

我试过了,它在两个循环后停止。我用过gcc。我将 int(n) 更改为 (int)n

由于某些舍入误差而发生无限循环,请尝试检查 (int)n 和 n 之间的差异

通常,不要使用 equal 来检查 double 是否相等。改为使用

if (fabs(ab)<1e-10) //而不是 a==b

于 2012-12-17T13:03:02.347 回答