2016-11-11 52 views

cevap

8

Evet. (C# kullanmalısınız budur) IEEE-754 kayan nokta bu garanti: dönüştürme

  1. bir float korur double a tamdouble geri float bir geri kazandığı dönüştürme aynı değeri

  2. tam o orijinal float.

double s grubu float s kümesidir. Bu daNaN, +Infinity ve -Infinity için geçerlidir

Not. Sıfırın imzası da korunur.

6

edelim testi bu:

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

Bu kod (NaN, sonsuzlukları, vb ... hariç) MinValue ve MaxValue arasında her float değerini test eder. Bellek içi bayt temsili, başka hiçbir dönüşümün gerçekleşmediğinden emin olmak için karşılaştırılır.

~ 4 milyar olası kayan nokta sayısını test etmek delice görünebilir olsa da, aslında makinemde yaklaşık 11 saniyede çalışır.

Ve evet, dönüşüm güvenlidir. Kayan noktadan iki katına, daha sonra tekrar geri dönüştürmek herhangi bir bilgiyi kaybetmez.

+1

Bunu neden yayınladığınız konusunda kafam karıştı, belgelere daha uygun olmaz mı? –

+2

Katılmıyorum. Bu hala iyi bir soru ve cevap. Kendi sorunuzu cevaplarken hiçbir zararı yoktur. – Bathsheba

İlgili konular