升级和比较

时间:2012-11-18 21:38:51

标签: java casting floating-point

我似乎无法找到以下代码破解的原因:

从我的角度来看,发生的是整数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 个答案:

答案 0 :(得分:2)

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

(顺便说一句,在比较int和float时,它将被视为浮点数比较。所以为了说明一个额外的陷阱,你甚至不需要在==比较的一侧浮动。)

答案 1 :(得分: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);

答案 2 :(得分:0)

对于大的整数,一个包含多个整数的块遍及同一个浮点数,因此对于前几次迭代,lbnd的浮点转换保持等于ubnd的浮点转换。

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

答案 3 :(得分:0)

你正在减少和增加lbnd。这表明存在差异。一个是重要的(严格浮点数),最高可达数字16777217.如果您的虚拟机具有更高的精度(非严格),则数字可能更高。