为了账号安全,请及时绑定邮箱和手机立即绑定

Java.lang.Double 实现中的不一致 (Oracle JDK 1.8)?

Java.lang.Double 实现中的不一致 (Oracle JDK 1.8)?

一只斗牛犬 2022-08-17 16:10:17
我查看了该类的实现。的值是 的指定值。该字段应设置为,如果 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 NaN0.0d / 0.00x7ff8000000000000L

否:根据语言规范,它导致 :NaN

将零除以零得到 NaN

0x7ff8000000000000L是 一个,而不是一个,因此不能直接用作字段初始值设定项。longdouble

Double.NaN 的文档确实声明其值“等效于 返回的值”。但是,优先使用 它来初始化字段,因为它是编译时常量值,而方法调用则不是。Double.longBitsToDouble(0x7ff8000000000000L)0.0d / 0.0

(无耻的插头为我的答案,为什么它是0.0d,而不是0.0)


为什么选择此值 ()?0x7ff8000000000000L

如 JLS 第 4.2.3 节所述

IEEE 754 允许其每种单浮点和双浮点格式使用多个不同的 NaN 值。虽然每个硬件架构在生成新的NaN时都会为NaN返回一个特定的位模式,但程序员也可以创建具有不同位模式的NaN,以编码,例如,回顾性诊断信息。

在大多数情况下,Java SE 平台将给定类型的 NaN 值视为折叠为单个规范值,因此此规范通常将任意 NaN 视为规范值。

该方法必须返回一个值,因此这是他们选择返回的值。Double.longBitsToDouble


查看完整回答
反对 回复 2022-08-17
  • 1 回答
  • 0 关注
  • 104 浏览

添加回答

举报

0/150
提交
取消
意见反馈 帮助中心 APP下载
官方微信