2016-11-11 74 views

回答

8

是。 IEEE754浮點(這是C#必須使用)保證本:

  1. 轉換一個floatdouble保留完全相同相同的值

  2. 轉換是doublefloat恢復正是那原來的float

該組double s是float秒的超集。

注意這適用於NaN+Infinity-Infinity這一點。零的符號性也被保留。

6

讓我們來測試這與代碼:

[Fact] 
public void IsFloatRoundTrippableToDouble() 
{ 
    var bits = default(FloatUnion); 
    bits.FloatData = float.MinValue; 

    var testBits = default(FloatUnion); 

    // ReSharper disable once LoopVariableIsNeverChangedInsideLoop 
    while (bits.FloatData <= float.MaxValue) 
    { 
     var d = (double)bits.FloatData; 
     testBits.FloatData = (float)d; 

     if (bits.IntData != testBits.IntData) 
      Assert.True(false); 

     bits.IntData -= 1; 
    } 
} 

[StructLayout(LayoutKind.Explicit)] 
private struct FloatUnion 
{ 
    [FieldOffset(0)] public uint IntData; 
    [FieldOffset(0)] public float FloatData; 
} 

這段代碼測試MinValueMaxValue之間的每個float值(除NaN,無窮大,等...)。內存中的字節表示將進行比較以確保不會發生其他轉換。

雖然這似乎瘋狂測試約4個十億可能的浮點數,它實際上在我的機器上大約11秒運行一次。

是的,轉換是安全的。從float轉換爲double,然後再轉回不會丟失任何信息。

+1

我很困惑,爲什麼你張貼了這個,豈不是在文檔更合適? –

+2

我不同意。這仍然是一個很好的問題和答案。回答你自己的問題並沒有什麼壞處。 – Bathsheba