我查看了该类的实现。的值是 的指定值。该字段应设置为,如果 JVM 确实以这种方式实现它,则应将其计算为。java.lang.DoubleNaN0x7ff8000000000000Lpublic static final double NaN0.0d / 0.00x7ff8000000000000L为什么选择此值 ()?该值有什么特别之处吗(例如,它的位掩码)?0x7ff8000000000000L为什么字段隐式设置为该值并依赖于操作的基础实现,而静态方法将参数的值显式设置为?隐式设置它,因为高度依赖于JVM的实现,并且在理论上可以改变(很可能永远不会改变)的结果,这不是更安全吗?0.0d / 0.0public static long doubleToLongBits(double value)0x7ff8000000000000LNaN0.0d / 0.0和 也是如此。字段隐式设置为其值,但某些方法使用显式指定的值。这背后有什么原因吗?POSITIVE_INFINITYNEGATIVE_INFINITY感谢您每天帮助我学习任何新知识:-)。
1 回答
四季花海
TA贡献1811条经验 获得超5个赞
该字段应设置为,如果 JVM 确实以这种方式实现它,则应将其计算为。
public static final double NaN
0.0d / 0.0
0x7ff8000000000000L
否:根据语言规范,它导致 :NaN
将零除以零得到 NaN
0x7ff8000000000000L
是 一个,而不是一个,因此不能直接用作字段初始值设定项。long
double
Double.NaN
的文档确实声明其值“等效于 返回的值”。但是,优先使用 它来初始化字段,因为它是编译时常量值,而方法调用则不是。Double.longBitsToDouble(0x7ff8000000000000L)
0.0d / 0.0
(无耻的插头为我的答案,为什么它是0.0d
,而不是0.0
)
为什么选择此值 ()?
0x7ff8000000000000L
IEEE 754 允许其每种单浮点和双浮点格式使用多个不同的 NaN 值。虽然每个硬件架构在生成新的NaN时都会为NaN返回一个特定的位模式,但程序员也可以创建具有不同位模式的NaN,以编码,例如,回顾性诊断信息。
在大多数情况下,Java SE 平台将给定类型的 NaN 值视为折叠为单个规范值,因此此规范通常将任意 NaN 视为规范值。
该方法必须返回一个值,因此这是他们选择返回的值。Double.longBitsToDouble
添加回答
举报
0/150
提交
取消