Dre*_*kes 5 .net c# floating-point precision floating-point-conversion
如果我有一个C#float,我可以将其转换为double不丢失任何精度吗?
如果double转换回来float,它会有完全相同的值吗?
是.IEEE754浮点(这是C#必须使用的)保证了这一点:
将a转换float为double保留完全相同的值
转换是double回到float复苏究竟是原来的float.
doubles 的集合是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;
}
Run Code Online (Sandbox Code Playgroud)
此代码测试和float之间的每个值(除了无穷大等...).比较内存中的字节表示以确保不会发生其他转换.MinValueMaxValueNaN
虽然测试大约40亿个可能的浮点数似乎很疯狂,但它实际上在我的机器上运行大约11秒.
是的,转换是安全的.从float转换为double,然后再转回,不会丢失任何信息.