[英]Inconsistency in java.lang.Double implementation (Oracle JDK 1.8)?
我查看了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)
為NaN
參數顯式設置值為0x7ff8000000000000L
? 隱式設置它是不是更安全0.0d / 0.0
的結果高度依賴於JVM的實現並且可以在理論上改變(很可能它永遠不會)?
POSITIVE_INFINITY
和NEGATIVE_INFINITY
。 字段隱式設置為其值,但某些方法使用顯式指定值。 這背后有原因嗎?
感謝您幫助我每天學習任何新東西:-)。
public static final double NaN
字段設置為0.0d / 0.0
,如果JVM以這種方式實現,則應該計算為0x7ff8000000000000L
。
否: 根據語言規范 ,它會產生NaN
:
將零除以零導致NaN
0x7ff8000000000000L
是long
,而不是double
,因此不能直接用作字段初始值設定項。
Double.NaN
的文檔確實聲明其值“等於Double.longBitsToDouble(0x7ff8000000000000L)
返回的Double.longBitsToDouble(0x7ff8000000000000L)
。” 但是,優先使用0.0d / 0.0
來初始化字段,因為它是編譯時常量值,而方法調用則不是。
(無恥的插件我的答案為什么它是0.0d
,而不是0.0
)
為什么選擇此值(
0x7ff8000000000000L
)?
IEEE 754為其單浮點格式和雙浮點格式提供了多個不同的NaN值。 雖然每個硬件架構在生成新的NaN時返回NaN的特定位模式,但是程序員也可以創建具有不同位模式的NaN以編碼例如回顧性診斷信息。
在大多數情況下,Java SE平台將給定類型的NaN值視為折疊為單個規范值,因此該規范通常將任意NaN稱為規范值。
Double.longBitsToDouble
方法必須返回一個值,因此這是他們選擇返回的值。
聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.