【问题标题】:Understanding floating points and infinite loops了解浮点数和无限循环
【发布时间】:2013-05-30 06:28:45
【问题描述】:

我有这个代码:

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

如果xy 是浮点数,显然如果你添加它们,循环将无限继续。我不明白为什么它不会通过 10。不通过 10 似乎是不可能的,但根据我的教科书却没有。

这是为什么呢?是因为浮点数发生舍入吗?还是我错过了什么?

编辑:顺便说一下,xy 严格来说是积极的

【问题讨论】:

  • 这取决于xy的值。它们是什么?
  • 尝试将System.out.println(x) 放入循环中以跟踪每个循环的增量
  • x 和 y 的值是相关的。如果 y = 0,这显然是一个无限循环(如果 x
  • 他们严格为正,所以 x 和 y 都高于 0。这意味着如果他们循环遍历它将超过 10。
  • @user1832483:不,那不是真的。

标签: java loops infinite


【解决方案1】:

你在使用 Java 吗?试试这个-

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

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

【讨论】:

    【解决方案2】:

    您还没有告诉我们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 :-)
    • 是的,这就是我的意思,我插入了代码并且它一直在运行,但是为什么认为是什么让浮点数一直这样运行。
    • @user1832483:因为在浮点数中,1.0 + 1e-8 == 1.0。您需要查看浮点的工作原理;)
    • @OliCharlesworth:我只是想开玩笑说,即使精度足够,所以添加 1e-30f 会产生更高的值,因为循环必须迭代大约 1e30 次它实际上是一个反正无限循环。
    【解决方案3】:

    您的 y 值可能为 0 或非常小,因此使循环运行无限或很长时间:

    假设如果

    y = 0;
    

    这个循环将无限循环

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

    【讨论】:

    • 我明白这一点,但问题是 x 和 y 是严格正数,所以 y 或 x 不能为 0
    猜你喜欢
    • 2016-07-26
    • 2017-05-15
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2020-07-31
    • 1970-01-01
    • 1970-01-01
    • 2023-02-17
    相关资源
    最近更新 更多