閱讀MSDN,浮動範圍從1E-45到1E38,雙倍範圍從1E-324到1E308,我想知道爲什麼它對負指數和正指數是不對稱的?對於float和double,爲什麼它對於負數和正數是不對稱的?
回答
您的困惑源自於認爲「1E-45」是負數。它不是 - 它實際上是一個非常小的正數:1 x 10^-45或更確切地說,0.000 ... 0001 - 它在「0」之間有44「0」。和「1」這表示浮點可以存儲的最小精度單位(或者類似 - 其他人鏈接的文章將詳細解釋,如果需要知道的話)。
另一個數字「1E38」表示可存儲在此數據類型中的最大數字。這是1×10^38,或者說是10000 ... 0000,即1和38之後的0。
這是由於定義了兩者的編碼的IEEE 754標準(float & double)。 當你瞭解它的工作原理時,這並不奇怪。
閱讀文章可能足以理解它。
對於32位編碼的單精度(浮點),請閱讀:http://en.wikipedia.org/wiki/Single_precision
雙精度(雙)編碼的64位,讀:http://en.wikipedia.org/wiki/Double_precision
良好的閱讀
我想你一定看錯了地方。我在看的文件表明,他們是對稱的預期
http://msdn.microsoft.com/en-us/library/system.double.minvalue.aspx
皮草雙,這是正到負...
1.7976931348623157E + 308。
我認爲他指的是:http://msdn.microsoft.com/en-us/library/678hzkk9.aspx – Magnus 2012-01-28 10:32:42
它們不是正數和負數 - 它們是正數和負數指數。區別歸因於規範化工作的方式,基本上。由於denormal numbers和指數偏差,您最終可以存儲「較小」的數字。
最終,你基本上不需要擔心 - 但你做需要明白,正面和負面的數字範圍是一樣的(這只是一個符號位)。
任何關心浮點精度的人都應該非常擔心非規範問題。他們吃早餐有效數字。 – 2012-01-28 11:36:59
@HansPassant:真的 - 但是在你沒有意識到*值*是積極的和消極的差異和*指數*積極和消極的階段,這是值得等待一段時間,然後擔心:) – 2012-01-28 11:39:14
由於存在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的價值
你從未真正想要接近非規範化,他們匆忙地失去了有效數字。他們真的只能幫助避免零分問題,而且價格不菲。
- 1. 什麼是HashMap和ArrayList,它們對於什麼有用?
- 2. Android:對於嵌套視圖,什麼是getX()和gety()相對於?
- 3. int *和double **對於C函數參數外的元素有什麼意義?
- 4. 對於/:'_io.TextIOWrapper'和'float'不支持的操作數類型
- 5. 小數對於負PHP值
- 6. 對於暱稱,「ContactsContract.CommonDataKinds.Nickname.CONTENT_ITEM_TYPE」是什麼意思?
- 7. 對於負數,%05d等同於std :: stringstream?
- 8. 對於in和for each循環不適用於對象數組
- 9. 基於具有負數和正數的列對數據框排序
- 10. 用於float的正則表達式允許負數和單數。和 -
- 11. 對於一個對象數組,typecript定義是什麼樣的?
- 12. 爲什麼Float和Double在添加0.1和0.2時不同?
- 13. double和float數據類型的行爲
- 14. 爲什麼empty()對於變量和數組偏移的行爲有所不同?
- 15. 爲什麼isscalar,isvector和ismatrix對於A = 1都是真的?
- 16. 爲什麼event.bubbles對於「focusin」和「focusout」是錯誤的?
- 17. 是否有像「int」或「float」的函數,但對於素數?
- 18. Symfony3,對於Doctrine \ ORM \ EntityRepository :: __ construct()缺少參數1,爲什麼和爲什麼
- 19. 位數float和double變量
- 20. 爲什麼num_get和num_put是不對稱的?
- 21. INT_SIZE_LENGTH對於itow()是20,爲什麼?
- 22. 爲什麼System.Windows.FrameworkElement對於寬度和高度等屬性使用double類型?
- 23. 在mysql中,爲什麼M對於float類型必須> = D
- 24. 對於數據庫,什麼是「恢復」?什麼是'恢復'?
- 25. 爲什麼數據結構對齊對於性能很重要?
- 26. 爲什麼對象大於/小於或等於不同的對象?
- 27. 什麼是數組和對象
- 28. enCapsa - 它是什麼和用於什麼?
- 29. 對於i的複雜性是什麼:對於o = i + 1
- 30. Float,Double,Char,C++錯誤。哪裏不對?
現在,漢斯Passant已經編輯了這個問題來指代+ ve和-ve指數,而不是+ ve和-ve數字,他的回答是一個正確和完整的解釋。 – perfectionist 2012-01-28 17:38:48