可以通过双重浮动而不会丢失精度吗?

Dre*_*kes 5 .net c# floating-point precision floating-point-conversion

如果我有一个C#float,我可以将其转换为double不丢失任何精度吗?

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

Bat*_*eba 8

是.IEEE754浮点(这是C#必须使用的)保证了这一点:

  1. 将a转换floatdouble保留完全相同的值

  2. 转换是double回到float复苏究竟是原来的float.

doubles 的集合是s的超集float.

请注意,这适用于NaN,+Infinity-Infinity.零的签名也被保留.


Dre*_*kes 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;
}
Run Code Online (Sandbox Code Playgroud)

此代码测试和float之间的每个值(除了无穷大等...).比较内存中的字节表示以确保不会发生其他转换.MinValueMaxValueNaN

虽然测试大约40亿个可能的浮点数似乎很疯狂,但它实际上在我的机器上运行大约11秒.

是的,转换是安全的.从float转换为double,然后再转回,不会丢失任何信息.

  • 我不同意.这仍然是一个很好的问题,并回答.回答你自己的问题没有坏处. (2认同)