3 回答

TA貢獻1719條經驗 獲得超6個贊
JAVA 的 Double.MIN_VALUE 與 IEEE 754 對最小非零數的定義有何關系?有這樣的事情嗎?
您應該仔細閱讀關于 FP 數的優秀教程,例如每個程序員都應該了解的浮點運算知識?!罢!睌底肿钚≈禐?2^-1023。但 IEEE-754 也有最小值為 2^-1074 的“次正規”(或非正規)數。這些數字可以更小,但會嚴重降低精度。
當顯然有這樣的數字時,為什么谷歌的計算器不能計算小于 2^-1023 的數字?(我知道人們不會每天都使用它們,但編程語言仍然允許使用它們)。
并非所有硬件都支持非正規數,并且當支持使用這些數字時,會帶來很高的時間成本(例如,對于普通數的 pentium 操作符延遲約為 5,但如果結果或一個操作數低于標準,則可能 > 100) . 這可能是 google 不支持 subnormals 的原因(但這只是一個假設)。FP 庫和硬件可以將次正規數視為零。
在 JAVA 中,如果 Double.MIN_VALUE == 4.9E-324 那么為什么 (Double.MIN_VALUE + Double.MIN_VALUE) == 1.0E-323 而不是 9.8E-324,考慮到 (4.9E-5 + 4.9E-5) == 9.8E-5?
打印的值被四舍五入并以二進制顯示。2^-1023 的整數部分的精確值比 4.9 的小數點多得多。它的雙倍也是如此。這是一個展示的問題。
我應該向 Double.MIN_VALUE 添加多少才能使其等于零?
只為自己減去它。

TA貢獻1895條經驗 獲得超3個贊
與其“在這里和通過 Internet 閱讀”,不如看一下 Javadoc:
一個常數,保持類型 ... 的最小正非零值,
double
也等于Double.longBitsToDouble(0x1L)
。即它的最后一位為1,其余為0。
2^-1023 實際上并不是那里的最小值,你可以
Double.MIN_VALUE
得到(2^-1023)/2^51
. 不知道為什么 Google 的開發人員2^-1024
返回 0,你得問他們。Double.MIN_VALUE
如文件所述,為 2^-1074。不等于4.9*10^-324,只是按照Double#toString
. 四舍五入Double.MIN_VALUE
只是2*Double.MIN_VALUE
碰巧朝不同的方向前進。-Double.MIN_VALUE
,就像Double d
您要添加的任何其他內容一樣-d
。

TA貢獻1876條經驗 獲得超5個贊
您可以將這些搜索詞輸入任何搜索引擎,而不是“閱讀并通過互聯網”:
IEEE 754 1074
您可以在 Wikipedia 上找到以下文章來很好地解釋它:
https://en.wikipedia.org/wiki/IEEE_754-1985#Double_precision:
雙精度 雙精度數占用 64 位。雙精度:
最接近零的正數和負數(由 Exp 字段中全 0 和 Fraction 字段中的二進制值 1 的非規范化值表示)是
±2^?1074 ≈ ±4.94066×10^?324
最接近零的正負歸一化數(在 Exp 字段中用 > 二進制值 1 表示,在小數字段中用 0 表示)是
±2^?1022 ≈ ±2.22507×10^?308
離零最遠的有限正數和有限負數(由 Exp 字段中的 2046 和分數字段中的全 1 的值表示)是
±(1?2^?53) × 2^1024 ≈ ±1.79769×10^308
https://en.wikipedia.org/wiki/IEEE_754#Basic_and_interchange_formats:
請注意,在上表中,列出的最小指數是正常數;特殊的次正規數表示允許表示更小的數字(有一些精度損失)。例如,可以用 binary64 表示的最小正數是 2^?1074(因為 1074 = 1022 + 53 - 1)。
添加回答
舉報