Loading AI tools
Norm für die Repräsentation von Binärzahlen in Computersystemen Aus Wikipedia, der freien Enzyklopädie
Die Norm IEEE 754 definiert Standarddarstellungen für binäre und dezimale Gleitkommazahlen in Computern und legt genaue Verfahren für die Durchführung mathematischer Operationen, insbesondere für Rundungen, fest.
| |||
Titel | IEEE Standard for Floating-Point Arithmetic | ||
Erstveröffentlichung | 1985 | ||
Letzte Ausgabe | 2019 |
Bis in die frühen 1970er Jahre gab es zahlreiche unterschiedliche Darstellungsformate für Gleitkommazahlen, je nach Hersteller oder Baureihe des Prozessors. Die Darstellungsformate unterschieden sich beispielsweise durch den Wertebereich der darstellbaren Zahlen, die Genauigkeit, die Unterstützung von winzigen Zahlen nahe 0, die Rundungsverfahren oder die Genauigkeit der internen Zwischenergebnisse. Diese Unterschiede führten dazu, dass Computerprogramme je nach verwendetem Computer unterschiedliche Ergebnisse lieferten.
Intel plante um 1976 für seine Mikroprozessoren eine eigene FPU und wollte die bestmögliche Lösung für die zu implementierende Arithmetik. Unter der Federführung der IEEE begannen 1977 Treffen, um Gleitkommaarithmetik für Mikroprozessoren zu normieren. Gleichzeitig mit der Entwicklung der Norm implementierte Intel die Normvorschläge weitgehend in dem Gleitkommaprozessor Intel 8087.
Um 1980 wurde die Anzahl der Vorschläge für die Norm auf zwei reduziert: Der K-C-S-Vorschlag (nach seinen Autoren Kahan, Coonen und Stone) setzte sich letztlich gegen die Alternative von DEC (F-Format, D-Format und G-Format) durch. Ein bedeutender Meilenstein auf dem Weg zur Norm war die Diskussion über die Behandlung des Unterlaufs, der bis dahin von den meisten Prozessoren vernachlässigt worden war.
Die erste Ausgabe der Norm wurde 1985 gemeinsam von ANSI und IEEE unter der Nummer IEEE 754-1985 verabschiedet.[1] 1989 erschien die internationale Fassung unter der Nummer IEC-60559:1989.
Die Norm definiert zwei Grunddatenformate für binäre Gleitkommazahlen mit 32 Bit (single precision) bzw. 64 Bit (double precision) Speicherbedarf und zwei erweiterte Formate.
Unabhängig von IEEE wurden die Prinzipien dieser Darstellungsformate verwendet, um weitere Darstellungsformate zu definieren, die umgangssprachlich ebenfalls als IEEE-Zahlen bezeichnet werden, obwohl sie nicht von der Norm abgedeckt sind. Einige dieser Formate wurden in späteren Ausgaben übernommen, andere wie das 80-Bit-Format des Intel 8087 blieben herstellerspezifisch.
Die Überarbeitung IEEE 754-2008[2] strich das Wort „Binary“ aus dem Namen der Norm, so dass noch „IEEE Standard for Floating-Point Arithmetic“ übrig blieb.
Die Binärformate wurden von „single“ und „double“ in die systematischen „binary32“ und „binary64“ umbenannt und um die neuen Formate „binary16“ und „binary128“ ergänzt.
Die neuen Dezimalformate „decimal32“, „decimal64“ und „decimal128“ wurden aus der verwandten Norm IEEE 854-1987 Standard for radix-independent floating-point arithmetic übernommen.
Die mathematischen Grundlagen und Modellierungen wurden expliziter und präziser ausformuliert.
Die Überarbeitung IEEE 754-2019[3] wurde gegenüber 2008 nur geringfügig überarbeitet, sie enthält hauptsächlich Klarstellungen, behebt erkannte Probleme und empfiehlt zusätzliche Rechenoperationen.
Der numerische Wert einer Gleitkommazahl ergibt sich aus der Formel mit den 4 Bestandteilen:
Um eine Gleitkommazahl bitweise zu speichern, wird sie in 3 Bitfolgen zerlegt:
Das Vorzeichen wird in einem Bit gespeichert, dabei markiert positive Zahlen und negative Zahlen.
Der Exponent wird als nichtnegative Binärzahl ( wird manchmal auch als Charakteristik oder biased exponent bezeichnet) gespeichert, indem man den festen Biaswert addiert: . Der Biaswert (engl: Verzerrung) berechnet sich durch . Der Biaswert dient dazu, dass negative Exponenten durch eine vorzeichenlose Zahl (die Charakteristik ) gespeichert werden können, unter Verzicht auf alternative Kodierungen wie z. B. das Zweierkomplement (vergleiche auch Exzesscode).
Die Mantisse ist ein Wert, der sich aus den Mantissenbits mit dem Wert als berechnet. Einfacher ausgedrückt denkt man sich an das Mantissenbitmuster links eine „1,“ angehängt: .
Dieses Verfahren ist möglich, weil durch Normalisierung (s. u.) die Bedingung für alle darstellbaren Zahlen immer eingehalten werden kann. Da dann die Mantisse immer links mit „1,“ beginnt, braucht dieses Bit nicht mehr gespeichert zu werden. Damit gewinnt man ein zusätzliches Bit Genauigkeit.
Für Sonderfälle sind zwei Exponentenwerte mit speziellen Bitmustern reserviert, der Maximalwert () und der Minimalwert (). Mit dem maximalen Exponentenwert werden die Sonderfälle NaN und ∞ kodiert. Mit Null im Exponenten werden die Gleitkommazahl 0 und alle denormalisierten Werte kodiert.
Werte außerhalb des normalen Wertebereichs (zu große bzw. zu kleine Zahlen) werden durch ∞ bzw. −∞ dargestellt. Diese Erweiterung des Wertebereichs erlaubt auch im Falle eines arithmetischen Überlaufs häufig ein sinnvolles Weiterrechnen. Neben der Zahl 0 existiert noch der Wert −0. Während das Ergebnis ∞ liefert, ergibt den Wert −∞. Bei Vergleichen wird zwischen 0 und −0 nicht unterschieden.
Die Werte NaN (für engl. „not a number“, „keine Zahl“) werden als Darstellung für undefinierte Werte verwendet. Sie treten z. B. auf als Ergebnisse von Operationen wie oder auf. NaN werden in Signal-NaN (signalling NaN, NaNs) für Ausnahmebedingungen und stille NaN (quiet NaN, NaNq) unterteilt.
Als letzter Sonderfall füllen denormalisierte Zahlen (in IEEE 754r als subnormale Zahlen bezeichnet) den Bereich zwischen der betragsmäßig kleinsten normalisierten Gleitkommazahl und Null. Sie werden als Festkommazahlen gespeichert und weisen nicht dieselbe Genauigkeit auf wie die normalisierten Zahlen. Konstruktionsbedingt haben die meisten dieser Werte den Kehrwert ∞.
IEEE 754 definiert 4 Darstellungen für binäre Gleitkommazahlen, sie heißen binary16, binary32 (traditionell „single“), binary64 (traditionell „double“) und binary128. Zusätzlich erlaubt die Norm auch benutzerdefinierte erweiterte Darstellungen, die nach den gleichen Prinzipien konstruiert sind wie die vordefinierten Darstellungen.
Vor allem die Anzahl der Exponentenbits legt Maximum und Minimum der darstellbaren Zahlen fest. Die Anzahl der Mantissenbits bestimmt die relative Genauigkeit dieser Zahlen (und nur in geringem Maß das Maximum und das Minimum).
Typ | Größe (1+r+p) |
Exponent (r) |
Mantisse (p) |
Werte des Exponenten (e) |
Biaswert (B) |
---|---|---|---|---|---|
binary16 | 16 bit | 5 bit | 10 bit | −14 ≤ e ≤ 15 | 15 |
binary32 | 32 bit | 8 bit | 23 bit | −126 ≤ e ≤ 127 | 127 |
binary32 extended |
≥ 43 bit | ≥ 11 bit | ≥ 31 bit | emin ≤ −1022 emax ≥ 1023 |
nicht spezifiziert |
binary64 | 64 bit | 11 bit | 52 bit | −1022 ≤ e ≤ 1023 | 1023 |
binary64 extended |
≥ 79 bit | ≥ 15 bit | ≥ 63 bit | emin ≤ −16382 emax ≥ 16383 |
nicht spezifiziert |
binary128 | 128 bit | 15 bit | 112 bit | −16382 ≤ e ≤ 16383 | 16383 |
Für die angegebenen Formate ergibt sich die folgende Beschränkung des jeweiligen Zahlenbereichs, die mit der Maschinengenauigkeit bemessen wird. Die betragsmäßig kleinsten Zahlen sind hierbei nicht normalisiert. Der relative Abstand zweier Gleitkommazahlen ist größer als und kleiner gleich . Konkret ist der Abstand (und in diesem Fall auch der relative Abstand) der Gleitkommazahl zur nächstgrößeren Gleitkommazahl gleich . Dezimalstellen beschreibt die Anzahl der Stellen einer Dezimalzahl, die ohne Genauigkeitsverlust gespeichert werden können. Die Mantisse ist rechnerisch durch das implizite Bit um eins größer als gespeichert.
Typ | Dezimal- stellen |
betragsmäßig kleinste Zahl | größte Zahl | ||
---|---|---|---|---|---|
normalisiert | denormalisiert | ||||
binary32 | 2−(23+1) ≈ 6,0 · 10−8 |
7 … 8 | 2−126 ≈ 1,2 · 10−38 |
2−23 · 2−126 ≈ 1,4 · 10−45 |
(2−2−23) · 2127 ≈ 3,4 · 1038 |
binary32 extended, minimum |
2−(31+1) ≈ 2,3 · 10−10 |
9 … 10 | 2−1022 ≈ 2,2 · 10−308 |
2−31 · 2−1022 ≈ 1,0 · 10−317 |
(2−2−31) · 21023 ≈ 1,8 · 10308 |
binary64 | 2−(52+1) ≈ 1,1 · 10−16 |
15 … 16 | 2−1022 ≈ 2,2 · 10−308 |
2−52 · 2−1022 ≈ 4,9 · 10−324 |
(2−2−52) · 21023 ≈ 1,8 · 10308 |
binary64 extended, minimum |
2−(63+1) ≈ 5,4 · 10−20 |
19 … 20 | 2−16382 ≈ 3,4 · 10−4932 |
2−63 · 2−16382 ≈ 3,7 · 10−4951 |
(2−2−63) · 216383 ≈ 1,2 · 104932 |
Die Anordnung der Bits einer binary32 zeigt die nebenstehende Abbildung. Die bei einer Rechenanlage konkrete Anordnung der Bits im Speicher kann von diesem Bild abweichen und hängt von der jeweiligen Bytereihenfolge (little-/big-endian) und weiteren Rechnereigenheiten ab.
Die Anordnung mit Vorzeichen – Exponent – Mantisse in genau dieser Reihenfolge bringt (innerhalb eines Vorzeichenbereiches) die dargestellten Gleitkommawerte in dieselbe Reihenfolge wie die durch dasselbe Bitmuster darstellbaren Ganzzahlwerte. Damit können für die Vergleiche von Gleitkommazahlen dieselben Operationen wie für die Vergleiche von ganzen Zahlen verwendet werden. Kurz: die Gleitkommazahlen können lexikalisch sortiert werden.
Hierbei ist jedoch zu beachten, dass für steigende negative Ganzzahlwerte der entsprechende Gleitkommawert gegen minus unendlich geht, die Sortierung also umgekehrt ist.
Die Interpretation hängt von dem Exponenten ab. Zur Erläuterung wird mit S der Wert des Vorzeichenbits (0 oder 1), mit E der Wert des Exponenten als nichtnegative ganze Zahl zwischen 0 und Emax = 11…111 = 2r−1, mit M der Wert der Mantisse als nichtnegative Zahl und mit B der Biaswert bezeichnet. Die Zahlen r und p bezeichnen die Anzahl der Exponentenbits und Mantissenbits.
Charakteristik | Mantisse M | Bedeutung | Salopp | Bezeichnung |
---|---|---|---|---|
E = 0 | M = 0 | (−1)S × 0 | ±0 | Null (gehört zu denorm.) |
E = 0 | M > 0 | (−1)S × M / 2p × 21−B | ±0,M × 21−B | denormalisierte Zahl |
0 < E < 2r−1 | M >= 0 | (−1)S × (1+M / 2p) × 2E−B | ±1,M × 2E−B | normalisierte Zahl |
E = 2r−1 | M = 0 | Unendlich | ±∞ | Unendlich |
E = 2r−1 | M > 0 | keine Zahl | keine Zahl (NaN) |
Null repräsentiert die vorzeichenbehaftete Null. Auch Zahlen, die zu klein sind, um dargestellt zu werden (Unterlauf), werden auf Null gerundet. Ihr Vorzeichen bleibt dabei erhalten. Negative kleine Zahlen werden so zu −0,0 gerundet, positive Zahlen zu +0,0. Beim direkten Vergleich werden jedoch +0,0 und −0,0 als gleich angesehen.
Die Mantisse besteht aus den ersten n wesentlichen Ziffern der Binärdarstellung der noch nicht normalisierten Zahl. Die erste wesentliche Ziffer ist die höchstwertige (d. h. am weitesten links stehende) Ziffer, die von 0 verschieden ist. Da eine von 0 verschiedene Ziffer im Binärsystem nur eine 1 sein kann, muss diese erste 1 nicht explizit abgespeichert werden; gemäß der Norm IEEE 754 werden nur die folgenden Ziffern gespeichert, die erste Ziffer ist eine implizite Ziffer oder ein implizites Bit (engl. hidden bit). Dadurch wird gewissermaßen 1 Bit Speicherplatz „gespart“.
Ist eine Zahl zu klein, um in normalisierter Form mit dem kleinsten von Null verschiedenen Exponenten gespeichert zu werden, so wird sie als „denormalisierte Zahl“ gespeichert.[4] Ihre Interpretation ist nicht mehr ±1,mantisse·2exponent, sondern ±0,mantisse·2de. Dabei ist de der Wert des kleinsten „normalen“ Exponenten. Damit lässt sich die Lücke zwischen der kleinsten normalisierten Zahl und Null füllen. Denormalisierte Zahlen haben jedoch eine geringere (relative) Genauigkeit als normalisierte Zahlen; die Anzahl der signifikanten Stellen in der Mantisse nimmt zur Null hin ab.
Ist das Ergebnis (oder Zwischenergebnis) einer Rechnung kleiner als die kleinste darstellbare Zahl der verwendeten endlichen Arithmetik, so wird es im Allgemeinen auf Null gerundet; das nennt man Unterlauf der Gleitkommaarithmetik, engl. underflow. Da dabei Information verloren geht, versucht man, Unterlauf nach Möglichkeit zu vermeiden. Die denormalisierten Zahlen in IEEE 754 bewirken einen allmählichen Unterlauf (engl. gradual underflow), indem „um die 0 herum“ 224 (für single) bzw. 253 (für double) Werte eingefügt werden, die alle denselben absoluten Abstand voneinander haben und ohne diese denormalisierten Werte nicht darstellbar wären, sondern zu Unterlauf führen müssten.
Prozessorseitig sind denormalisierte Zahlen aufgrund ihres proportional seltenen Auftretens mit wenig Priorität implementiert und führen deswegen zu einer deutlichen Verlangsamung der Ausführung, sobald sie als Operand oder als Ergebnis einer Berechnung auftauchen. Um Abhilfe (z. B. für Computerspiele) zu schaffen, bietet Intel seit SSE2 die nicht IEEE-754-konforme Funktionalität an, denormalisierte Zahlen vollständig zu deaktivieren (MXCSR-Optionen „flush to zero“ und „denormals are zero“). Gleitkommazahlen, die in diesen Bereich gelangen, werden auf 0 gerundet.[5]
Der Gleitkommawert Unendlich repräsentiert Zahlen, deren Betrag zu groß ist, um dargestellt zu werden. Es wird zwischen positiver Unendlichkeit und negativer Unendlichkeit unterschieden. Die Berechnung von 1,0/0,0 ergibt nach Definition von IEEE-754 „positiv Unendlich“.
Damit werden ungültige (oder nicht definierte) Ergebnisse dargestellt, z. B. wenn versucht wurde, die Quadratwurzel aus einer negativen Zahl zu berechnen. Einige „unbestimmte Ausdrücke“ haben als Ergebnis „keine Zahl“, zum Beispiel 0,0/0,0 oder „Unendlich“ – „Unendlich“. Außerdem werden NaNs in verschiedenen Anwendungsbereichen benutzt, um „Kein Wert“ oder „Unbekannter Wert“ darzustellen. Insbesondere der Wert mit dem Bitmuster 111…111 wird oft für eine „nicht initialisierte Gleitkommazahl“ benutzt.
IEEE 754 fordert zwei Arten von Nichtzahlen: stille NaN (NaNq – quiet) und signalisierende NaN (NaNs – signalling). Beide stellen explizit keine Zahlen dar. Eine signalisierende NaN löst im Gegensatz zu einer stillen NaN eine Ausnahme (Trap) aus, wenn sie als Operand einer arithmetischen Operation auftritt.
IEEE 754 ermöglicht dem Anwender das Deaktivieren dieser Traps. In diesem Falle werden signalisierende NaN wie stille NaN behandelt.
Signalisierende NaN können genutzt werden, um uninitialisierten Rechnerspeicher zu füllen, so dass jedes Verwenden einer uninitialisierten Variable automatisch eine Ausnahme auslöst.
Stille NaN ermöglichen den Umgang mit Rechnungen, die kein Ergebnis erzeugen können, etwa weil sie für die angegebenen Operanden nicht definiert sind. Beispiele sind die Division Null durch Null oder der Logarithmus aus einer negativen Zahl.
Stille und signalisierende NaN unterscheiden sich im höchsten Mantissenbit. Bei stillen NaN ist dieses 1, bei signalisierenden NaN 0. Die übrigen Mantissenbits können zusätzliche Informationen enthalten, z. B. die Ursache der NaN. Dies kann bei der Ausnahmebehandlung hilfreich sein. Allerdings schreibt der Standard nicht fest, welche Informationen in den übrigen Mantissenbits enthalten sind. Die Auswertung dieser Bits ist daher plattformabhängig.
Das Vorzeichenbit hat bei NaN keine Bedeutung. Es ist nicht spezifiziert, welchen Wert das Vorzeichenbit bei zurückgegebenen NaN besitzt.
Der Dezimalbruch 18,4 soll in die Darstellung binary32 umgewandelt werden.
Die binary32-Gleitkommazahl mit der Bitfolge 0100 0001 1001 0011 0011 0011 0011 0011 soll in einen Dezimalbruch umgewandelt werden.
Die in diesem Bereich exakt darstellbaren Zahlen im Format binary32 sind:
Da die gerundete Dezimalzahl 18,4 näher an der mittleren Zahl liegt als an der nächstgrößeren, ist die kürzeste eindeutige Dezimaldarstellung für die Zahl die 18,4.
IEEE 754 unterscheidet zunächst zwischen binären Rundungen und binär-dezimalen Rundungen, bei denen geringere Qualitätsforderungen gelten.
Bei binären Rundungen muss zur nächstgelegenen darstellbaren Zahl gerundet werden. Wenn diese nicht eindeutig definiert ist (genau in der Mitte zwischen zwei darstellbaren Zahlen), wird so gerundet, dass das niederwertigste Bit der Mantisse 0 wird. Statistisch wird dabei in 50 % der Fälle auf-, in den anderen 50 % der Fälle abgerundet, so dass die von Knuth beschriebene statistische Drift in längeren Rechnungen vermieden wird.
Eine zu IEEE 754 konforme Implementierung muss drei weitere vom Programmierer einstellbare Rundungen bereitstellen: Rundung gegen +Unendlich (immer aufrunden), Rundung gegen −Unendlich (immer abrunden) und Rundung gegen 0 (Ergebnis immer betragsmäßig verkleinern).
Zu IEEE 754 konforme Implementierungen müssen Operationen für Arithmetik, Berechnung der Quadratwurzel, Konversionen und Vergleiche bereitstellen. Eine weitere Gruppe von Operationen wird im Anhang empfohlen, jedoch nicht verbindlich vorgeschrieben.
IEEE 754 verlangt von einer (Hardware- oder Software-)Implementierung exakt gerundete Ergebnisse für die Operationen Addition, Subtraktion, Multiplikation und Division zweier Operanden sowie der Operation Quadratwurzel eines Operanden. Das heißt, das ermittelte Ergebnis muss gleich demjenigen sein, das bei einer exakten Ausführung der entsprechenden Operation mit anschließender Rundung entsteht.
Weiter ist die Berechnung des Restes nach einer Division mit ganzzahligem Ergebnis gefordert. Diese Restberechnung ist definiert durch , ganzzahlig, oder bei geradem auch . Dieser Rest muss ohne Rundung exakt ermittelt werden.
Konversionen werden zwischen allen unterstützten Gleitkommaformaten gefordert. Bei einer Konversion in ein Gleitkommaformat mit kleinerer Genauigkeit muss wie schon unter Arithmetik beschrieben exakt gerundet werden.
Zu IEEE 754 konforme Implementierungen müssen Konversionen zwischen allen unterstützten Gleitkommaformaten und allen unterstützten ganzzahligen Formaten bereitstellen. Die ganzzahligen Formate werden in IEEE 754 jedoch nicht genauer definiert.
Zu jedem unterstützten Gleitkommaformat muss eine Operation existieren, die diese Gleitkommazahl in die exakt gerundete ganze Zahl im selben Gleitkommaformat konvertiert.
Schließlich müssen Konversionen zwischen dem binären Gleitkommaformat und einem Dezimalformat existieren, die genau beschriebenen Mindestqualitätsforderungen genügen.
Gleitkommazahlen nach IEEE 754 müssen verglichen werden können. Die Norm definiert die notwendigen Vergleichsoperationen und für alle möglichen Sonderfälle (vor allem NaN, Unendlich und 0) die geforderten Ergebnisse. Gegenüber den „schulmathematischen“ Vergleichen (kleiner, gleich oder größer) kommt als mögliches Ergebnis nach IEEE 754 unordered („nicht eingeordnet“) hinzu, wenn einer der Vergleichsoperanden NaN ist. Zwei NaN gelten immer als verschieden, selbst wenn ihre Bitmuster übereinstimmen.
Im Anhang der Norm werden zehn weitere Operationen empfohlen. Da sie in einer Implementierung im Grunde sowieso benötigt werden, läuft diese Empfehlung letztlich darauf hinaus, die Operationen an den Programmierer weiterzugeben. Diese Operationen sind (in C-Schreibweise):
copysign(x,y)
, invertsign(x)
, scalb(y,n)
, logb(x)
, nextafter(x,y)
, finite(x)
, isnan(x)
, x ≠ y
, unordered(x,y)
, class(x)
. Die Details der Implementierung vor allem wieder bei den Sonderfällen NaN usw. sind ebenfalls vorgeschlagen.
Treten bei der Berechnung Ausnahmen (Exceptions) auf, werden Status-Flags gesetzt. Im Standard wird vorgeschrieben, dass der Benutzer diese Flags lesen und schreiben kann. Die Flags sind „sticky“: werden sie einmal gesetzt, bleiben sie so lange erhalten, bis sie explizit wieder zurückgesetzt werden. Das Überprüfen der Flags ist beispielsweise die einzige Möglichkeit, 1/0 (=Unendlich) von einem Überlauf zu unterscheiden.
Des Weiteren wird im Standard empfohlen, Trap Handler zu ermöglichen: Tritt eine Ausnahme auf, wird der Trap Handler aufgerufen, anstatt das Status-Flag zu setzen. Es liegt in der Verantwortung solcher Trap Handler, das entsprechende Status-Flag zu setzen oder zu löschen.
Ausnahmen werden im Standard in 5 Kategorien eingeteilt: Überlauf, Unterlauf, Division durch Null, ungültige Operation und Ungenau. Für jede Klasse steht ein Status-Flag zur Verfügung.
Seamless Wikipedia browsing. On steroids.
Every time you click a link to Wikipedia, Wiktionary or Wikiquote in your browser's search results, it will show the modern Wikiwand interface.
Wikiwand extension is a five stars, simple, with minimum permission required to keep your browsing private, safe and transparent.