Warning: file_get_contents(/data/phpspider/zhask/data//catemap/9/java/345.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Java 放大和比较_Java_Casting_Floating Point - Fatal编程技术网

Java 放大和比较

Java 放大和比较,java,casting,floating-point,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)lbn

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

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

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


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

要验证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);

对于大整数,一个由多个整数组成的块,所有整数都指向同一个浮点,因此在前几个迭代中,lbnd的浮点转换保持与ubnd的浮点转换相等


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

您正在递减和递增lbnd。这表示一个差异。一个仅在数字16777217之前有效(在strictfp浮点中)。如果您的虚拟机具有更高的精度(非严格FP),则数字可能会更高。

很抱歉,我添加了这个问题*您所说的上标度是什么意思??我认为打印lbnd和ubnd的精确整数值更有趣。你可以看到lbnd在每次迭代中减少一个,直到它足够小,可以改变它的浮点转换。啊,好吧,我现在明白了,但是为什么程序没有在2147483640处中断。当四舍五入时,这将是2.14748364,而不是2.14748365。记住,计算机不会以十进制“思考”。发生的实际舍入错误位于基础二进制文件中。