【发布时间】:2015-03-11 02:03:30
【问题描述】:
Java 完全兼容 IEEE 754 对吧?但是我对java如何决定浮点加法和减法的符号感到困惑。
这是我的测试结果:
double a = -1.5;
double b = 0.0;
double c = -0.0;
System.out.println(b * a); //-0.0
System.out.println(c * a); //0.0
System.out.println(b + b); //0.0
System.out.println(c + b); //0.0
System.out.println(b + c); //0.0
System.out.println(b - c); //0.0
System.out.println(c - b); //-0.0
System.out.println(c + c); //-0.0
我认为在乘法和除法中,符号是这样决定的:sign(a) xor sign(b), 但是我想知道为什么0.0 + -0.0 = 0.0,Java如何决定加减法的符号? IEEE 754 中有描述吗?
我还发现 Java 可以通过某种方式区分 0.0 和 -0.0 之间的相似之处,因为
System.out.println(c == b); //true
System.out.println(b == c); //true
Java 中的“==”是如何工作的? 是不是特例处理?
【问题讨论】:
-
0.0 == -0.0 不是 Java 的特殊性:它由 IEEE754 指定
-
如果你想要章节,请参阅 IEEE 754 的第 6.3 节:“当两个符号相反的操作数之和(或两个符号相同的操作数之差)正好为零时,在除roundTowardNegative 之外的所有舍入方向属性中,该和(或差)应为+0;在该属性下,精确零和(或差)的符号应为-0。"
标签: java floating-point ieee-754