Zum Inhalt springen

„IEEE 754“ – Versionsunterschied

aus Wikipedia, der freien Enzyklopädie
[ungesichtete Version][gesichtete Version]
Inhalt gelöscht Inhalt hinzugefügt
Dudll (Diskussion | Beiträge)
Linkvorschlag-Funktion: 1 Link hinzugefügt.
 
(514 dazwischenliegende Versionen von mehr als 100 Benutzern, die nicht angezeigt werden)
Zeile 1: Zeile 1:
{{Infobox Norm
{{Überarbeiten}}
|Typ = IEEE
|Nummer = 754
|Titel = IEEE Standard for Floating-Point Arithmetic
|Erstveröffentlichung = 1985
|Stand = 2019
}}


Die Norm '''IEEE 754''' (ANSI/IEEE Std 754-1985; IEC-60559 - International version) definiert Standarddarstellungen für binäre [[Gleitkommazahl]]en in [[Computer]]n und legt genaue Verfahren für die Durchführung mathematischer Operationen, insbesondere für Rundungen, fest.
Die Norm '''IEEE 754''' definiert Standarddarstellungen für binäre und dezimale [[Gleitkommazahl]]en in [[Computer]]n und legt genaue Verfahren für die Durchführung mathematischer Operationen, insbesondere für Rundungen, fest.


== Überblick ==
== Geschichte ==
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 [[Floating Point Unit]] (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]].
In der Norm IEEE 754 werden zwei Grunddatenformate für binäre Gleitkommazahlen mit 32 Bit ("single precision") bzw. 64 Bit ("double precision") Speicherbedarf und zwei erweiterte Formate definiert. In der verwandten Norm [[IEEE 854]] werden nichtbinäre Gleitpunktzahlen definiert. In Entwurf für eine Neufassung von IEEE 754 ([[IEEE 754r]]) werden weitere binäre (16, 32, 64, 128 Bit) und dezimale (32, 64, 128 Bit) Formate für Gleitpunktzahlen vorgeschlagen. IEEE 754 und IEEE 854 werden in Zukunft also zusammengeführt.


Um 1980 wurde die Anzahl der Vorschläge für die Norm auf zwei reduziert: Der K-C-S-Vorschlag (nach seinen Autoren [[William Kahan|'''K'''ahan]], '''C'''oonen und '''S'''tone) setzte sich letztlich gegen die Alternative von [[Digital Equipment Corporation|DEC]] (F-Format, D-Format und G-Format) durch. Ein bedeutender Meilenstein auf dem Weg zur Norm war die Diskussion über die Behandlung des [[Arithmetischer Unterlauf|Unterlaufs]], der bis dahin von den meisten Prozessoren vernachlässigt worden war.
Schließlich gibt es Vorschläge und Implementierungen von weiteren Zahlenformaten, die nach den Prinzipien der IEEE 754 Norm gestaltet sind und deshalb oft als IEEE-Zahlen bezeichnet werden, obwohl das streng genommen falsch ist. Dazu gehören die [[Minifloat]]s, die für die Ausbildung gedacht sind. Minifloats mit 16 Bit werden aber gelegentlich in der Graphikprogrammierung verwendet. Dazu gehören auch mehrere nicht von IEEE definierte Zahlenformate mit mehr als 64 Bit.

=== IEEE 754-1985 ===
Die erste Ausgabe der Norm wurde 1985 gemeinsam von [[American National Standards Institute|ANSI]] und IEEE unter der Nummer '''IEEE 754-1985''' verabschiedet.<ref>"IEEE Standard for Binary Floating-Point Arithmetic," in ANSI/IEEE Std 754-1985, S.&nbsp;1–20, 12. Okt. 1985, [[doi:10.1109/IEEESTD.1985.82928]].</ref> 1989 erschien die internationale Fassung unter der Nummer IEC-60559:1989.

Die Norm definiert zwei Grunddatenformate für binäre Gleitkommazahlen mit 32&nbsp;Bit (''single precision'') bzw. 64&nbsp;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.

=== IEEE 754-2008 ===
Die Überarbeitung [[IEEE 754-2008]]<ref>"IEEE Standard for Floating-Point Arithmetic", in IEEE Std 754-2008, S.&nbsp;1–70, 29. Aug. 2008, {{DOI|10.1109/IEEESTD.2008.4610935}}.</ref> 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|IEEE 854-1987]] {{lang|en|''Standard for radix-independent floating-point arithmetic''}} übernommen.

Die mathematischen Grundlagen und Modellierungen wurden expliziter und präziser ausformuliert.

