In der Informatik ist IEEE 754 ein Standard für Gleitkomma- Arithmetik, der vom Institut für Elektrotechnik- und Elektronikingenieure entwickelt wurde . Es ist derzeit der am weitesten verbreitete Standard zur Berechnung von Gleitkommazahlen mit CPUs und FPUs . Der Standard definiert die Formate für die Darstellung von Gleitkommazahlen ( Vorzeichen , Mantisse , Exponent , denormalisierte Zahlen ) und Sonderwerten ( unendlich und NaN ) sowie eine Reihe von Gleitkommaoperationen. Außerdem werden fünf Rundungsmodi und fünf Ausnahmen beschrieben (einschließlich der Bedingungen, unter denen eine Ausnahme auftritt, und was in diesem Fall geschieht).
Die ursprüngliche Version von IEEE 754 aus dem Jahr 1985 definierte vier Formate zur Darstellung von Gleitkommazahlen der Basis 2:
In der Sprache C verwendet der gcc- Compiler für 32-Bit-Intel-kompatible Architekturen beispielsweise das Format einfache Genauigkeit für Variablen vom Typ float , doppelte Genauigkeit für Variablen vom Typ double und doppelte Genauigkeit oder erweiterte doppelte Genauigkeit (nach dem Betriebssystem). für lange Doppelvariablen . Wenn die SSE2-Erweiterung jedoch nicht verwendet wird, werden alle Berechnungen abhängig von der Einstellung der dynamischen Genauigkeit des Prozessors auf dieselbe Genauigkeit gerundet (normalerweise doppelte Genauigkeit oder erweiterte doppelte Genauigkeit, abhängig vom Betriebssystem, den Kompilierungsoptionen und den von vorgenommenen Änderungen Programme).
Der vollständige Titel des Standards lautete IEEE-Standard für binäre Gleitkomma-Arithmetik (ANSI / IEEE Std 754-1985 ). Es ist auch unter dem Namen IEC 60559: 1989, Binäre Gleitkomma-Arithmetik für Mikroprozessorsysteme, bekannt , was es auch zu einer (amerikanischen) Norm macht, da es in mehreren internationalen ISO-Normen als normative Referenz zugelassen ist. Dieser Standard wurde jedoch 2008 durch eine umfassende Überarbeitung auf andere Grundformate (binär auf 128 Bit und Dezimalstellen auf 64 und 128 Bit) sowie auf Austauschformate (Hinzufügen von Formaten, die entweder weniger genau oder präziser sind) und erweiterte Formate (erweitert) erweitert. Verallgemeinerung des Standards von 1985 mit mehr Freiheit bei Präzision und Codierung als bei Austauschformaten); Diese Überarbeitung enthält auch zusätzliche Rundungsmodi und strengere Konformitätsanforderungen hinsichtlich der erwarteten Genauigkeit grundlegender transzendentaler Funktionsberechnungen und -operationen. Dieser Standard wurde auch 2019 überarbeitet.
In einem Wort der Länge W werden die Bits von 0 bis einschließlich W - 1 indiziert. Bit 0 befindet sich rechts und stellt das niedrigstwertige Bit dar (dh das Einheitenbit, das bei Änderung die kleinste Abweichung verursacht).
Eine Gleitkommazahl besteht aus drei Elementen: der Mantisse , dem Exponenten und dem Vorzeichen. Das höchstwertige Bit ist das Vorzeichenbit : Wenn dieses Bit bei 1 liegt, ist die Zahl negativ, und wenn es bei 0 liegt, ist die Zahl positiv. Die nächsten e Bits repräsentieren den vorgespannten Exponenten (mit Ausnahme des Sonderwerts), und die nächsten m Bits ( m niedrigstwertige Bits) repräsentieren die Mantisse.
Schild | Vorspannungsexponent | Mantisse |
(1 Bit) | ( e Bits) | ( m Bits) |
Der Exponent kann positiv oder negativ sein. Die übliche Darstellung von vorzeichenbehafteten Zahlen ( 2er-Komplement ) würde den Vergleich zwischen Gleitkommazahlen jedoch etwas erschweren. Um dieses Problem zu lösen, wird der Exponent "verzerrt", um ihn als vorzeichenlose Zahl zu speichern.
Diese Vorspannung ist 2 e -1 - 1 ( e stellt die Anzahl der Bits im Exponenten); es ist daher ein konstanter Wert, sobald die Anzahl der Bits e festgelegt ist.
Die Interpretation einer Zahl (außer unendlich) lautet daher: Wert = Vorzeichen × Mantisse × 2 ( Exponent - Bias ) mit
Das höchstwertige Bit der Mantisse wird durch den Wert des vorgespannten Exponenten bestimmt. Wenn sich der vorgespannte Exponent von 0 und von unterscheidet , ist das höchstwertige Bit der Mantisse 1, und die Zahl wird als "normalisiert" bezeichnet. Wenn der vorgespannte Exponent Null ist, ist das höchstwertige Bit der Mantisse Null und die Zahl wird denormalisiert .
Es gibt drei Sonderfälle:
Wir können es wie folgt zusammenfassen:
Art | Vorspannungsexponent | Mantisse |
---|---|---|
Nullen | 0 | 0 |
Denormalisierte Zahlen | 0 | anders als 0 |
Normalisierte Zahlen | beim | irgendein |
Unendlich | 0 | |
NaNs | anders als 0 |
Eine Gleitkommazahl mit einfacher Genauigkeit wird in einem 32-Bit- Wort gespeichert : 1 Vorzeichenbit, 8 Bit für den Exponenten und 23 für die Mantisse.
Der Exponent ist daher in diesem Fall vorgespannt . Der Exponent einer normalisierten Zahl geht daher von -126 auf +127. Der Exponent -127 (der auf den Wert 0 vorgespannt ist) ist für Null und denormalisierte Zahlen reserviert, während der Exponent 128 (auf 255 vorgespannt) für die Codierung von Unendlichkeiten und NaNs reserviert ist (siehe vorherige Tabelle).
Eine normalisierte Gleitkommazahl hat einen Wert v , der durch die folgende Formel gegeben ist:
v = s × 2 e × m .Zum Beispiel für 0b 0 01111100 01000000000000000000000: Das Vorzeichen ist positiv, der Exponent ist 124 - 127 = –3 und der signifikante Teil ist 0b 1,01, d. H. 1,25 in Dezimalzahl (1 × 2 0 + 0 × 2 –1 + 1 × 2 - 2 ); Die dargestellte Zahl ist daher +1,25 × 2 –3 oder +0,15625.
Die denormalisierten Zahlen folgen demselben Prinzip, außer dass e = –126 und m = 0+ Mantisse sind (Anmerkung: Für die Berechnung wird darauf geachtet, e = –126 und nicht –127 zu verwenden, um die Kontinuität dieser zu gewährleisten Darstellung mit der normalisierten Darstellung, da m = 0+ Mantisse und nicht mehr m = 1+ Mantisse ).
Anmerkungen:
In der folgenden Tabelle ist der vorherige Teil mit Beispielen für 32-Bit-Zahlen mit einfacher Genauigkeit zusammengefasst.
Art | Aussteller | Mantisse | Ungefährer Wert | Abweichung / prev |
---|---|---|---|---|
Null | 0000 0000 | 000 0000 0000 0000 0000 0000 | 0.0 | |
Kleinste denormalisierte Zahl | 0000 0000 | 000 0000 0000 0000 0000 0001 | 1,4 × 10 –45 | 1,4 × 10 –45 |
Nächste denormalisierte Zahl | 0000 0000 | 000 0000 0000 0000 0000 0010 | 2,8 × 10 –45 | 1,4 × 10 –45 |
Nächste denormalisierte Zahl | 0000 0000 | 000 0000 0000 0000 0000 0011 | 4,2 × 10 –45 | 1,4 × 10 –45 |
Andere denormalisierte Zahl | 0000 0000 | 100 0000 0000 0000 0000 0000 | 5,9 × 10 –39 | |
Größte denormalisierte Zahl | 0000 0000 | 111 1111 1111 1111 1111 1111 | 1,175 494 21 × 10 –38 | |
Kleinste standardisierte Nummer | 0000 0001 | 000 0000 0000 0000 0000 0000 | 1,175 494 35 × 10 –38 | 1,4 × 10 –45 |
Nächste standardisierte Nummer | 0000 0001 | 000 0000 0000 0000 0000 0001 | 1,175 494 49 × 10 –38 | 1,4 × 10 –45 |
Fast doppelt so hoch | 0000 0001 | 111 1111 1111 1111 1111 1111 | 2,350 988 56 × 10 –38 | 1,4 × 10 –45 |
Nächste standardisierte Nummer | 0000 0010 | 000 0000 0000 0000 0000 0000 | 2,350 988 70 × 10 –38 | 1,4 × 10 –45 |
Nächste standardisierte Nummer | 0000 0010 | 000 0000 0000 0000 0000 0001 | 2,350 988 98 × 10 –38 | 2,8 × 10 –45 |
Fast 1 | 0111 1110 | 111 1111 1111 1111 1111 1111 | 0,999 999 94 | 0,6 × 10 –7 |
1 | 0111 1111 | 000 0000 0000 0000 0000 0000 | 1.000.000 00 | |
Nächste Nummer 1 | 0111 1111 | 000 0000 0000 0000 0000 0001 | 1.000.000 12 | 1,2 × 10 –7 |
Fast die größte Anzahl | 1111 1110 | 111 1111 1111 1111 1111 1110 | 3,402 823 26 × 10 38 | |
Größte standardisierte Anzahl | 1111 1110 | 111 1111 1111 1111 1111 1111 | 3,402 823 46 × 10 38 | 2 × 10 31 |
Unendlich | 1111 1111 | 000 0000 0000 0000 0000 0000 | Unendlich | |
Erster (denormalisierter) Wert der Warnung NaN | 1111 1111 | 000 0000 0000 0000 0000 0001 | Nee | |
Normalisiertes NaN (Alarm) | 1111 1111 | 010 0000 0000 0000 0000 0000 | Nee | |
Letzter (denormalisierter) Wert der Warnung NaN | 1111 1111 | 011 1111 1111 1111 1111 1111 | Nee | |
Erster (denormalisierter) Wert von stillem NaN | 1111 1111 | 100 0000 0000 0000 0000 0000 | Nee | |
Letzter (denormalisierter) Wert von stillem NaN | 1111 1111 | 111 1111 1111 1111 1111 1111 | Nee |
Anmerkungen:
Codieren wir die Dezimalzahl −118.625 mithilfe des IEEE 754-Mechanismus.
Wir haben daher –118,625 (dec) = 1100 0010 1110 1101 0100 0000 0000 0000 (bin) = C2ED4000 (hexa).
Das Format mit doppelter Genauigkeit entspricht dem Format mit einfacher Genauigkeit, außer dass die Felder größer sind. In der Tat hat es 52 Mantissenbits anstelle von nur 23 und 11 Exponentenbits anstelle von nur 8.
Die Mantisse ist sehr breit, während der Exponent nicht sehr breit ist. Dies liegt daran, dass nach Ansicht der Entwickler des Standards Präzision wichtiger ist als Amplitude.
Die NaNs und die Unendlichkeiten werden dargestellt, indem alle Bits des Exponenten auf 1 (2047) gesetzt werden, aber durch Setzen aller 52 Bits der Mantisse auf 0 für die Infiniten und mindestens eines dieser 52 Bits auf 1 für die Nö .
Für normalisierte Zahlen beträgt die Exponentenvorspannung +1023. Für denormalisierte Zahlen ist der Exponent –1022 (der minimale Exponent für eine normalisierte Zahl). Es ist nicht −1023, da normalisierte Zahlen eine 1 vor dem Dezimalpunkt haben und denormalisierte Zahlen nicht. Nach wie vor sind Null und Unendlich vorzeichenbehaftet.
Anmerkungen:
Im Allgemeinen ist es am besten, Gleitkommazahlen mithilfe der Anweisungen zur Gleitkommaberechnung zu vergleichen. Diese Darstellung ermöglicht jedoch byteweise Vergleiche bestimmter Teilmengen, wenn sie dieselbe Bytereihenfolge und dasselbe Vorzeichen haben und die NaNs ausgeschlossen sind.
Beispielsweise ergibt der Vergleich zwischen a und b (>, <oder ==) für zwei positive Gleitkommazahlen a und b die gleichen Ergebnisse wie der Vergleich zweier vorzeichenbehafteter (oder vorzeichenloser) Zahlen mit denselben Bits wie a und b. Mit anderen Worten können zwei positive Gleitkommazahlen (die keine NaNs sind) mit einem vorzeichenbehafteten (oder vorzeichenlosen) binären Vergleich verglichen werden. Aufgrund des Problems mit der Bytereihenfolge kann dieser Vergleich nicht in portablem Code verwendet werden.
Der IEEE-Standard legt 5 Rundungsmodi fest:
Im Juni 2008Eine umfassende Überarbeitung der Standards IEEE 754 und IEEE 854 wurde vom IEEE genehmigt. Siehe: IEEE 754-2008 (de) .
Diese Überarbeitung bringt neue Basis 2- und Basis 10-Formate und gibt die Darstellung der Basis 10-Formate (zusätzlich zu Basis 2) an.
Es normalisiert auch eine totale Ordnung Beziehung für jeden der numerischen Datentypen normalisiert, die üblichen Ordnungsrelationen Ergänzung , die nur teilweise sind; in der Tat ist die Beziehung normaler Ordnung nur dann total, wenn der negative Nullwert (normalerweise als gleich dem positiven Nullwert verglichen) und alle NaN-Werte (die weder gleich noch überlegen sind) aus dem Wertesatz entfernt werden jedem anderen unterlegen, nicht einmal sich selbst).
Andererseits lässt diese Überarbeitung die Flexibilität der Darstellung und mögliche Unterscheidung der NaN-Werte (die Position und der Wert der Warnbits im Mantissenfeld sind nicht standardisiert, und die Verwendung der anderen Bits von Das Mantissenfeld oder das Vorzeichen eines NaN-Werts zum Codieren eines Fehlers bleibt abhängig von der Architektur oder den Anwendungen.
Eine neue Überarbeitung wurde in genehmigt Juli 2019.