【发布时间】:2019-08-09 16:08:01
【问题描述】:
我查看了java.lang.Double 类的实现。 NaN 的值是0x7ff8000000000000L 的指定值。 public static final double NaN 字段设置为 0.0d / 0.0,如果 JVM 确实以这种方式实现它,则它应该评估为 0x7ff8000000000000L。
为什么选择这个值 (
0x7ff8000000000000L)?该值有什么特别之处(例如它的位掩码)吗?为什么该字段被隐式设置为该值并取决于
0.0d / 0.0操作的底层实现,而静态方法public static long doubleToLongBits(double value)将值显式设置为0x7ff8000000000000L用于NaN参数?隐式设置它不是更安全吗,因为0.0d / 0.0的结果高度依赖于 JVM 的实现并且理论上可以更改(很可能永远不会)?
POSITIVE_INFINITY 和 NEGATIVE_INFINITY 也是如此。字段被隐式设置为其值,但某些方法使用显式指定值。这背后有什么原因吗?
感谢您帮助我每天学习新事物 :-)。
【问题讨论】:
-
1.这是 IEEE754 中指定的值。
-
as the result of 0.0d / 0.0 highly depends on the implementation of the JVM and could be changed- 不,JLS 指定 0.d/0.0 返回 NaN,因此 0.d/0.0 根据定义为 NaN。 -
@AndyTurner:这是 IEEE754 中指定的其中一个值。但另一个也可以。特别是,NaN 不与其他浮点数进行比较,因为即使相同的值也不等于它自己:
Double.NaN == Double.NaN是false。但是他们都会为Double.isNaN返回true。 -
0x7ff8000000000000L是一个 long 的事实确实排除了它在指定双值字段时的用途。