答えて

8

はい。 (C#が使用しなければならないものです)IEEE754浮動小数点は、この保証:変換

  1. float保存しdoubleから正確doubleバックfloatには回復していることの変換と同じ値

  2. 正確そのオリジナルfloat

double Sのセットはfloat Sのスーパーセットです。このNaN+Infinity、および-Infinityに適用される

注意。ゼロの符号量も保存されます。

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; 
} 

このコードは(... NaN、無限大、などを除く)MinValueMaxValue間のすべてのfloat値をテストします。メモリ内のバイト表現が比較され、他の変換が行われないことが保証されます。

可能な40億の浮動小数点数をテストするのは夢中に思えるかもしれませんが、実際にはマシンで約11秒で実行されます。

はい、変換は安全です。浮動小数点から二重に変換してから元に戻っても、情報は失われません。

+1

なぜあなたがこれを投稿したのか、私は混乱しています。 –

+2

私は同意しません。それはまだ良い質問と答えです。あなた自身の質問に答えても害はありません。 – Bathsheba

関連する問題