私はC#float
を持っていますが、精度を失うことなくdouble
に変換できますか?精度を損なうことなく、ダブルを介してフロートをトリップすることはできますか?
double
がfloat
に変換された場合、まったく同じ値になりますか?
私はC#float
を持っていますが、精度を失うことなくdouble
に変換できますか?精度を損なうことなく、ダブルを介してフロートをトリップすることはできますか?
double
がfloat
に変換された場合、まったく同じ値になりますか?
はい。 (C#が使用しなければならないものです)IEEE754浮動小数点は、この保証:変換
float
保存しdouble
から正確double
バックfloat
には回復していることの変換と同じ値
正確そのオリジナルfloat
。
double
Sのセットはfloat
Sのスーパーセットです。このもが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;
}
このコードは(... NaN
、無限大、などを除く)MinValue
とMaxValue
間のすべてのfloat
値をテストします。メモリ内のバイト表現が比較され、他の変換が行われないことが保証されます。
可能な40億の浮動小数点数をテストするのは夢中に思えるかもしれませんが、実際にはマシンで約11秒で実行されます。
はい、変換は安全です。浮動小数点から二重に変換してから元に戻っても、情報は失われません。
なぜあなたがこれを投稿したのか、私は混乱しています。 –
私は同意しません。それはまだ良い質問と答えです。あなた自身の質問に答えても害はありません。 – Bathsheba