0

我似乎找不到以下代码破坏的原因:

从我的角度来看,发生的事情是整数 lbnd 减少了

public class Test {
    public static void main(String[] args) {
        methode1();
    }
    static void methode1() {
        int ubnd = Integer.MAX_VALUE;
        int lbnd = ubnd;

        while ((float)lbnd == (float)ubnd) {
            --lbnd;
        }   
        System.out.println((++lbnd) + ".." + ubnd);
    }
}

问题是这个循环应该是我所看到的无限循环,但是它在 64 个循环后中断,因为 int 的值发生了变化。结果是:

2147483584..2147483647

但它应该是一个无限循环:

2147483647..2147483647

4

4 回答 4

2

请记住,浮点数没有足够的精度来精确存储整数的所有 32 位。因此,对于一个大整数, (float) i 和 (float) (i-1) 对于浮点比较而言是相同的。

(顺便说一句,在比较 int 和 float 时,它将被视为 float 比较。因此,为了说明一个额外的问题,您甚至不需要强制转换在 == 比较的一侧浮动。)

于 2012-11-18T21:45:19.813 回答
0

要验证 Neil Coffey 的出色答案,您可以查看带有附加输出的代码输出:

   while ((float)lbnd == (float)ubnd) {
        System.out.println(
                "Lower Int " + lbnd 
                + " Lower Float " + (float)lbnd 
                + " .. Upper Int " + ubnd
                + " Upper Float "+ (float)ubnd);
        --lbnd;
    }   
    System.out.println((++lbnd) + ".." + ubnd);
于 2012-11-18T21:47:42.957 回答
0

对于大整数,一个由几个整数组成的块都舍入到相同的浮点数,因此对于前几次迭代,lbnd 的浮点数转换保持等于 ubnd 的浮点数转换。

在对 lbnd 进行足够的 int 减法之后,它足够小以映射到下一个较低的浮点值,并且两个浮点转换变得不同,从而结束循环。

于 2012-11-18T21:48:43.467 回答
0

您正在递减和递增 lbnd。这表示相差一。一个仅在数字 16777217 之前有意义(在 strictfp 浮点中)。如果您的 vm 具有更高的精度(非 strictfp),则该数字可能更高。

于 2012-11-18T21:55:42.373 回答