it-swarm.com.de

Wie werden Min / Max-Werte von Gleitkommazahlen berechnet?

Ich versuche, den minimalen/maximalen oder den niedrigsten bis höchsten Wertebereich eines 48-Bit-Gleitkomma-Typs MIL-STD-1750A zu berechnen (PDF)(WIKI) .

Beispiel: Wie ein doppelter Bereich 1,7E +/- 308 ist

Ich habe mich nach Gleichungen umgesehen und bin mir nicht sicher, ob das, was ich gefunden habe, funktionieren wird.

Die erste Gleichung, die ich fand, war first equation

Der zweite war second equation

Ich bin mir nicht ganz sicher, wo ich damit anfangen soll, wenn sie überhaupt richtig sind, was ich brauche.

Wird mir jemand sein Wissen vermitteln und helfen, dieses zu lösen?

8
CodeMonkey

Für 32-Bit-Gleitkommawerte ist der Maximalwert in Tabelle III angegeben:

0.9999998 x 2^127 represented in hex as: mantissa=7FFFFF, exponent=7F.

Wir können die Mantisse/den Exponenten wie folgt in einen (engen) Dezimalwert zerlegen:

7FFFFF <base-16> = 8,388,607 <base-10>. 

Es gibt 23 Bits von Bedeutung, also teilen wir 8.388.607 durch 2 ^ 23.

8,388,607 / 2^23 = 0.99999988079071044921875 (see Table III)

soweit der Exponent:

7F <base-16> = 127 <base-10>

und jetzt multiplizieren wir die Mantisse mit 2 ^ 127 (dem Exponenten)

8,388,607 / 2^23 * 2^127 = 
8,388,607 * 2^104 = 1.7014116317805962808001687976863 * 10^38

Dies ist der größte 32-Bit-Gleitkommawert, da die größte Mantisse und der größte Exponent verwendet werden.

Der 48-Bit-Gleitkomma addiert 16 Bit Mantisse mit geringerer Signifikanz, lässt den Exponenten jedoch gleich groß. Somit würde der Maximalwert in hex als dargestellt

mansissa=7FFFFFFFFF, exponent=7F.

wieder können wir berechnen

7FFFFFFFFF <base-16> = 549,755,813,887 <base-10> 

der maximale Exponent ist immer noch 127, aber wir müssen durch [23 + 16 = 39 teilen, also:] 2 ^ 39. 127-39 = 88, also einfach mit 2 ^ 88 multiplizieren:

549,755,813,887 * 2^88 =
1.7014118346015974672186595864716 * 10^38

Dies ist der größte 48-Bit-Gleitkommawert, da wir die größtmögliche Mantisse und den größtmöglichen Exponenten verwendet haben.

Die Maximalwerte sind also:

1.7014116317805962808001687976863 * 10^38, for 32-bit, and,
1.7014118346015974672186595864716 * 10^38, for 48-bit

Der Maximalwert für 48-Bit ist nur geringfügig größer als für 32-Bit, was naheliegend ist, da am Ende der Mantisse einige Bits hinzugefügt werden.

(Um genau zu sein, kann die maximale Anzahl für das 48-Bit-Format als Binärzahl ausgedrückt werden, die aus 39 Einsen gefolgt von 88 Nullen besteht.)

(Das kleinste ist nur das Negative dieses Wertes. Das dem Null am nächsten liegende, ohne Null zu sein, kann auch leicht wie oben berechnet werden: Verwenden Sie die kleinstmögliche (positive) Mantisse: 0000001 und den kleinstmöglichen Exponenten: 80 in hex oder -128 in Dezimalzahl)


Zu Ihrer Information

Einige Gleitkommaformate verwenden ein nicht dargestelltes verstecktes 1 Bit in der Mantisse (dies ermöglicht ein zusätzliches Bit an Genauigkeit in der Mantisse wie folgt: Die erste Binärziffer aller Zahlen (außer 0 oder Denormals, siehe unten) ist ein 1, deshalb müssen wir das nicht speichern 1, und wir haben ein bisschen mehr Präzision). Dieses spezielle Format scheint dies nicht zu tun.

Andere Gleitkommaformate ermöglichen eine denormalisierte Mantisse, die es ermöglicht, (positive) Zahlen darzustellen, die kleiner als der kleinste Exponent sind, indem Präzisionsbits gegen zusätzliche (negative) Potenzen von 2 eingetauscht werden. Dies ist einfach zu unterstützen, wenn nicht auch das verborgene Bit unterstützt wird , ein bisschen schwieriger, wenn es tut.


8,388,607/2 ^ 23 ist der Wert, den Sie mit mantissa = 0x7FFFFF und exponent = 0x00 erhalten würden. Es ist nicht der Einzelbitwert, sondern der Wert mit einer voll Mantisse und einer neutralen oder genauer gesagt einer Null Exponent.

Der Grund, warum dieser Wert nicht direkt 8388607 ist und eine Division erfordert (durch 2 ^ 23 und daher geringer als erwartet), ist, dass der implizite Radixpunkt) befindet sich in front der Mantisse und nicht nach it. Also, denke +/-.111111111111111111111 (ein Vorzeichenbit, gefolgt von einem Radixpunkt, gefolgt von dreiundzwanzig 1-Bits) für die Mantisse und +/- 111111111111 (hier kein Radixpunkt, nur eine ganze Zahl, in diesem Fall 127) für den Exponenten.

mantisse = 0x7FFFFF mit Exponent = 0x7F ist der größte Wert, der 8388607 * 2 ^ 104 entspricht, wobei die 104 von 127-23 stammt: wiederum 23 Potenzen von zwei subtrahieren, da die Mantisse am Anfang den Radixpunkt hat. Wenn der Radixpunkt am Ende wäre, wäre der größte Wert (0x7FFFFF, 0x7F) tatsächlich 8.388.607 * 2 ^ 127.

Unter anderem gibt es Möglichkeiten, einen einzelnen Bitwert für die Mantisse zu berücksichtigen. Eine ist Mantisse = 0x400000 und die andere ist Mantisse = 0x000001. Ohne Berücksichtigung des Radixpunkts oder des Exponenten beträgt der erstere 4.194.304 und der letztere 1. Bei einem Exponenten von Null und unter Berücksichtigung des Radixpunkts beträgt der erstere 0,5 (dezimal) und der letztere 0,00000011920928955078125. Mit einem maximalen (oder minimalen) Exponenten können wir maximale und minimale Einzelbitwerte berechnen.

(Beachten Sie, dass das letztere Format, in dem die Mantisse führende Nullen hat, in einigen Zahlenformaten als denormalisiert betrachtet wird und seine normalisierte Darstellung 0x400000 mit einem Exponenten von -23 ist.).

8
Erik Eidt

Sie können ausleihen, wie der IEEE-Gleitkomma für einen schnellen Vergleich ausgelegt ist: Vorzeichen, Exponent, Mantisse. jedoch darin PDF Ich sehe, dass Mantisse und Exponent umgekehrt sind.

Dies bedeutet, dass Sie zum Vergleichen zuerst das Vorzeichenbit überprüfen müssen. Wenn einer noch nicht der Gewinner ist, vergleichen Sie die Exponenten und dann die Mantisse.

Wenn einer positiv und der andere negativ ist, ist der positive Wert der max.

Wenn beide positiv sind und ein Exponent größer ist, ist es das Maximum (wenn beide negativ sind, ist es das Minimum)

Ähnliches gilt für Mantisse.

1
ratchet freak