Bir C# float
varsa, herhangi bir kesinlik kaybı olmadan double
'a dönüştürebilir miyim?Hassasiyetini kaybetmeden, ikiye katlanabilir mi?
Bu double
, float
'a dönüştürülmüşse, tam olarak aynı değere sahip olur mu? koduyla
Bir C# float
varsa, herhangi bir kesinlik kaybı olmadan double
'a dönüştürebilir miyim?Hassasiyetini kaybetmeden, ikiye katlanabilir mi?
Bu double
, float
'a dönüştürülmüşse, tam olarak aynı değere sahip olur mu? koduyla
Evet. (C# kullanmalısınız budur) IEEE-754 kayan nokta bu garanti: dönüştürme
bir float
korur double
a tamdouble
geri float
bir geri kazandığı dönüştürme aynı değeri
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.
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.
Bunu neden yayınladığınız konusunda kafam karıştı, belgelere daha uygun olmaz mı? –
Katılmıyorum. Bu hala iyi bir soru ve cevap. Kendi sorunuzu cevaplarken hiçbir zararı yoktur. – Bathsheba