Finden Sie min / max eines Floats / Double mit der gleichen internen Darstellung

Erfrischend amGleitkommawerte (ebenfallsPDF), IEEE-754 und TeilnahmeIn dieser Diskussion zur Gleitkommarundung beim Konvertieren in Zeichenfolgen, brachte mich zum basteln: wie bekomme ich den maximalen und minimalen Wert für eine bestimmte Gleitkommazahl, deren binäre Darstellungen gleich sind.

Haftungsausschluss: Für diese Diskussion halte ich mich gerne an 32-Bit- und 64-Bit-Gleitkommazahlen, wie in IEEE-754 beschrieben. Ich interessiere mich nicht für Extended Floating Point (80 Bit) oder Quads (128 Bit IEEE-754-2008) oder andere Standards (IEEE-854).

Hintergrund: Computer können schlecht darstellen0.1 in binärer Darstellung. In C # repräsentiert ein Float dies als3DCCCCCD intern (C # verwendet Round-to-Nearest) und ein double as3FB999999999999A. Dieselben Bitmuster werden für die Dezimalzahl verwendet0.100000005 (float) und0.1000000000000000124 (doppelt), aber nicht für0.1000000000000000144 (doppelt).

Der Einfachheit halber enthält der folgende C # -Code diese internen Darstellungen:

string GetHex(float f)
{
    return BitConverter.ToUInt32(BitConverter.GetBytes(f), 0).ToString("X");
}

string GetHex(double d)
{
    return BitConverter.ToUInt64(BitConverter.GetBytes(d), 0).ToString("X");
}

// float
Console.WriteLine(GetHex(0.1F));

// double 
Console.WriteLine(GetHex(0.1));

Im Falle von0.1gibt es keine niedrigere Dezimalzahl, die mit demselben Bitmuster dargestellt wird0.99...99 ergibt eine andere Bitdarstellung (d. h. float für0.999999937 Ausbeuten3F7FFFFF im Inneren).

Meine Frage ist einfach: Wie kann ich den niedrigsten und höchsten Dezimalwert für einen bestimmten Gleitkommawert (oder Double) finden, der intern in derselben Binärdarstellung gespeichert ist?

Warum: (Ich weiß, dass Sie fragen werden), um den Fehler beim Runden in .NET zu finden, wenn es in einen String konvertiert wird und wenn es von einem String konvertiert wird, um den internen exakten Wert zu finden und meine eigenen Rundungsfehler besser zu verstehen.

Meine Vermutung ist so etwas wie: Nimm die Mantisse, entferne den Rest, ermittle den exakten Wert, ermittle ein (Mantissen-Bit) höher und berechne den Mittelwert: alles, was darunter liegt, ergibt dasselbe Bitmuster. Mein Hauptproblem ist: Wie bekomme ich den Bruchteil als Ganzzahl (Bit-Manipulation ist nicht mein größtes Kapital).Jon Skeets DoubleConverter Klasse kann hilfreich sein.

Antworten auf die Frage(2)

Ihre Antwort auf die Frage