=== IEEE 754-2019 ===
Die Überarbeitung '''IEEE 754-2019'''<ref>{{Literatur |Titel=IEEE Standard for Floating-Point Arithmetic |Sammelwerk=IEEE Std 754-2019 (Revision of IEEE 754-2008) |Datum=2019-07 |Seiten=1–84 |Online=https://ieeexplore.ieee.org/document/8766229 |Abruf=2020-02-05 |DOI=10.1109/IEEESTD.2019.8766229}}</ref> wurde gegenüber 2008 nur geringfügig überarbeitet, sie enthält hauptsächlich Klarstellungen, behebt erkannte Probleme und empfiehlt zusätzliche Rechenoperationen.


== Allgemeines ==
== Allgemeines ==
Der numerische Wert <math>x</math> einer Gleitkommazahl ergibt sich aus der Formel <math>s \cdot m \cdot b^e</math> mit den 4 Bestandteilen:
* [[Vorzeichen (Zahl)|Vorzeichen]] <math>s</math> (entweder <math>+1</math> oder <math>-1</math>)
* [[Mantisse]] <math>m</math>
* Basis <math>b</math> (entweder 2 oder 10)
* [[Potenz (Mathematik)|Exponent]] <math>e</math>


Die Darstellung einer Gleitkommazahl <math>x = s \times m \times b^e</math>besteht aus:
Um eine Gleitkommazahl bitweise zu speichern, wird sie in 3 Bitfolgen zerlegt:
* <math>S</math> (1 Bit) für das Vorzeichen
* Vorzeichen s (fast ausnahmslos 1 Bit)
* <math>M</math> (<math>p</math> Bits) für die Mantisse
* Exponent e (r Bit)
* <math>E</math> (<math>r</math> Bits) für den Exponenten
* Mantisse m (p Bit)


Das Vorzeichen <math>s</math> wird im Bit <math>S</math> gespeichert, dabei markiert <math>S = 0</math> positive Zahlen und <math>S = 1</math> negative Zahlen.
Bei normalisierten Gleitkommazahlen (NZ) nach IEEE 754 ist die Basis b = 2. Das Vorzeichen <math>s = (-1)^S</math> wird in einem Bit S gespeichert, so dass S = 0 positive Zahlen und S = 1 negative Zahlen markiert. Der Exponent e ergibt sich aus der in den Exponentenbits gespeicherten nichtnegativen Binärzahl E durch Subtraktion eines festen Biaswertes B: <math> e = E - B </math>. Schließlich ist die Mantisse <math> 1 \le m < 2</math> ein Wert, der sich aus den p Mantissenbits M berechnet als <math>m = 1 + M / 2^p</math>. Einfacher ausgedrückt, denkt man sich an das Mantissenbitmuster M links 1. angehängt: m = 1.M.

Der Exponent <math>e</math> wird als nichtnegative Binärzahl <math>E</math> (<math>E</math> wird manchmal auch als Charakteristik oder biased exponent bezeichnet) gespeichert, indem man den festen Biaswert <math>B</math> addiert:
<math>E = e + B</math>.
Der Biaswert (engl: Verzerrung) berechnet sich durch <math>2^{r-1}-1</math>. Der Biaswert <math>B</math> dient dazu, dass negative Exponenten durch eine vorzeichenlose Zahl (die Charakteristik <math>E</math>) gespeichert werden können, unter Verzicht auf alternative Kodierungen wie z.&nbsp;B. das [[Zweierkomplement]] (vergleiche auch [[Exzesscode]]).

Die Mantisse <math>1 \leq m < 2</math> ist ein Wert, der sich aus den <math>p</math> Mantissenbits mit dem Wert <math>M</math> als <math>m = 1 + M / 2^p</math> berechnet. Einfacher ausgedrückt denkt man sich an das Mantissenbitmuster <math>M</math> links eine „1,“ angehängt: <math>m = 1{,}M</math>.
* <math>s = (-1)^S</math>
* <math>s = (-1)^S</math>
* <math>e = E - B </math>
* <math>e = E - B </math>
* <math>m = 1.M = 1 + M / 2^p</math>
* <math>m = 1{,}M = 1 + M / 2^p</math>

Dieses Verfahren ist möglich, weil durch Normalisierung (s.&nbsp;u.) die Bedingung <math>1\leq m < 2</math> 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 (<math>E=11 \dots 111_2=2^r-1</math>) und der Minimalwert (<math>E=00 \dots 000_2=0</math>). Mit dem maximalen Exponentenwert werden die Sonderfälle NaN und ∞ kodiert. Mit Null im Exponenten werden die Gleitkommazahl 0 und alle denormalisierten Werte kodiert.
Dieses Verfahren ist möglich, weil durch Normalisierung (s.u.) die Bedingung <math> 1 \le m < 2</math> 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.


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 <math>\tfrac{1}{0}</math> das Ergebnis ∞ liefert, ergibt <math>\tfrac{1}{-0}</math> den Wert −∞. Bei Vergleichen wird zwischen 0 und −0 nicht unterschieden.
Neben normalisierten Zahlen gibt es in IEEE 754 auch nichtnormalisierte Zahlen (denormalized numbers).


Schließlich gibt es spezielle Werte, die Sonderfälle kennzeichnen. Dazu gehört die Zahl 0 in zwei Darstellungen +0 und -0. Dazu gehören zwei Darstellungen für <math>\infty</math>, nämlich <math>+\infty</math> und <math>-\infty</math>. Und dazu gehören spezielle Darstellungen für Nichtzahlen, bezeichnet als NaN (not a number), mit denen explizit Ergebnisse verbotener Operationen markiert werden können. NaNs werden in Signal-NaNs (signaling NaN) für Ausnahmebedingungen und stille NaNs (quiet NaN) unterteilt.
Die Werte [[NaN]] (für engl. „not a number“, „keine Zahl“) werden als Darstellung für undefinierte Werte verwendet. Sie treten z.&nbsp;B. auf als Ergebnisse von Operationen wie <math>\tfrac{0}{0}</math> oder <math>\infty-\infty</math> 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 [[Betragsfunktion|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]] ∞.
== Details ==


== {{Anker|Zahlenformate}} Zahlenformate und andere Festlegungen des IEEE-754-Standards ==
IEEE 754 unterscheidet vier Darstellungen: einfach genaue ([[Einfache Genauigkeit|single]]), erweiterte einfach genaue (single extended), doppelt genaue ([[Doppelte Genauigkeit|double]]) und erweiterte doppelt genaue (double extended) Zahlenformate. Bei den erweiterten Formaten ist nur jeweils eine Mindestbitzahl vorgeschrieben. Die Grundformate sind vollständig definiert.
IEEE 754 definiert 4 Darstellungen für binäre Gleitkommazahlen, sie heißen binary16, binary32 (traditionell „[[Einfache Genauigkeit|single]]“), binary64 (traditionell „[[Doppelte Genauigkeit|double]]“) und binary128. Zusätzlich erlaubt die Norm auch benutzerdefinierte erweiterte Darstellungen, die nach den gleichen Prinzipien konstruiert sind wie die vordefinierten Darstellungen.


Die Anzahl der Exponentenbits legt den Wertebereich der darstellbaren Zahlen fest (s.u.). Die Anzahl der Mantissenbits legt die Genauigkeit dieser Zahlen fest.
Vor allem die Anzahl der Exponentenbits legt Maximum und Minimum der darstellbaren Zahlen fest. Die Anzahl der Mantissenbits bestimmt die [[#relative|relative]] Genauigkeit dieser Zahlen (und nur in geringem Maß das Maximum und das Minimum).


{| class="wikitable" style="text-align:center"
{| {{prettytable}}
|- class="hintergrundfarbe6"
!Typ !! Größe 1+r+p !! Mantisse p !! Mant. bei NZ !! Exponent r !! Werte der Ch. bei NZ !! Biaswert B <!-- das ist richtig so! Und nicht "Bits" oder sonstwas! *grummel* -->
! Typ
! Größe<br>(1+r+p)
! Exponent<br>(r)
! Mantisse<br>(p)
! Werte des<br>Exponenten (e)
! Biaswert<br>(B) <!-- das ist richtig so! Und nicht „Bits“ oder „Basis“ sonstwas! *grummel* -->
|-
|-
|class="hintergrundfarbe8" style="text-align:center"| binary16
|single || 32 bit || 23 bit || 24 bit || 8 bit || <math>1 \le E \le 254 </math> || 127
| 16 bit
| 5 bit
| 10 bit
| −14 ≤ ''e'' ≤ 15
| 15
|-
|-
|class="hintergrundfarbe8" style="text-align:center"| binary32
|single ext. || > 42 bit || > 30 bit || > 31 bit || > 10 bit || ||
| 32 bit
| 8 bit
| 23 bit
| −126 ≤ ''e'' ≤ 127
| 127
|-
|-
|class="hintergrundfarbe8" style="text-align:center"| binary32<br>extended
|double || 64 bit || 52 bit || 53 bit || 11 bit || <math>1 \le E \le 2046 </math> || 1023
| ≥ 43 bit
| ≥ 11 bit
| ≥ 31 bit
| ''e<sub>min</sub>'' ≤ −1022<br /> ''e<sub>max</sub>'' ≥ 1023
| nicht<br />spezifiziert
|-
|class="hintergrundfarbe8" style="text-align:center"| binary64
| 64 bit
| 11 bit
| 52 bit
| −1022 ≤ ''e'' ≤ 1023
| 1023
|-
|class="hintergrundfarbe8" style="text-align:center"| binary64<br>extended
| ≥ 79 bit
| ≥ 15 bit
| ≥ 63 bit
| ''e<sub>min</sub>'' ≤ −16382<br /> ''e<sub>max</sub>'' ≥ 16383
| nicht<br />spezifiziert
|-
|class="hintergrundfarbe8" style="text-align:center"| binary128
| 128 bit
| 15 bit
| 112 bit
| −16382 ≤ ''e'' ≤ 16383
| 16383
|-
|-
|double ext. || > 78 bit || > 62 bit || > 63 bit || > 14 bit || ||
|}
|}


Für die angegebenen Formate ergibt sich die folgende Beschränkung des jeweiligen Zahlenbereichs, die mit der [[Maschinengenauigkeit]] <math>\epsilon</math> bemessen wird. Die betragsmäßig kleinsten Zahlen sind hierbei nicht normalisiert. Der relative Abstand zweier Gleitkommazahlen ist größer als <math>\epsilon</math> und kleiner gleich <math>2\epsilon</math>. Konkret ist der Abstand (und in diesem Fall auch der {{Anker|relative}}relative Abstand) der Gleitkommazahl <math>1</math> zur nächstgrößeren Gleitkommazahl gleich <math>2\epsilon</math>. 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.
Die Anordnung der Bits einer ''single'' in einer FPU (floating point unit) zeigt die nachfolgende Abbildung. Die bei einer Rechenanlage konkrete Anordnung der Bits im Speicher kann von diesem Bild abweichen und hängt von der jeweiligen [[Byte-Reihenfolge|Bytereihenfolge]] (litte/big endian) und weiteren Rechnereigenheiten ab.


{| class="wikitable"
[[Bild:IEEE-754-single1.png]]
|- class="hintergrundfarbe6"

! rowspan="2" | Typ
Die Anordnung mit Vorzeichen &ndash; Exponent &ndash; Mantisse in genau dieser Reihenfolge bringt die dargestellten Gleitkommawerte in dieselbe Reihenfolge wie die durch dasselbe Bitmuster darstellbaren Signed-Integer-Werte. Damit können für die Vergleiche von Gleitkommazahlen dieselben Operationen verwendet werden, wie für die Vergleiche von Signed-Integers. Kurz: die Gleitkommazahlen können lexikalisch sortiert werden.
! rowspan="2" | <math>\epsilon</math>
! rowspan="2" | Dezimal-<br />stellen
! colspan="2" | betragsmäßig kleinste Zahl
! rowspan="2" | größte Zahl
|- class="hintergrundfarbe6"
! normalisiert
! denormalisiert
|-
|class="hintergrundfarbe8" | binary32
| 2<sup>−(23+1)</sup><br />≈ 6,0&#8239;·&#8239;10<sup>−8</sup>
|style="text-align:center"| {{0}}7 … 8{{0}}
| 2<sup>−126</sup><br />≈ 1,2&#8239;·&#8239;10<sup>−38</sup>
| 2<sup>−23</sup>&#8239;·&#8239;2<sup>−126</sup><br />≈ 1,4&#8239;·&#8239;10<sup>−45</sup>
| (2−2<sup>−23</sup>)&#8239;·&#8239;2<sup>127</sup><br />≈ 3,4&#8239;·&#8239;10<sup>38</sup>
|-
|class="hintergrundfarbe8" | binary32 extended,<br>minimum
| 2<sup>−(31+1)</sup><br />≈ 2,3&#8239;·&#8239;10<sup>−10</sup>
|style="text-align:center"| {{0}}9 … 10
| 2<sup>−1022</sup><br />≈ 2,2&#8239;·&#8239;10<sup>−308</sup>
| 2<sup>−31</sup>&#8239;·&#8239;2<sup>−1022</sup><br />≈ 1,0&#8239;·&#8239;10<sup>−317</sup>
| (2−2<sup>−31</sup>)&#8239;·&#8239;2<sup>1023</sup><br />≈ 1,8&#8239;·&#8239;10<sup>308</sup>
|-
|class="hintergrundfarbe8" | binary64
| 2<sup>−(52+1)</sup><br />≈ 1,1&#8239;·&#8239;10<sup>−16</sup>
|style="text-align:center"| 15 … 16
| 2<sup>−1022</sup><br />≈ 2,2&#8239;·&#8239;10<sup>−308</sup>
| 2<sup>−52</sup>&#8239;·&#8239;2<sup>−1022</sup><br />≈ 4,9&#8239;·&#8239;10<sup>−324</sup>
| (2−2<sup>−52</sup>)&#8239;·&#8239;2<sup>1023</sup><br />≈ 1,8&#8239;·&#8239;10<sup>308</sup>
|-
|class="hintergrundfarbe8" | binary64 extended,<br>minimum
| 2<sup>−(63+1)</sup><br />≈ 5,4&#8239;·&#8239;10<sup>−20</sup>
|style="text-align:center"| 19 … 20
| 2<sup>−16382</sup><br />≈ 3,4&#8239;·&#8239;10<sup>−4932</sup>
| 2<sup>−63</sup>&#8239;·&#8239;2<sup>−16382</sup><br />≈ 3,7&#8239;·&#8239;10<sup>−4951</sup>
| (2−2<sup>−63</sup>)&#8239;·&#8239;2<sup>16383</sup><br />≈ 1,2&#8239;·&#8239;10<sup>4932</sup>
|}


[[Datei:IEEE-754-single.svg|mini|420px|Bitdarstellung einer binary32-Zahl in Big-Endian-Darstellung]]
Neben diesen beiden Formaten werden "erweiterte Formate" definiert. Es wird aber nicht definiert, wie groß die Genauigkeit dieser Formate ist.
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.
Auch wenn in diesem Artikel hauptsächlich das Zahlenformat erörtert wird, liegt die Bedeutung der IEEE 754 Norm auch darin, dass für Gleitkommazahlen genaue Vorschriften für
* Rundung
* arithmetische Operationen
* Wurzelberechnung
* Konversionen
* Ausnahmebehandlung (Exception handling)
festgelegt werden


Hierbei ist jedoch zu beachten, dass für steigende negative Ganzzahlwerte der entsprechende Gleitkommawert gegen minus unendlich geht, die Sortierung also umgekehrt ist.
==Darstellbare Werte==


== Interpretation des Zahlenformats ==
Sind im Exponent einer Zahl alle Bits gesetzt (= 1) oder alle gelöscht (=0), so hat diese Fließkommazahl eine gesonderte Bedeutung:
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 ''E<sub>max</sub>'' = 11…111 = 2<sup>''r''</sup>−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.


{| class="wikitable" style="margin-left:2em"
{|
|- class="hintergrundfarbe6"
|Exponent
!Charakteristik
|Mantisse
!Mantisse ''M''
|Bedeutung
!Bedeutung
!Salopp
!Bezeichnung
|-
|-
| ''E'' = 0
|111...111<sub>binär</sub>
| ''M'' = 0
|000...000<sub>binär</sub>
| (−1)<sup>''S''</sup> × 0
| +/&ndash; Unendlich
| ±0
| Null (gehört zu denorm.)
|-
|-
| ''E'' = 0
|111...111<sub>binär</sub>
| ''M'' > 0
|&#8800; 000...000<sub>binär</sub>
| (−1)<sup>''S''</sup> × ''M'' / 2<sup>''p''</sup> × 2<sup>1−''B''</sup>
|[[NaN|"Keine Zahl" (NaN = Not a Number)]]
| ±0,''M'' × 2<sup>1−''B''</sup>
| denormalisierte Zahl
|-
|-
| 0 < ''E'' < 2<sup>''r''</sup>−1
|000...000<sub>binär</sub>
| ''M'' >= 0
|000...000<sub>binär</sub>
| (−1)<sup>''S''</sup> × (1+''M'' / 2<sup>''p''</sup>) × 2<sup>''E''−''B''</sup>
| +/&ndash; 0. (Null)
| ±1,''M'' × 2<sup>''E''−''B''</sup>
| normalisierte Zahl
|-
|-
| ''E'' = 2<sup>''r''</sup>−1
|000...000<sub>binär</sub>
| ''M'' = 0
|&#8800;000...000<sub>binär</sub>
| Unendlich
|Denormalisierte Fließkommazahl
| ±∞
| Unendlich
|-
|-
| ''E'' = 2<sup>''r''</sup>−1
|000...001<sub>binär</sub> bis 111...110<sub>binär</sub>
|''beliebig''
| ''M'' > 0
| keine Zahl
|Normalisierte Fließkommazahl
|
| keine Zahl (NaN)
|}
|}


=== Null ===
;"Unendlich" : Repräsentiert Zahlen, deren Betrag zu groß sind, um dargestellt zu werden. Es wird zwischen +"Unendlich" und &ndash;"Unendlich" unterschieden. Die Berechnung von 1.0/0.0 ergibt ''per Definition'' ebenfalls +"Unendlich".
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.


=== Normalisierte Zahl ===
;"Keine Zahl" (''NaN'') : 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" &ndash; "Unendlich". Außerdem werden ''NaN''s 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 Fließkommazahl" benutzt.
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.&nbsp;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. {{lang|en|''hidden bit''}}). Dadurch wird gewissermaßen 1 Bit Speicherplatz „gespart“.


=== Denormalisierte Zahl ===
; Null : Null repräsentiert die absolute 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 &ndash;0.0 gerundet, positive Zahlen zu +0.0. Beim direkten Vergleich werden jedoch +0.0 und &ndash;0.0 als gleich angesehen.
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.<ref name="goldberg">{{cite journal
| first = David| last = Goldberg
| title = What Every Computer Scientist Should Know About Floating-Point Arithmetic
| journal = ACM Computing Surveys
| year = 1991
| volume = 23
| pages = 5–48
| accessdate = 2010-09-02
| doi = 10.1145/103162.103163
| url = http://docs.sun.com/source/806-3568/ncg_goldberg.html
| language=en
}}</ref> Ihre Interpretation ist nicht mehr ±1,''mantisse''·2<sup>''exponent''</sup>, sondern ±0,''mantisse''·2<sup>''de''</sup>. 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. {{lang|en|''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. {{lang|en|''gradual underflow''}}), indem „um die 0 herum“ 2<sup>24</sup> (für ''single'') bzw. 2<sup>53</sup> (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.
; Denormalisierte Zahl : Ist eine Zahl zu klein, um in normalisierter Form mit dem kleinsten, von Null verschiedenen Exponenten gespeichert zu werden, so werden sie als "Denormalisierte Zahl" gespeichert. Ihre Interpretation ist nicht mehr <math>\pm 1{,}mantisse \cdot 2^{exponent}</math> sondern <math>\pm 0{,}mantisse \cdot 2^{de}</math>. <math>de</math> ist dabei der Wert des kleinsten "normalen" Exponenten. Damit lässt sich die Lücke zwischen der kleinsten normalisierten Zahl und Null verkleinern. Denormalisierte Zahlen haben jedoch eine geringere Genauigkeit als normalisierte Zahlen, die Anzahl der signifikanten Stellen in der Mantisse nimmt zur Null hin ab.


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.&nbsp;B. für Computerspiele) zu schaffen, bietet Intel seit [[Streaming SIMD Extensions 2|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.<ref>{{cite web|url=https://software.intel.com/en-us/articles/x87-and-sse-floating-point-assists-in-ia-32-flush-to-zero-ftz-and-denormals-are-zero-daz/|last=Casey|first=Shawn|date=2008-10-16|accessdate=2010-09-03|title=x87 and SSE Floating Point Assists in IA-32: Flush-To-Zero (FTZ) and Denormals-Are-Zero (DAZ) | language=en }}</ref>
:Ist das Ergebnis (oder Zwischenergebnis) einer Rechnung kleiner als die kleinste darstellbare Zahl der verwendeten endlichen Arithmetik, so wird es i.A. auf Null gerundet; das nennt man '''Unterlauf''' der Gleitkommaarithmetik, englisch '''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''', indem "um die 0 herum" <math>2^{24}</math> (für 'single') bzw. <math>2^{53}</math> (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.


=== Unendlich ===
; Normalisierte Zahl : In allen anderen Fällen berechnet sich der Wert ''v'' der Zahl als <math>v = (-1)^s \cdot (1{,}m_0m_1m_2\dots) \cdot 2^{e_0e_1e_2\dots - a}</math>. Hierbei ist ''s'' das Vorzeichenbit, <math>m_i</math> sind die Bits der Mantisse und <math>e_j</math> die Bits des Exponenten. Der Wert ''a'' ist die ''Abweichung'' (engl.: bias), die aus der Tabelle oben entnommen werden kann.
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“.


=== Keine Zahl (''NaN'') ===
:Die Mantisse ist im wesentlichen die ersten ''n'' wesentlichen Ziffern der Binärdarstellung der 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äss der Norm IEEE 754 werden nur die ''folgenden'' Ziffern gespeichert, die erste Ziffer ist eine '''implizite Ziffer''' oder ein '''implizites Bit'''. Dadurch wird gewissermassen 1 Bit Speicherplatz 'gespart'.
Damit werden ungültige (oder nicht definierte) Ergebnisse dargestellt, z.&nbsp;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 ''NaN''s 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 [[Ausnahmebehandlung|Ausnahme]] (Trap) aus, wenn sie als Operand einer arithmetischen Operation auftritt.
Als darstellbarer Zahlenbereich ergibt sich:


IEEE 754 ermöglicht dem Anwender das Deaktivieren dieser Traps. In diesem Falle werden signalisierende NaN wie stille NaN behandelt.
*<code>single</code>: ±1,18·10<sup>-38</sup> ... ±3,40·10<sup>+38</sup>
*<code>double</code>: ±2,23·10<sup>-308</sup> ... ±1,80·10<sup>+308</sup>


Signalisierende NaN können genutzt werden, um uninitialisierten Rechnerspeicher zu füllen, so dass jedes Verwenden einer uninitialisierten Variable automatisch eine Ausnahme auslöst.
== Umwandlung ==
Für die Umwandlung einer Dezimalzahl in die IEEE 754-Maschinendarstellung geht man folgendermaßen vor. Als Beispiel soll 166,125 umgewandelt werden.
# 166,125<sub>dezimal</sub> = 10100110,001<sub>binär</sub>
# Nach Verschiebung des Kommas 10100110,001<sub>binär</sub> = 1,0100110001<sub>binär</sub> * 2<sup>7</sup> Die Bits nach dem Komma (nach der Normalisierung) werden oft auch Fraction Bits genannt.
# Die Mantisse erhält man, indem man die 1 und das Komma weglässt: 0100110001. Um auf 23 Bit zu kommen wird (falls nötig) das Ende mit Nullen aufgefüllt <span style="color:#0000FF">0100110 00100000 00000000</span> oder korrekt gerundet. Bei der Rundung wird zur nächstgelegenen IEEE-Zahl gerundet, im Zweifelsfall zur nächstgelegenen geraden Darstellung (Bit rechts == 0).
# Vorzeichen: Hier "0", da es sich um eine positive Zahl handelt.
# Charakteristik: 7 (Exponent = Anzahl Stellen, um die das Komma unter 2. nach links verschoben wurde) + 127 (Bias-Wert, da Darstellungsgenauigkeit vom Typ "Single") = 134<sub>dezimal</sub> = <span style="color:#008B00">10000110</span><sub>binär</sub>
# Ergebnis als Maschinenzahl: 0 <span style="color:#008B00">10000110</span> <span style="color:#0000FF">0100110 00100000 00000000</span><sub>binär</sub> = 43 26 20 00<sub>hex</sub>


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 (Mathematik)|Division]] Null durch Null oder der [[Logarithmus]] aus einer negativen Zahl.
Wichtig ist es zu beachten, dass Fließkommazahlen nur begrenzte Genauigkeit bieten und es zwangsweise zu Rundungsfehlern kommt. Dies kommt vor allen dann zum Tragen, wenn man viele einzelne Fließkommazahlen aufsummiert. Oft addieren sich hier die Rundungsfehler.
Die Zahl 0,1<sub>dezimal</sub> z.B. ist 0,000110011001100110011...<sub>binär</sub>, also eine Zahl mit periodischen, und somit unendlich langen Nachkommastellen.
Viele Programmiersprachen bieten daher Alternative Datentypen für Kaufmännische Anwendungen an, die intern in dezimaler Schreibweise arbeiten, z.B. in [[Java (Programmiersprache)|Java]] java.math.BigDecimal.
Auch gibt es Programmiersprachen, die für numerische Berechnungen optimiert sind, z.B. [[Fortran]].


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.&nbsp;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.
== Null ==
Die Zahl ist Null, wenn sowohl Exponent und auch Mantisse gleich Null sind. Das Vorzeichen spielt in diesem Fall keine Rolle.


Das Vorzeichenbit hat bei NaN keine Bedeutung. Es ist nicht spezifiziert, welchen Wert das Vorzeichenbit bei zurückgegebenen NaN besitzt.
== Unendlich ==
Die Zahl ist unendlich, wenn der Exponent aus Einsen besteht und die Mantisse aus Nullen. Bei gesetztem Vorzeichenbit ist die Zahl positiv unendlich, ansonsten negativ.


=== Beispiel: Umwandlung von Dezimalbruch in binary32 ===
== Nichtzahlen - NaN ==
Der Dezimalbruch 18,4 soll in die Darstellung binary32 umgewandelt werden.
# Bestimmen des Exponenten: 18,4 liegt zwischen den Zweierpotenzen 16 und 32, daher ist der Exponent 4 und erfüllt die Gleichung <math>18{,}4 = 1{,}mmmmmmmm \cdot 2^4</math>.
# Bestimmen des Bias-Wertes für den Exponenten: <math>E = e + 127 = 131</math>, in binär 1000 0011.
# Normalisieren der Mantisse: 18,4 wird durch <math>2^4</math> geteilt und ergibt 1,15.
# Umwandlung des Nachkommateils in Binär: 0,15 wird mit <math>2^{23}</math> malgenommen (1.258.291,2) und auf eine ganze Zahl gerundet.
# Die ganze Zahl wird ins Binärsystem umgewandelt (001 0011 0011 0011 0011 0011) und in den Ziffern der Mantisse gespeichert.
# Die Bitfolgen für das Vorzeichen (0), den Exponenten (1000 0011) und die Mantisse (001 0011 0011 0011 0011 0011) werden verkettet: {{Nowrap|0100 0001 1001 0011 0011 0011 0011 0011}}.


=== Beispiel: Umwandlung von binary32 in Dezimalbruch ===
IEEE 754 fordert zwei Nichtzahlen: stille NaN (NaNq - ''quiet'') und Signal-NaN (NaNs - ''signal''). Beide stellen explizit keine Zahlen dar. Eine Signal-NaN löst im Gegensatz zu einer stillen NaN eine Ausnahme (Exception) aus, wenn sie als Operand einer arithmetischen Operation auftritt.
Die binary32-Gleitkommazahl mit der Bitfolge 0100 0001 1001 0011 0011 0011 0011 0011 soll in einen Dezimalbruch umgewandelt werden.


* Das Format binary32 zerlegt diese Bitfolge in die 3 Teile <math>S = 0</math>, <math>E = 1000\,0011_2</math>, <math>M = 001\,0011\,0011\,0011\,0011\,0011_2</math>.
IEEE 754 ermöglicht dem Anwender das Einstellen von Traps bei Ausnahmebedingungen. Nutzt der Anwender diese Möglichkeit nicht, so wird im allgemeinen statt einer Signal-NaN eine stille NaN erzeugt.
* Das Vorzeichenbit ist 0, daher ist die Zahl 0 oder positiv.
* Die Bits des Exponenten sind weder alle 0 noch alle 1, daher handelt es sich um eine normalisierte Zahl.
* Der gespeicherte Wert des Exponenten wird ins Dezimalsystem umgerechnet, es ergibt sich <math>E = 131</math>.
* Aus dem gespeicherten Exponenten und dem Bias wird der tatsächliche Exponent berechnet: <math>e = E - \mathit{Bias} = 131 - 127 = 4</math>.
* Da es sich um eine normalisierte Zahl handelt, wird die Mantisse links um die implizite 1 ergänzt, es ergibt sich <math>1001\,0011\,0011\,0011\,0011\,0011_2</math>.
* Die ergänzte Mantisse wird als Ganzzahl interpretiert und ins Dezimalsystem umgerechnet, es ergibt sich <math>9\,646\,899</math>.
* Die Mantisse wird durch <math>2^{23}</math> geteilt, es ergibt sich <math>m = 1{,}149\,999\,976\,158\,142\,089\,843\,75</math>.
* Der Wert der Gleitkommazahl ist <math>(-1)^S \cdot 2^e \cdot m</math>, also <math>1 \cdot 16 \cdot 1{,}149\,999\,976\,158\,142\,089\,843\,75 = 18{,}399\,999\,618\,530\,273\,437\,5</math>.


Die in diesem Bereich exakt darstellbaren Zahlen im Format binary32 sind:
Signal-NaN können je nach Rechenanlage uninitialisierten Rechnerspeicher füllen, so dass jedes Verwenden einer uninitialisierten Variable automatisch eine Ausnahme auslöst.
* 18,399&nbsp;997&nbsp;711&nbsp;181&nbsp;640&nbsp;625
* 18,399&nbsp;999&nbsp;618&nbsp;530&nbsp;273&nbsp;437&nbsp;5
* 18,400&nbsp;001&nbsp;525&nbsp;878&nbsp;906&nbsp;25


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.
Stille NaN ermöglichen den Umgang mit Rechnungen, die kein Ergebnis erzeugen können, wie die Division 0/0.

NaN erlauben auch das Abspeichern zusätzlicher Hilfsinformation, z.B. über die Ursache der NaN. Damit wird die Diagnose der Fehlerursache während der Ausnahmebehandlung ermöglicht.

== Rundungen==


== Rundungen ==
IEEE 754 unterscheidet zunächst zwischen binären Rundungen und binär-dezimalen Rundungen, bei denen geringere Qualitätsforderungen gelten.
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) muss in Richtung zur nächstgelegenen geraden Zahl gerundet werden. Damit wird der von Knuth beschriebene statistische Drift in längeren Rechnungen vermieden.
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 [[Donald E. Knuth|Knuth]] beschriebene statistische Drift in längeren Rechnungen vermieden wird.

Eine zu IEEE 754 konforme Implementierung muss drei vom Programmierer einstellbare Rundungen bereitstellen: Rundung gegen +Unendlich (immer aufrunden), Rundung gegen -Unendlich (immer abrunden) und Rundung gegen 0 (Ergebnis immer betragsmäßig verkleinern).


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).
==Operationen ==


== Operationen ==
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.
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.


=== Arithmetik und Quadratwurzel ===
=== Arithmetik und Quadratwurzel ===
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 [[Division mit Rest#Modulo|Restes]] nach einer Division mit ganzzahligem Ergebnis gefordert. Diese Restberechnung ist definiert durch <math>r = x - y \cdot n</math>, <math>n</math> ganzzahlig, <math>|n - \tfrac{x}{y}| < \tfrac{1}{2}</math> oder bei geradem <math>n</math> auch <math>|n - \tfrac{x}{y}| = \tfrac{1}{2}</math>. Dieser Rest muss ohne Rundung exakt ermittelt werden.
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. Vor allem für die Subtraktion ist das keine trivial erfüllbare Forderung (siehe Goldberg).

Weiter ist die Berechnung des Restes nach einer Division mit ganzzahligem Ergebnis gefordert. Diese Restberechnung ist definiert durch r = x - y * n, n ganzzahlig, abs (n-x/y) &lt; 1/2 oder abs (n-x/y) = 1/2 und n gerade. Dieser Rest muss ohne Rundung exakt ermittelt werden.


=== Konversionen ===
=== Konversionen ===

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.
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ützen ganzzahligen Formaten bereitstellen. Die ganzzahligen Formate werden in IEEE 754 jedoch nicht genauer definiert.
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.


Bei jedem unterstützten Gleitkommaformat muss eine Operation existieren, die diese Gleitkommazahl in die exakt gerundete ganze Zahl im selben Gleitkommaformat konvertiert.
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ügt.
Schließlich müssen Konversionen zwischen dem binären Gleitkommaformat und einem Dezimalformat existieren, die genau beschriebenen Mindestqualitätsforderungen genügen.


=== Vergleiche ===
=== Vergleiche ===
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.

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 vor allem ''unordered'' (nicht anordbar) hinzu, wenn einer der Vergleichsoperanden NaN ist. Zwei NaN sind prinzipiell verschieden, auch wenn ihre Bitmuster übereinstimmen.


=== Empfohlene Operationen ===
=== Empfohlene Operationen ===

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):
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 &ne; y, Unordered (x, y), Class (x). Die Details der Implementierung vor allem wieder bei den Sonderfällen NaN usw. sind ebenfalls vorgeschlagen.
<code>copysign(x,y)</code>, <code>invertsign(x)</code>, <code>scalb(y,n)</code>, <code>logb(x)</code>, <code>nextafter(x,y)</code>, <code>finite(x)</code>, <code>isnan(x)</code>, <code>x y</code>, <code>unordered(x,y)</code>, <code>class(x)</code>. Die Details der Implementierung vor allem wieder bei den Sonderfällen NaN usw. sind ebenfalls vorgeschlagen.

== Exceptions, Flags und Traps ==



==Anhang==

In einem Anhang werden zehn weitere Operationen (siehe dort) nicht verbindlich empfohlen.


== Ausnahmen, Flags und Traps ==
==Geschichtliches==
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.
In der [[1960]]er und frühen [[1970|70er]] Jahren hatte jeder Prozessor sein eigenes Format für Gleitkommazahlen und seine eigene [[FPU]] oder Gleitkommasoftware, mit der das jeweilige Format verarbeitet wurde. Dasselbe Programm konnte auf verschiedenen Rechnern unterschiedliche Resultate liefern. Die Qualität der verschiedenen Gleitkommaarithmetiken war logischerweise ebenfalls sehr unterschiedlich.


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.
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 FPUs für Gleitkommaarithmetik für Mikroprozessoren zu normieren. Das zweite Treffen fand im November 1977 unter dem Vorsitz von Richard Delp in [[San Francisco]] statt. Einer der Teilnehmer war Prof. Kahan.


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.
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, 1977) 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 [[Arithmetischer Unterlauf|Unterlaufs]], der bis dahin von den meisten Programmierern vernachlässigt worden war.

Intel implementierte gleichzeitig mit der Entwicklung der Norm die Normvorschläge weitgehend in der Intel FPU 8087, die als Gleitkomma-Coprozessor zum 8088 Verwendung fand.

Die endgültige Norm wurde [[1985]] verabschiedet.

<!--Die Norm geht auf die Erkenntnis zurück, dass identische Rechnungen auf unterschiedlichen Hardwarearchitekturen ('Plattformen') unterschiedliche Ergebnisse liefern können, wenn unterschiedliche Zahlendarstellungen benutzt werden. Die Norm soll sicher stellen, dass bei identischen Rechenwegen identische Resultate auch auf unterschiedlichen Plattformen erzielt werden. Sie garantiert jedoch nicht, dass unterschiedliche Rechenwege zu identischen Ergebnissen führen. So kann es sein, dass
<math> x + (y + z) \not= (x + y) + z </math>
gilt, je nach dem welche Rundungsfehler auftreten!
Diese Aussage gilt für alle Gleitkommaarithmetiken und nicht nur für IEEE!
-->


== Literatur ==
== Literatur ==
* IEEE 754: reprinted in ''SIGPLAN Notices'', Band 22, Nr. 2, Feb. 1987, S.&nbsp;9–25
* {{Literatur
|Autor=Jean-Michel Muller
|Titel=Elementary functions – Algorithms and Implementation
|Auflage=2
|Verlag=Birkhäuser
|Ort=Lyon
|Datum=2006
|ISBN=0-8176-4372-9}}


== Weblinks ==
IEEE 754: reprinted in SIGPLAN Notices Vol. 22, Nr. 2, Feb. 1987
{{Commonscat|audio=0|video=0}}
* [https://ieeexplore.ieee.org/xpl/articleDetails.jsp?arnumber=30711&filter=AND(p_Publication_Number:2355) IEEE 754-1985]
*[https://ieeexplore.ieee.org/document/8766229 ''IEEE Std 754-2019 vom 22. Juli 2019'']
* {{Internetquelle
|url=https://www.csee.umbc.edu/~tsimo1/CMSC455/IEEE-754-2008.pdf
|titel=IEEE Std 754-2008
|format=PDF
|sprache=en
|archiv-url=https://web.archive.org/web/20161106103513/http://www.csee.umbc.edu/~tsimo1/CMSC455/IEEE-754-2008.pdf
|archiv-datum=2016-11-06
|abruf=2023-02-26}}
* [https://www.h-schmidt.net/FloatConverter/IEEE754de.html Online-Umrechner zwischen Binär- und Dezimaldarstellung von IEEE 754-Gleitkommazahlen]
* [https://www.cs.berkeley.edu/~wkahan/ieee754status/754story.html Zur Geschichte: An Interview with the Old Man of Floating-Point (Reminiscences elicited from William Kahan by Charles Severance)]
* William Kahan: [https://www.cs.berkeley.edu/~wkahan/ieee754status/ieee754.ps Lecture Notes on the Status of IEEE Standard 754 for Binary Floating-Point-Arithmetic], 1996
* [https://docs.oracle.com/cd/E19957-01/806-3568/ncg_goldberg.html David Goldberg: What Every Computer Scientist Should Know About Floating-Point Arithmetic]


== Siehe auch ==
== Einzelnachweise ==
<references />
* [[Potenz (Mathematik)]]
* [[Mantisse]]
* [[Minifloat]]s
* [[einfache Genauigkeit]]
* [[doppelte Genauigkeit]]
* [[vierfache Genauigkeit]]
* [[Gleitkommazahl]]


[[Kategorie:Computerarithmetik]]
== Weblinks ==
*[http://754r.ucbtest.org/standards/754.txt IEEE 754]
* [http://www.h-schmidt.net/FloatApplet/IEEE754de.html Java-Applet zur Umrechnung zwischen Binär- und Dezimaldarstellung von IEEE 754-Fließkommazahlen]
* [http://www.cs.berkeley.edu/~wkahan/ieee754status/754story.html Zur Geschichte: An Interview with the Old Man of Floating-Point (Reminiscences elicited from William Kahan by Charles Severance)]
* William Kahan: [http://www.cs.berkeley.edu/~wkahan/ieee754status/ieee754.ps IEEE Standard 754 for Binary Floating-Point-Arithmetic], 1996
* David Goldberg: [http://cch.loria.fr/documentation/IEEE754/ACM/goldberg.pdf What Every Computer Scientist Should Know About Floating Point Arithmetic], 1991

[[Kategorie:Arithmetik]]
[[Kategorie:Normung]]
[[Kategorie:Numerische Mathematik]]
[[Kategorie:Numerische Mathematik]]
[[Kategorie:IEEE-Norm|#00754]]

[[en:IEEE floating-point standard]]
[[fr:IEEE 754]]
[[it:IEEE 754]]
[[ja:IEEE754]]
[[ko:IEEE 754]]
[[pl:IEEE 754]]

Aktuelle Version vom 3. August 2025, 12:22 Uhr

IEEE 754
Titel IEEE Standard for Floating-Point Arithmetic
Erstveröffentlichung 1985
Letzte Ausgabe 2019

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.

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 Floating Point Unit (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:

  • Vorzeichen (entweder oder )
  • Mantisse
  • Basis (entweder 2 oder 10)
  • Exponent

Um eine Gleitkommazahl bitweise zu speichern, wird sie in 3 Bitfolgen zerlegt:

  • (1 Bit) für das Vorzeichen
  • ( Bits) für die Mantisse
  • ( Bits) für den Exponenten

Das Vorzeichen wird im 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 ∞.

Zahlenformate und andere Festlegungen des IEEE-754-Standards

[Bearbeiten | Quelltext bearbeiten]

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
07 … 80 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
09 … 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
Bitdarstellung einer binary32-Zahl in Big-Endian-Darstellung

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.

Interpretation des Zahlenformats

[Bearbeiten | Quelltext bearbeiten]

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) × 2EB ±1,M × 2EB 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.

Normalisierte Zahl

[Bearbeiten | Quelltext bearbeiten]

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“.

Denormalisierte Zahl

[Bearbeiten | Quelltext bearbeiten]

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“.

Keine Zahl (NaN)

[Bearbeiten | Quelltext bearbeiten]

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.

Beispiel: Umwandlung von Dezimalbruch in binary32

[Bearbeiten | Quelltext bearbeiten]

Der Dezimalbruch 18,4 soll in die Darstellung binary32 umgewandelt werden.

  1. Bestimmen des Exponenten: 18,4 liegt zwischen den Zweierpotenzen 16 und 32, daher ist der Exponent 4 und erfüllt die Gleichung .
  2. Bestimmen des Bias-Wertes für den Exponenten: , in binär 1000 0011.
  3. Normalisieren der Mantisse: 18,4 wird durch geteilt und ergibt 1,15.
  4. Umwandlung des Nachkommateils in Binär: 0,15 wird mit malgenommen (1.258.291,2) und auf eine ganze Zahl gerundet.
  5. Die ganze Zahl wird ins Binärsystem umgewandelt (001 0011 0011 0011 0011 0011) und in den Ziffern der Mantisse gespeichert.
  6. Die Bitfolgen für das Vorzeichen (0), den Exponenten (1000 0011) und die Mantisse (001 0011 0011 0011 0011 0011) werden verkettet: 0100 0001 1001 0011 0011 0011 0011 0011.

Beispiel: Umwandlung von binary32 in Dezimalbruch

[Bearbeiten | Quelltext bearbeiten]

Die binary32-Gleitkommazahl mit der Bitfolge 0100 0001 1001 0011 0011 0011 0011 0011 soll in einen Dezimalbruch umgewandelt werden.

  • Das Format binary32 zerlegt diese Bitfolge in die 3 Teile , , .
  • Das Vorzeichenbit ist 0, daher ist die Zahl 0 oder positiv.
  • Die Bits des Exponenten sind weder alle 0 noch alle 1, daher handelt es sich um eine normalisierte Zahl.
  • Der gespeicherte Wert des Exponenten wird ins Dezimalsystem umgerechnet, es ergibt sich .
  • Aus dem gespeicherten Exponenten und dem Bias wird der tatsächliche Exponent berechnet: .
  • Da es sich um eine normalisierte Zahl handelt, wird die Mantisse links um die implizite 1 ergänzt, es ergibt sich .
  • Die ergänzte Mantisse wird als Ganzzahl interpretiert und ins Dezimalsystem umgerechnet, es ergibt sich .
  • Die Mantisse wird durch geteilt, es ergibt sich .
  • Der Wert der Gleitkommazahl ist , also .

Die in diesem Bereich exakt darstellbaren Zahlen im Format binary32 sind:

  • 18,399 997 711 181 640 625
  • 18,399 999 618 530 273 437 5
  • 18,400 001 525 878 906 25

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.

Arithmetik und Quadratwurzel

[Bearbeiten | Quelltext bearbeiten]

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.

Empfohlene Operationen

[Bearbeiten | Quelltext bearbeiten]

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.

Ausnahmen, Flags und Traps

[Bearbeiten | Quelltext bearbeiten]

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.

  • IEEE 754: reprinted in SIGPLAN Notices, Band 22, Nr. 2, Feb. 1987, S. 9–25
  • Jean-Michel Muller: Elementary functions – Algorithms and Implementation. 2. Auflage. Birkhäuser, Lyon 2006, ISBN 0-8176-4372-9.
Commons: IEEE 754 – Sammlung von Bildern

Einzelnachweise

[Bearbeiten | Quelltext bearbeiten]
  1. "IEEE Standard for Binary Floating-Point Arithmetic," in ANSI/IEEE Std 754-1985, S. 1–20, 12. Okt. 1985, doi:10.1109/IEEESTD.1985.82928.
  2. "IEEE Standard for Floating-Point Arithmetic", in IEEE Std 754-2008, S. 1–70, 29. Aug. 2008, doi:10.1109/IEEESTD.2008.4610935.
  3. IEEE Standard for Floating-Point Arithmetic. In: IEEE Std 754-2019 (Revision of IEEE 754-2008). Juli 2019, S. 1–84, doi:10.1109/IEEESTD.2019.8766229 (ieee.org [abgerufen am 5. Februar 2020]).
  4. David Goldberg: What Every Computer Scientist Should Know About Floating-Point Arithmetic. In: ACM Computing Surveys. 23. Jahrgang, 1991, S. 5–48, doi:10.1145/103162.103163 (englisch, sun.com [abgerufen am 2. September 2010]).
  5. Shawn Casey: x87 and SSE Floating Point Assists in IA-32: Flush-To-Zero (FTZ) and Denormals-Are-Zero (DAZ). 16. Oktober 2008, abgerufen am 3. September 2010 (englisch).