理解浮点数和无限循环

3

我有这段代码:

while (x < 10.0) {
    x += y;
}

如果xy是浮点数,那么似乎如果把它们相加,循环将无限地继续下去。我不理解为什么没有通过10。看起来不可能不通过十,但我的教科书上确实如此。

这是为什么呢?这是因为浮点数的舍入吗?还是我漏掉了什么?

编辑:xy严格为正数。


2
它取决于 xy 的值。它们是什么? - Oliver Charlesworth
尝试将 System.out.println(x) 放在循环内部,以跟踪每个循环的增量。 - A-SM
x和y的值是相关的。如果y = 0,这显然是一个无限循环(如果x < 10) :) - bengoesboom
这些变量是严格为正数的,因此x和y都大于0。这意味着如果它们循环执行,将会递增超过10。 - user1832483
@user1832483:不,那不是真的。 - Oliver Charlesworth
好的,@OliCharlesworth 知道诀窍。虽然我自己没有看到... - John
3个回答

8

您没有告诉我们变量xy的实际初始值,因此我们无法确定。以下是为什么这可能不起作用的示例:

class Main {
    public static void main(String[] args) {
        float x = 1.0f;
        float y = 1e-8f;
        float z = x + y;

        System.out.printf("%g\n", x);      // 1.00000
        System.out.printf("%g\n", y);      // 1.00000e-08
        System.out.printf("%g\n", z);      // 1.00000
        System.out.printf("%g\n", z - x);  // 0.00000

    }
}

请查看http://ideone.com/RMMPlP

还有一个理论上可以工作的例子,只是你还没有等够长时间:y = 1e-30f :-) - Adrian Pronk
是的,看到了,这就是我的意思。我插入了代码,但它一直在运行,为什么呢?我想知道是什么让浮点数一直保持运行状态。 - user1832483
因为在浮点数中,1.0 + 1e-8 == 1.0。你需要重新审视一下浮点数的工作原理 ;) - Oliver Charlesworth
@OliCharlesworth:我只是想开个玩笑,即使精度足够,在加上1e-30f之后会得到一个更高的值,但由于循环将需要迭代约1e30次,它实际上仍然是一个无限循环。 - Adrian Pronk

0
你在使用Java吗?试试这个 -
while(x < 10.0f) {
x += y;
}

或者

while(x < (float)10.0) {
x += y;
}

0

你的 y 值可能为 0 或非常小,从而使循环运行无限或长时间:

假设如果

y = 0;

这个循环将会无限执行

while(x < 10.0) {
x += y;
}

我理解了这个问题,但是问题在于x和y是严格正数,所以y或x不能为0。 - user1832483

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接