Ein Double-Wert wird intern in 2 Teilen gespeichert. Die Teile nennen sich Mantisse und Exponent. Die Mantisse enthält die einzelnen 'Ziffern'. Der Exponent gibt an, um wie viele Stellen die Werte verschoben werden sollen.
Dieses Snippet gibt diese beiden Teile eines Double's zurück.
Wenn man die ermittelten Werte manuell überprüft, muss man beachten das die Ziffern im Binärsystem verschoben werden müssen. Getestet habe ich den Code über einen Unittest:
#region Test_Int64_GetSegments
[TestMethod]
public void Test_Int64_GetSegments()
{
double[] doubles = new double[] { 0, 96, 10, 10000000, 1111111111, 1.1, -3, -33,
-333, -3333, 3333, 33333333, -33333333333, 98765432109876543210987654321098D,
-98765432109876543210987654321098D, 0.00000000001, -0.00000000001,double.MaxValue, double.MinValue };
foreach (var d in doubles)
Check_Int64_GetSegments(d);//, 0, null);
}
#endregion
void Check_Int64_GetSegments(double d)
{
long m = 0;
int e = 0;
d.GetSegments(out m, out e);
Assert.AreEqual(m * Math.Pow(2, e), d, Math.Abs(d / 13/*13 Stellen*/));
}
Hinweis: Die Methode ist als Erweiterung für den Typ Double implementiert.