簡體   English   中英

java.lang.Double實現不一致(Oracle JDK 1.8)?

[英]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

  1. 為什么選擇此值( 0x7ff8000000000000L )? 該值是否有任何特殊之處(例如它的位掩碼)?

  2. 為什么字段隱式設置為該值並依賴於0.0d / 0.0操作的底層實現,而靜態方法public static long doubleToLongBits(double value)NaN參數顯式設置值為0x7ff8000000000000L 隱式設置它是不是更安全0.0d / 0.0的結果高度依賴於JVM的實現並且可以在理論上改變(很可能它永遠不會)?

POSITIVE_INFINITYNEGATIVE_INFINITY 字段隱式設置為其值,但某些方法使用顯式指定值。 這背后有原因嗎?

感謝您幫助我每天學習任何新東西:-)。

public static final double NaN字段設置為0.0d / 0.0 ,如果JVM以這種方式實現,則應該計算為0x7ff8000000000000L

否: 根據語言規范 ,它會產生NaN

將零除以零導致NaN

0x7ff8000000000000Llong ,而不是double ,因此不能直接用作字段初始值設定項。

Double.NaN的文檔確實聲明其值“等於Double.longBitsToDouble(0x7ff8000000000000L)返回的Double.longBitsToDouble(0x7ff8000000000000L) 。” 但是,優先使用0.0d / 0.0來初始化字段,因為它是編譯時常量值,而方法調用則不是。

(無恥的插件我的答案為什么它是0.0d ,而不是0.0


為什么選擇此值( 0x7ff8000000000000L )?

JLS Sec 4.2.3中所述

IEEE 754為其單浮點格式和雙浮點格式提供了多個不同的NaN值。 雖然每個硬件架構在生成新的NaN時返回NaN的特定位模式,但是程序員也可以創建具有不同位模式的NaN以編碼例如回顧性​​診斷信息。

在大多數情況下,Java SE平台將給定類型的NaN值視為折疊為單個規范值,因此該規范通常將任意NaN稱為規范值。

Double.longBitsToDouble方法必須返回一個值,因此這是他們選擇返回的值。

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM