我正在執行一些數據類型轉換,我需要將uint
,long
,ulong
和decimal
表示爲IEEE 754雙浮點值。我希望能夠在執行轉換之前檢測IEEE 754數據類型是否不能包含該值。如何測試數值轉換是否會改變數值?
一個蠻力解決方案將圍繞一個演員包裹試試抓,以加倍尋找OverflowException
。通過CLR documentation中的某些內容進行閱讀意味着某些轉換隻是在無任何例外的情況下默默改變了該值。
有沒有任何傻瓜證明的方式來做這個檢查?我正在尋求完整性,以便於實施。我有一種感覺,我會仔細閱讀IEEE 754規範並仔細檢查matissa和指數...
我應該補充說,我是大多數與準確表示整數有關,並且浮動損失點精度是次要問題(但仍值得考慮)。
編輯: Int32能夠完全表示爲IEE-754。此外,Decimal
數據類型也是問題的一部分。
重要更新:如果你指的是這個問題,你也應該看這個問題:IEEE-754 Double (64-bit floating point) vs. Long (64-bit Integer) Revisited
它指出在回答一個缺陷,其中一些非常大的價值,也能夠通過IEEE準確表示-754。雖然這可能意味着該值將正確往返,爲我的原始目的(它是否會往返JavaScript)它不會。
此外,似乎CLRs System.Double類型中存在一個錯誤,因爲它沒有正確地允許這些值往返。
如果您想避免溢出,您可以在轉換之前檢查您的值是否在目標類型的MinValue和MaxValue內。如果你想避免精度問題,不要使用浮點數。 – Guillaume 2009-10-21 15:38:50