如果我有一个 C# 的 float
,我是否可以将其转换为 double
而不会丢失任何精度?
如果那个 double
再被转换回 float
,它的值是否完全相同?
如果我有一个 C# 的 float
,我是否可以将其转换为 double
而不会丢失任何精度?
如果那个 double
再被转换回 float
,它的值是否完全相同?
将 float
转换为 double
会完全保留相同的值。
将该 double
转换回 float
可以精确地恢复原始的 float
。
double
的集合是 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;
}
MinValue
和MaxValue
之间的每个float
值(除了NaN
,无穷大等)。比较它们在内存中的字节表示以确保不进行其他转换。
虽然测试约40亿个可能的浮点数看起来很疯狂,但实际上在我的机器上只需大约11秒。
而且,该转换是安全的。从float
到double
再转回来不会丢失任何信息。