Java 放大和比较
我似乎找不到以下代码被破坏的原因: 从我的角度来看,所发生的是整数lbnd减少了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
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。记住,计算机不会以十进制“思考”。发生的实际舍入错误位于基础二进制文件中。