浮球可以通过双摆而不会失去精度?

问题描述:

如果我有一个C#float,我可以将其转换为double没有丢失任何细节?浮球可以通过双摆而不会失去精度?

如果double转换回float,它会有完全相同的值吗?

是。 IEEE754浮点(这是C#必须使用)保证本:

  1. 转换一个floatdouble保留完全相同相同的值

  2. 转换是doublefloat恢复正是那原来的float

该组double s是float秒的超集。

注意这适用于NaN+Infinity-Infinity这一点。零的符号性也被保留。

让我们来测试这与代码:

[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