我查看了該類的實現。的值是 的指定值。該字段應設置為,如果 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
提交
取消