2015-01-16 56 views
1

我需要保存UInt32,Int32和float值在一個變量中。我可以在不丟失信息的情況下使用double(例如,在轉換中丟失一些數字),還是我需要使用任意精度類?我可以在不丟失信息的情況下在雙精度內存儲UInt32,Int32和float值嗎?

從我目前的研究看來我可以,我可以存儲UInt32的最大值沒有鬆動的信息:

Assert.AreEqual(UInt32.MaxValue, Convert.ToUInt32(Convert.ToDouble(UInt32.MaxValue))); 
  • 因此雙應支持足夠的數字來表示所有的數字小於或等於UInt32的.MaxValue。
  • Int32無論如何都有一個較小的值範圍,所以它也被支持。
  • 浮點數也應該被支持,因爲它只是加倍而精度較低。

有什麼我錯過了嗎?

+0

那麼,你可以將它們存儲在['Decimal'](http://msdn.microsoft.com/en-us/library/system.decimal。aspx):「這種類型提供了將Decimal值轉換爲SByte,Int16,Int32,Int64,Byte,UInt16,UInt32和UInt64值的方法,將這些整型轉換爲Decimal可以擴大轉換範圍,從而不會丟失信息或拋出異常「。 – Brian

回答

11

能夠存儲的UInt32最大值,而不會丟失信息,並不意味着你就可以存儲在所有UInt32不會丟失信息 - 畢竟,有很多long值的其中存儲在double中,即使一些較小的值不能。 (2 可以很容易地被精確地存儲在double,但2 - 1不能,例如。)

但是,好 - the mantissa for double is 52-bits long,所以具有少於52的任何整數位可以簡單地存儲爲值* 2 (即,0的有效比例)。

是的,float值可以轉換爲double而不會損失精度。

但是,請注意,這並不意味着0.1f == 0.1d例如 - 它只是意味着(double) 0.1f是與0.1f完全相同的數字,具有不同的表示形式。

另外值得一提的是,Int32沒有一個較小的範圍比UInt32 - 他們都有一個範圍正好2 連續值。然而,Int32確實具有較小的「絕對」值,並且以符號表示爲浮點值的方式,這是相關的。由於Int32.MinValue爲-10000 ... 0000(二進制)(總共32位),或 - (2 + 1),您實際上仍然需要32位來存儲每個Int32的絕對值。

最後,float不只是double精度較低 - 它也有一個較小的範圍。它只有8位指數,而在double中只有11位。所以在double範圍內的數字都在float範圍之外,即使它們沒有很多重要的(二進制)數字。

+0

「任何少於52位的整數可以平均存儲爲值* 2^0」 這部分答案略有誤導,因爲尾數部分不存儲整數,而是存儲1和2之間的二進制小數。確實需要使用非零指數來將點移動到以浮點表示整數時的正確位置。 –

+0

@JoanCharmant:考慮一個整數或二進制小數只是一個不同視角的問題。我覺得把它看作一個整數更簡單一些;因人而異。我當然認爲,將整數結果看作整數0的整數值比縮放的二進制小數更簡單 - 這就是爲什麼我將它作爲*有效*尺度進行討論的原因。指數的位模式以及歸一化的細節在這裏是無關緊要的,除了在計算不能精確表示整數的*精確*點時。 –

相關問題