2012-01-28 18 views

回答

6

您的困惑源自於認爲「1E-45」是負數。它不是 - 它實際上是一個非常小的正數:1 x 10^-45或更確切地說,0.000 ... 0001 - 它在「0」之間有44「0」。和「1」這表示浮點可以存儲的最小精度單位(或者類似 - 其他人鏈接的文章將詳細解釋,如果需要知道的話)。

另一個數字「1E38」表示可存儲在此數據類型中的最大數字。這是1×10^38,或者說是10000 ... 0000,即1和38之後的0。

+0

現在,漢斯Passant已經編輯了這個問題來指代+ ve和-ve指數,而不是+ ve和-ve數字,他的回答是一個正確和完整的解釋。 – perfectionist 2012-01-28 17:38:48

1

它們不是正數和負數 - 它們是正數和負數指數。區別歸因於規範化工作的方式,基本上。由於denormal numbers和指數偏差,您最終可以存儲「較小」的數字。

最終,你基本上不需要擔心 - 但你需要明白,正面和負面的數字範圍是一樣的(這只是一個符號位)。

+0

任何關心浮點精度的人都應該非常擔心非規範問題。他們吃早餐有效數字。 – 2012-01-28 11:36:59

+0

@HansPassant:真的 - 但是在你沒有意識到*值*是積極的和消極的差異和*指數*積極和消極的階段,這是值得等待一段時間,然後擔心:) – 2012-01-28 11:39:14

1

由於存在0,因此2的補碼編碼的所有數值範圍都因設計而不平衡。您可以在.NET框架中看到這一點,如int.MaxValue = 2,147,483,647,int.MinValue = -2,147,483,648。這就是Math.Abs​​(int.MinValue)拋出異常的原因。

浮點數的指數用偏移量編碼。浮點數爲8位,偏移量爲127,提供2^-126至2^127或1.18E-38至3.40E + 38(全部尾數位= 1)的範圍。對於雙倍,它是11位的偏移量爲1023,2^-1022至2^1023或2.23E-308至1.79E + 308。

通過允許浮動值爲反常規,底端的範圍進一步擴展。規範化的浮點值始終以隱式1開始,未在尾數中編碼。當一個值下降到最小可表示值以下(尾數全部爲零,編碼指數= 1),那麼指數設置爲0表示一個反常規,隱式1不再存在。最小可能的非零浮點數在尾數的最低位有1。在尾數爲23位的浮點數爲2^-23 = 1.19E-7。產生1.19E-7 * 1.18E-38 = 1.40E-45的最小可能值。 Single.Epsilon的價值

你從未真正想要接近非規範化,他們匆忙地失去了有效數字。他們真的只能幫助避免零分問題,而且價格不菲。

相關問題