浮球可以通过双摆而不会失去精度?
答
是。 IEEE754浮点(这是C#必须使用)保证本:
转换一个
float
到double
保留完全相同相同的值转换是
double
回float
恢复正是那原来的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;
}
这段代码测试MinValue
和MaxValue
之间的每个float
值(除NaN
,无穷大,等...)。内存中的字节表示将进行比较以确保不会发生其他转换。
虽然这似乎疯狂测试约4个十亿可能的浮点数,它实际上在我的机器上大约11秒运行一次。
是的,转换是安全的。从float转换为double,然后再转回不会丢失任何信息。
我很困惑,为什么你张贴了这个,岂不是在文档更合适? –
我不同意。这仍然是一个很好的问题和答案。回答你自己的问题并没有什么坏处。 – Bathsheba