Ric*_*ard 2 java floating-point
鉴于输出的布尔值下面的代码是
A: false
B: false
C: true
Run Code Online (Sandbox Code Playgroud)
当我试图减去V1 + V2的总和时,任何小于65的东西都不起作用,就好像减法永远不会发生一样.如果我将原语切换为double,问题就解决了.为什么会这样?
private static final float V1 = 1076712940;
private static final float V2 = 1070770707;
public static void main(final String[] args) {
final float y = V1 + V2;//2147483647
System.out.println("A: ((y - 64) - 1) == (y - 65) --> "
+ (((y - 64) - 1) == (y - 65))); /* A */
System.out.println("B: (y > y - 64) --> " + (y > y - 64)); /* B */
System.out.println("C: (y > y - 65) --> " + (y > y - 65)); /* C */
}
Run Code Online (Sandbox Code Playgroud)
浮点数由符号位,尾数和指数表示在存储器中,它们基本上是二进制分数.许多十进制数不能完全表示为二进制分数.在指数或尾数中具有附加位将允许更高的精度水平.
我相信在你的情况下,你已经保存的浮点数和减少64的值之间的差异不是一个足够大的变化,以具有不同的浮点表示.但是,因为double在尾数和指数中有额外的位,所以它可以更精确,并准确地表示减法.