„IEEE 754-2008“ – Versionsunterschied

aus Wikipedia, der freien Enzyklopädie
Zur Navigation springen Zur Suche springen
[gesichtete Version][gesichtete Version]
Inhalt gelöscht Inhalt hinzugefügt
K kursiv korrigiert
 
(18 dazwischenliegende Versionen von 11 Benutzern werden nicht angezeigt)
Zeile 1: Zeile 1:
Der Standard '''IEEE 754-2008''', der frühere Arbeitstitel lautete '''IEEE 754r''', ist eine notwendig gewordene Revision des 1985 verabschiedeten Gleitkommastandards [[IEEE 754]]. Der alte Standard war sehr erfolgreich und wurde in zahlreichen Prozessoren und Programmiersprachen übernommen. Die Diskussion über die Revision begann im Jahr 2001; im Juni 2008 wurde der Standard angenommen und im August 2008 verabschiedet.<ref name="ieee754-2008">''IEEE 754-2008: Standard for Floating-Point Arithmetic''. IEEE Standards Association, 2008, [[doi:10.1109/IEEESTD.2008.4610935]]</ref>
Der Standard '''IEEE 754-2008''', der frühere Arbeitstitel lautete '''IEEE 754r''', ist eine Überarbeitung des erstmals 1985 von dem [[American National Standards Institute|ANSI]] und [[Institute of Electrical and Electronics Engineers|IEEE]] gemeinsam verabschiedeten Gleitkommastandards [[IEEE 754]]. Der originale Standard und seine internationale Fassung (''[[International Electrotechnical Commission|IEC]]-60559:1989'') waren sehr erfolgreich und wurden in zahlreiche Prozessoren und Programmiersprachen übernommen.
Die Diskussion über die 2008er-Ausgabe begann im Jahr 2001; im Juni 2008 wurde der Standard angenommen und im August 2008 verabschiedet.<ref name="ieee754-2008">''IEEE 754-2008: Standard for Floating-Point Arithmetic''. IEEE Standards Association, 2008, [[doi:10.1109/IEEESTD.2008.4610935]]</ref>
Die nochmals überarbeitete Ausgabe des Standards, '''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=2023-12-30 |DOI=10.1109/IEEESTD.2019.8766229}}</ref>, hat sich gegenüber 2008 nur geringfügig geändert – sie enthält hauptsächlich Klarstellungen, behebt erkannte Probleme und empfiehlt zusätzliche Rechenoperationen.


== Hauptziele ==
== Hauptziele ==
Die Hauptziele des verabschiedeten Standards konnten aufgeteilt werden in
Die Hauptziele des verabschiedeten Standards können aufgeteilt werden in
* das Zusammenführen von [[IEEE 754]] und [[IEEE 854]],
* das Zusammenführen von [[IEEE 754]] und [[IEEE 854]],
* die Reduktion von Implementierungsalternativen,
* die Reduktion von Implementierungsalternativen,
* die Entfernung von Mehrdeutigkeiten der bisherigen IEEE 754,
* die Entfernung von Mehrdeutigkeiten der bisherigen IEEE 754,
* ein zusätzliches kumulierendes Produkt ''fused multiply-add'': <code>FMA(A,B,C) = A·B + C</code>,
* ein zusätzliches kumulierendes Produkt ''fused multiply-add'': <code>FMA(A,B,C) = A·B + C</code>,
* neben einfacher und doppelter auch Arithmetik mit halber und vierfacher Genauigkeit (zusätzlich zu 32 und 64 Bit auch 16 und 128 Bit),
* neben ''einfacher'' und ''doppelter'' auch Arithmetik mit ''halber'' und ''vierfacher Genauigkeit'' (zusätzlich zu 32 und 64 Bit auch 16 und 128 Bit),
* die von der Finanzwirtschaft als notwendig erachteten Dezimalformate (IEEE 854),
* die von der Finanzwirtschaft als notwendig erachteten Dezimalformate (IEEE 854),
* weitere variable Formate und Austauschformate,
* weitere variable Formate und Austauschformate,
* min und max mit Spezifikationen für die Spezialfälle ±0 und ±∞ sowie
* min und max mit Spezifikationen für die Spezialfälle ±0 und ±∞, sowie
* Kosmetik: ab sofort heißt „denormalisiert“ „subnormal“
* Kosmetik: „''denormalisiert''“ heißt ab sofort „''subnormal''“.


Der Standard soll Formate und Methoden für Gleitkommaarithmetik sowie eine Mindestqualität definieren.
Der Standard soll Formate und Methoden für Gleitkommaarithmetik sowie eine Mindestqualität definieren.


== Formate ==
== Formate ==
Formate umfassen Gleitkommazahlen mit halber (16 Bit), einfacher (32 Bit), doppelter (64 Bit) sowie vierfacher (128 Bit) Genauigkeit. Das Halbformat stellt ein standardisiertes [[Minifloat]] dar.
Formate umfassen Gleitkommazahlen mit ''halber'' (16 Bit), ''einfacher'' (32 Bit), ''doppelter'' (64 Bit) sowie ''vierfacher'' (128 Bit) Genauigkeit. Das Halbformat stellt ein standardisiertes [[Minifloat]] dar.
Ergänzt werden die Grundformate durch erweiterte (extended) und erweiterbare (neu!) Langzahl-Formate. Ebenfalls neu aufgenommen wurden Datenaustauschformate.
Ergänzt werden die Grundformate durch erweiterte (''extended'') und erweiterbare (neu!) ''Langzahl''-Formate. Ebenfalls neu aufgenommen wurden Datenaustauschformate.
Neben der 16/32/64/128-Bit-Darstellungen sind Darstellungen mit einem Vielfachen von 32 Bits definiert.
Neben der 16/32/64/128-Bit-Darstellungen sind Darstellungen mit einem Vielfachen von 32 Bit definiert.


Dicht gepackte Dezimalformate (DFP, 3 Ziffern in 10 Bit) sind ebenfalls dazugekommen. Sie weichen von klassischen einzelzifferbasierten BCD-Formaten folgendermaßen ab:
Dicht gepackte Dezimalformate (''DFP'', 3 Ziffern in 10 Bit) sind ebenfalls dazugekommen. Sie weichen von klassischen einzelzifferbasierten [[BCD-Code|BCD]]-Formaten folgendermaßen ab:
* Die Kapazität der nutzbaren Bits wird gut ausgenutzt, da 3 Dezimalziffern (000...999, 1000 genutzte Werte) in jeweils 10 Bit (0...1023, 1024 mögliche Werte) gespeichert werden. Eine solche Gruppe heißt '''Declet'''. Der Verschnitt ist gegenüber klassischen BCD-Zahlen deutlich kleiner. Die letzte Spalte der Tabelle enthält den Informationsgehalt in Bit, der nur geringfügig geringer ist als der Speicherplatz (bei d=7 Mantissenziffern und einem Exponentenwertebereich von emin - emax unter Berücksichtigung der Vorzeichenbits <math>1 + d \cdot \log_2 10 + \log_2 (e_\text{max}-e_\text{min})</math>).
* Die Kapazität der nutzbaren Bits wird gut ausgenutzt, da 3 Dezimalziffern (000...999, 1000 genutzte Werte) in jeweils 10 Bit (0...1023, 1024 mögliche Werte) gespeichert werden. Eine solche Gruppe heißt '''''Declet'''''. Der Verschnitt ist gegenüber klassischen BCD-Zahlen deutlich kleiner. Die letzte Spalte der Tabelle enthält den Informationsgehalt in Bit, der nur geringfügig geringer ist als der Speicherplatz (bei d=7 Mantissenziffern und einem Exponentenwertebereich von emin - emax unter Berücksichtigung der Vorzeichenbits <math>1 + d \cdot \log_2 10 + \log_2 (e_\text{max}-e_\text{min})</math>).
* Die Verarbeitung der Dezimalziffern in Dreiergruppen kommt der üblichen Gruppierungsgewohnheit (23&#8239;223&#8239;456; 24 W, 24 kW, 24 MW) entgegen.
* Die Verarbeitung der Dezimalziffern in Dreiergruppen kommt der üblichen Gruppierungsgewohnheit (23&#8239;223&#8239;456; 24 W, 24&nbsp;kW, 24 MW) entgegen.
* Die Zahl 0 hat auch das Bitmuster „0000…0“. Allerdings hat 0 eine relativ große Kohorte.
* Die Zahl 0 hat auch das Bitmuster „0000…0“. Allerdings hat 0 eine relativ große Kohorte.
* Die Zahlen 0 bis 9 eines Declets haben in den 6 führenden Bits eine 0.
* Die Zahlen 0 bis 9 eines ''Declets'' haben in den 6 führenden Bits eine 0.
* Die Zahlen 10 bis 99 eines Declets haben in den 3 führenden Bits eine 0.
* Die Zahlen 10 bis 99 eines ''Declets'' haben in den 3 führenden Bits eine 0.
* Ungerade Zahlen in Declets können mit Hilfe eines einzelnen Bits erkannt werden.
* Ungerade Zahlen in ''Declets'' können mit Hilfe eines einzelnen Bits erkannt werden.
* Die 24 unbenutzten Bitmuster ddx11x111x mit dd = 01, 10 oder 11 können leicht identifiziert werden.
* Die 24 unbenutzten Bitmuster ddx11x111x mit dd = 01, 10 oder 11 können leicht identifiziert werden.
* Die so mit Declets gepackten Zahlen (Densely Packed) sind nicht mehr binär sortierbar, im Gegensatz zu „klassischen BCD-Formaten“.
* Die so mit ''Declets'' gepackten Zahlen (''Densely Packed'') sind nicht mehr binär sortierbar, im Gegensatz zu „klassischen BCD-Formaten“.
* Statt Speicherung in Declets kann die Mantisse auch ganzzahlig binär in einem gleich großen Bitfeld gespeichert werden. Die Bitfeldaufteilung ist im Combinationfield dann anders.
* Statt Speicherung in ''Declets'' kann die Mantisse auch ganzzahlig binär in einem gleich großen Bitfeld gespeichert werden. Die Bitfeldaufteilung ist im ''Kombinationsfeld'' dann anders.
* Eine Zahl ist nicht eindeutig; mehrere Bitmuster können dieselbe Zahl bezeichnen. Die Menge der Bitmuster einer Zahl heißt Kohorte. Innerhalb einer Kohorte wurde jedoch jeweils eine kanonische Darstellung festgelegt.
* Eine Zahl ist nicht eindeutig; mehrere Bitmuster können dieselbe Zahl bezeichnen. Die Menge der Bitmuster einer Zahl heißt ''Kohorte''. Innerhalb einer Kohorte wurde jedoch jeweils eine kanonische Darstellung festgelegt.


Signaling&nbsp;NaNs wurden zur Streichung vorgeschlagen (3. Februar 2003), später aber wieder in den Vorschlag aufgenommen (21. Februar 2003).
Signaling&nbsp;NaNs wurden zur Streichung vorgeschlagen (3. Februar 2003), später aber wieder in den Vorschlag aufgenommen (21. Februar 2003).
Zeile 37: Zeile 39:


{| class="wikitable" style="border-width:0;"
{| class="wikitable" style="border-width:0;"
|- class="hintergrundfarbe6"
|- class="hintergrundfarbe6" style="line-height:120%"
!rowspan="3"| Typ
!rowspan="3"| Typ
!rowspan="3"| Speicher-<br />bedarf
!rowspan="3"| Spei-<br>cher-<br />bedarf
!colspan="2"| Mantisse
!colspan="2"| Mantisse
!colspan="5"| Exponent
!colspan="5"| Exponent
!rowspan="3"| Infor-<br />mations-<br />gehalt<br />in Bit
!rowspan="3"| Infor-<br />mations-<br />gehalt<br />in Bit
|- class="hintergrundfarbe6"
|- class="hintergrundfarbe6" style="line-height:120%"
!rowspan="2"| Bits '''m'''
!rowspan="2"| Bits '''m'''
!rowspan="2"| effektive Bits einer<br />normalisierten Zahl<br />'''p'''
!rowspan="2" style="max-width:85px"| effektive Bits einer normali&shy;sier&shy;ten Zahl '''p'''
!rowspan="2"| Bits '''e'''
!rowspan="2"| Bits '''e'''
!colspan="3"| Wertebereich
!colspan="3"| Wertebereich
!rowspan="2"| Werte der Ko-<br />horte einer nor-<br />malisierten Zahl
!rowspan="2" style="max-width:90px" | Werte der Ko&shy;horte einer nor&shy;ma&shy;li&shy;sier&shy;ten Zahl
|- class="hintergrundfarbe6"
|- class="hintergrundfarbe6"
! e<sub>min</sub>
! e<sub>min</sub>
Zeile 56: Zeile 58:
|style="border-width:0; background-color:#FFF;" colspan="10" |
|style="border-width:0; background-color:#FFF;" colspan="10" |
|-
|-
|class="hintergrundfarbe8"| b16 (half) || {{0}}16 Bit || {{0}}10 || {{0}}11 || {{0}}5 || {{0}}{{0}}{{0}}−14 || {{0}}{{0}}{{0}}15 || {{0}}{{0}}{{0}}15 || 1 ≤ E ≤ 30 || {{0}}16
|class="hintergrundfarbe8"| b16 (''half'') || {{0}}16 Bit || {{0}}10 || {{0}}11 || {{0}}5 || {{0}}{{0}}{{0}}{{0}}−14 || {{0}}{{0}}{{0}}{{0}}15 || {{0}}{{0}}{{0}}{{0}}15 || 1 ≤ E ≤ 30 || {{0}}16
|-
|-
|class="hintergrundfarbe8"| b32 (single) || {{0}}32 Bit || {{0}}23 || {{0}}24 || {{0}}8 || {{0}}{{0}}−126 || {{0}}{{0}}127 || {{0}}{{0}}127 || 1 ≤ E ≤ 254 || {{0}}32
|class="hintergrundfarbe8"| b32 (''single'') || {{0}}32 Bit || {{0}}23 || {{0}}24 || {{0}}8 || {{0}}{{0}}{{0}}−126 || {{0}}{{0}}{{0}}127 || {{0}}{{0}}{{0}}127 || 1 ≤ E ≤ 254 || {{0}}32
|-
|-
|class="hintergrundfarbe8"| b64 (double) || {{0}}64 Bit || {{0}}52 || {{0}}53 || 11 || {{0}}−1022 || {{0}}1023 || {{0}}1023 || 1 ≤ E ≤ 2046 || {{0}}64
|class="hintergrundfarbe8"| b64 (''double'') || {{0}}64 Bit || {{0}}52 || {{0}}53 || 11 || {{0}}{{0}}−1.022 || {{0}}{{0}}1.023 || {{0}}{{0}}1.023 || 1 ≤ E ≤ 2.046 || {{0}}64
|-
|-
|class="hintergrundfarbe8"| b128 (quad) || 128 Bit || 112 || 113 || 15 || −16382 || 16383 || 16383 || 1 ≤ E ≤ 32766 || 128
|class="hintergrundfarbe8"| b128 (''quadruple'') || 128 Bit || 112 || 113 || 15 || {{0}}−16.382 || {{0}}16.383 || {{0}}16.383 || 1 ≤ E ≤ 32.766 || 128
|-
|-
|class="hintergrundfarbe8"| k = 32j mit j 4 || {{0}}{{0}}k Bit || k rnd(4·ld(k)) + 12 || k rnd(4·ld(k)) + 13 || rnd(4·ld(k)) 13 || 1 emax || 2<sup>k−p−1</sup> 1|| || {{0}}{{0}}emax || {{0}}{{0}}k
|class="hintergrundfarbe8"| b256 (''octuple'') || 256 Bit || 236 || 237 || 19 || −262.142 || 262.143 || 262.143 || 1 ≤ E ≤ 524.286 || 256
|- style="line-height:120%"
|class="hintergrundfarbe8"| k = 32j<br> ''mit'' j ≥ 4 || {{0}}{{0}}k Bit || k + 12 −<br>rnd(4·ld k) || k + 13 −<br>rnd(4·ld k) || rnd(4·ld k)<br>− 13 || 1 − e<sub>max</sub> || 2<sup>k−p−1</sup> − 1 || e<sub>max</sub> || 1 ≤ E ≤ 2·e<sub>max</sub> || {{0}}{{0}}k
|-
|-
|style="border-width:0; background-color:#FFF;" colspan="10" |
|style="border-width:0; background-color:#FFF;" colspan="10" |
|-
|-
|class="hintergrundfarbe7"| d32 || {{0}}32 Bit || {{0}}20+5{{FN|(a)}} || {{0}}7 &nbsp;'''Ziffern''' || {{0}}6 || {{0}}{{0}}−95 || {{0}}{{0}}96 || {{0}}101 || || {{0}}31,83
|class="hintergrundfarbe7"| '''d'''32 || {{0}}32 Bit ||align="right"| {{FN|(a)}}20+5 ||align="right"| 7 ''Ziffern'' || {{0}}6 || {{0}}{{0}}−95 || {{0}}{{0}}96 || {{0}}101 || || {{0}}31,83
|-
|-
|class="hintergrundfarbe7"| d64 || {{0}}64 Bit || {{0}}50+5 || 16 &nbsp;'''Ziffern''' || {{0}}8 || {{0}}−383 || {{0}}384 || {{0}}398 || || {{0}}63,73
|class="hintergrundfarbe7"| '''d'''64 || {{0}}64 Bit ||align="right"| 50+5 ||align="right"| 16 ''Ziffern'' || {{0}}8 || {{0}}−383 || {{0}}384 || {{0}}398 || || {{0}}63,73
|-
|-
|class="hintergrundfarbe7"| d128 || 128 Bit || 110+5 || 34 &nbsp;'''Ziffern''' || 12 || −6143 || 6144 || 6176 || || 127,53
|class="hintergrundfarbe7"| '''d'''128 || 128 Bit ||align="right"| 110+5 ||align="right"| 34 ''Ziffern'' || 12 || −6.143 || 6.144 || 6.176 || || 127,53
|- style="line-height:120%"
|-
|class="hintergrundfarbe7"| k = 32j mit j 1 || {{0}}{{0}}k Bit || 15 k/16 − 10 || 9 k/32 − 2 &nbsp;'''Ziffern''' || k/16 + 4 || 1 − emax || 3·2<sup>k/16+3</sup> || emax + p − 2 || ||
|class="hintergrundfarbe7"| '''d'''32''k'' ''mit'' ''k''&#8239;&#8239;1 || 32k Bit ||align="right"| 30''k''−10+5 ||align="right"| 9''k'' − 2 ''Ziffern'' || 2''k'' + 4 || 1 − e<sub>max</sub> || 3·2<sup>2''k''+3</sup> || e<sub>max</sub>+p−2 || || {{0}}31,9''k''−0,07
|}
|}


{{FNBox|
{{FNBox|
{{FNZ|(a)|20+5 in Spalte 3 bedeutet:
{{FNZ|(a)|20+5 (in Spalte 3) bedeutet:
* in den 20 Bits werden 6 Dezimalstellen gespeichert (3&nbsp;Stellen in jeweils 10&nbsp;Bit)
*&emsp; in den 20 Bits werden 6 Dezimalstellen der Mantisse gespeichert (3&nbsp;Stellen in jeweils 10&nbsp;Bit)
* in den 5 übrigen Bits wird gespeichert:
*&emsp; in den 5 übrigen Bits wird gespeichert:
** eine weitere Dezimalstelle
**&emsp; eine weitere Dezimalstelle der Mantisse (ergibt 10 Möglichkeiten)
** der Rest des Exponents bei Division durch 3
**&emsp; der Rest des Exponents bei Division durch 3 (der Quotient selbst wird in den '''Bits&#8239;e''' gespeichert) (ergibt 30 Möglichkeiten)
** Signalisierungen für NaNs und Infs
**&emsp; Signalisierungen für <code>±NANs</code> und <code>±INFs</code> (ergibt 32 Möglichkeiten)
}}
}}
}}
}}


Zeile 93: Zeile 97:
* verkleinernd (in Richtung −unendlich)
* verkleinernd (in Richtung −unendlich)
* betragsverkleinernd (in Richtung 0)
* betragsverkleinernd (in Richtung 0)
* bestmöglich und in der Mitte zur nächsten geraden Zahl (to next or to even)
* bestmöglich und in der Mitte zur nächsten geraden Zahl (''to next or to even'')
* bestmöglich und in der Mitte betragsvergrößernd (to next – neu in IEEE 754r, eigentlich nur die klassische Handrechnungsrundung)
* bestmöglich und in der Mitte betragsvergrößernd (''to next'' zwar neu in IEEE 754r, aber eigentlich nur die klassische Handrechnungsrundung)

Die IEEE 754-Rundung (next even) wurde schon von [[Carl Friedrich Gauß]] vorgeschlagen und vermeidet ein statistisches Ungleichgewicht bei längeren Rechnungen zu größeren Zahlen hin.


Die IEEE 754-Rundung (''next even'') wurde schon von [[Carl Friedrich Gauß]] vorgeschlagen und vermeidet ein statistisches Ungleichgewicht bei längeren Rechnungen zu größeren Zahlen hin.
In der Diskussion um den neuen Standard wird diese Erkenntnis offensichtlich wieder verworfen und die „Handrechnungsrundung“ (to next) wieder eingeführt.


== Ausnahmen ==
== Ausnahmen ==
Zeile 114: Zeile 116:
! Gewinn
! Gewinn
|-
|-
| {{0}}32 bit
| {{0}}32 Bit
| {{0}}7×4 + {{0}}7,58 + 1 bit = {{0}}36,58 bit || {{0}}+4,48 bit
| {{0}}7×4 + {{0}}7,58 + 1 Bit = {{0}}36,58 Bit || {{0}}+4,48 Bit
|-
|-
| {{0}}64 bit
| {{0}}64 Bit
| 16×4 + {{0}}9,58 + 1 bit = {{0}}74,58 bit || +10,48 bit
| 16×4 + {{0}}9,58 + 1 Bit = {{0}}74,58 Bit || +10,48 Bit
|-
|-
| 128 bit
| 128 Bit
| 34×4 + 13,58 + 1 bit = 150,58 bit || +22,48 bit
| 34×4 + 13,58 + 1 Bit = 150,58 Bit || +22,48 Bit
|}
|}


Die primäre Idee hinter der dicht gepackten Dezimaldarstellung ist, dass diese mit extrem wenig (Gatter-)Aufwand in eine klassische BCD-Darstellung für die Mantisse sowie einen binären Exponenten umkodiert werden kann, aber gleichzeitig den Speicherplatz so effizient wie möglich ausnutzt. Die eigentliche Verarbeitung findet dann im klassischen BCD-Format statt, nur beim Lesen und Schreiben von Registern ist eine Umkodierung erforderlich.
Die primäre Idee hinter der dicht gepackten Dezimaldarstellung ist, dass diese mit extrem wenig (Gatter-)Aufwand in eine klassische BCD-Darstellung für die Mantisse sowie einen binären Exponenten umkodiert werden kann, aber gleichzeitig den Speicherplatz so effizient wie möglich ausnutzt. Die eigentliche Verarbeitung findet dann im klassischen BCD-Format statt, nur beim Lesen und Schreiben von Registern ist eine Umkodierung erforderlich.


Die Kodierung von 32-bit-, 64-bit- und 128-bit-dezimalkodierten Zahlen erfolgt nach folgendem Schema.
Die Kodierung von 32-Bit-, 64-Bit- und 128-Bit-dezimalkodierten Zahlen erfolgt nach folgendem Schema.
Für längere Dezimalkodierungen werden für jedes weitere 32-bit-Wort dem Exponenten 2 bit und der Mantisse 30 bit (3× 10 bit) zugeschlagen, so dass unter Beibehaltung des 5-bit-Kombinationsfeldes der Wertebereich des Exponenten sich vervierfacht und die Mantisse weitere neun Ziffern erhält.
Für längere Dezimalkodierungen werden für jedes weitere 32-Bit-Wort dem Exponenten 2 Bit und der Mantisse 30 Bit (3×&#8239;10 Bit) zugeschlagen, so dass unter Beibehaltung des 5-Bit-Kombinationsfeldes der Wertebereich des Exponenten sich vervierfacht und die Mantisse weitere neun Ziffern erhält.


{| class="wikitable" style="text-align:left; border-width:0;"
{| class="wikitable" style="text-align:left; border-width:0;"
|-
|-
! Format !! Vorzeichen !!colspan="2"| Kombinationsfeld !! restl. Exponent !!colspan="9"| restliche Mantisse
! Format !! Vorzeichen !!colspan="2"| Kombinationsfeld !! restl.&#8239;Exponent !!colspan="9"| restliche Mantisse
|- style="text-align:center;"
|- style="text-align:center; line-height:100%"
!rowspan="2"| {{0}}32 bit
!rowspan="2"| {{0}}32 Bit
| 1 bit ||colspan="2"| 5 bits || {{0}}6 bits ||colspan="9"| {{0}}20 bits
| 1 Bit ||colspan="2"| 5 Bits || {{0}}6 Bits ||colspan="9"| {{0}}20 Bits
|-
|-
|style="text-align:center"| '''s''' ||colspan="2" style="text-align:center"| '''m m m m m''' || '''xxxxxx''' ||colspan="9"| '''bbbbbbbbbb bbbbbbbbbb'''
|style="text-align:center"| '''s''' ||colspan="2" style="text-align:center"| '''m m m m m''' || '''xxxxxx''' ||colspan="9"| '''bbbbbbbbbb bbbbbbbbbb'''
|- style="text-align:center;"
|- style="text-align:center; line-height:100%"
!rowspan="2"| {{0}}64 bit
!rowspan="2"| {{0}}64 Bit
| 1 bit ||colspan="2"| 5 bits || {{0}}8 bits ||colspan="9"| {{0}}50 bits
| 1 Bit ||colspan="2"| 5 Bits || {{0}}8 Bits ||colspan="9"| {{0}}50 Bits
|-
|-
|style="text-align:center"| '''s''' ||colspan="2" style="text-align:center"| '''m m m m m''' || '''xxxxxxxx''' ||colspan="9"| '''bbbbbbbbbb bbbbbbbbbb bbbbbbbbbb bbbbbbbbbb bbbbbbbbbb'''
|style="text-align:center"| '''s''' ||colspan="2" style="text-align:center"| '''m m m m m''' || '''xxxxxxxx''' ||colspan="9"| '''bbbbbbbbbb bbbbbbbbbb bbbbbbbbbb bbbbbbbbbb bbbbbbbbbb'''
|- style="text-align:center;"
|- style="text-align:center; line-height:100%"
!rowspan="2"| 128 bit
!rowspan="2"| 128 Bit
| 1 bit ||colspan="2"| 5 bits || 12 bits g ||colspan="9"| 110 bits
| 1 Bit ||colspan="2"| 5 Bits || 12 Bits ||colspan="9"| 110 Bits
|-
|-
|style="text-align:center"| '''s''' ||colspan="2" style="text-align:center"| '''m m m m m''' || '''xxxxxxxxxxxx''' ||colspan="9"| '''bbbbbbbbbb bbbbbbbbbb bbbbbbbbbb bbbbbbbbbb bbbbbbbbbb<br />bbbbbbbbbb bbbbbbbbbb bbbbbbbbbb bbbbbbbbbb bbbbbbbbbb<br />bbbbbbbbbb'''
|style="text-align:center"| '''s''' ||colspan="2" style="text-align:center"| '''m m m m m''' || '''xxxxxxxxxxxx''' ||colspan="9"| '''bbbbbbbbbb bbbbbbbbbb bbbbbbbbbb bbbbbbbbbb bbbbbbbbbb<br />bbbbbbbbbb bbbbbbbbbb bbbbbbbbbb bbbbbbbbbb bbbbbbbbbb<br />bbbbbbbbbb'''
|- class="hintergrundfarbe5"
|- class="hintergrundfarbe5"
|rowspan="2"| || '''0''': positiv<br />'''1''': negativ ||colspan="2" style="text-align:center"| Kodierung der MSBs<br />nach Tabelle 1 ||style="text-align:center"| binäre<br />Kodierung ||colspan="9" style="text-align:center"| Jedes '''Declet''' ist nach Tabelle 2 kodiert und liefert drei weitere Ziffern.
|rowspan="2"| || '''0''': positiv<br />'''1''': negativ ||colspan="2" style="text-align:center"| Kodierung&#8239;der&#8239;MSBs<br />nach Tabelle 1 ||style="text-align:center"| binäre<br />Kodierung ||colspan="9" style="text-align:center"| Jedes '''Declet''' ist nach Tabelle 2 kodiert und liefert drei weitere Ziffern.
|-
|-
|style="background:#777777; color:#FFFFFF;"| Vorzeichen
|style="width:70px;background:#777777; color:#FFFFFF;"| Vorzeichen
|style="background:#DDCEF2; text-align:center;"| Ziffer 1
|style="width:40px;background:#DDCEF2; border-right-width:0;text-align:center;"| Ziffer&#8239;1
|style="background:#ffefdf; border-right-width:0; text-align:right;"| MSB +
|style="width:70px;background:#ffefdf; border-left-width:0;"| Expon.&#8239;MSB
|style="background:#FFEFDF; border-left-width:0;"| LSB Exponent
|style="width:70px;background:#FFEFDF; border-left-width:0;"| Expon.&#8239;LSB
|style="background:#CEF2E0"| Ziffer 2 ||style="background:#CEDFF2"| Ziffer 3 ||style="background:#DDCEF2"| Ziffer 4
|style="width:40px;background:#CEF2E0;border-right-width:0;"| Ziffer&#8239;2 ||style="width:40px;background:#CEDFF2;border-left-width:0;border-right-width:0;"| Ziffer&#8239;3 ||style="width:40px;background:#DDCEF2;border-left-width:0;"| Ziffer&#8239;4
|style="background:#CEF2E0"| Ziffer 5 ||style="background:#CEDFF2"| Ziffer 6 ||style="background:#DDCEF2"| Ziffer 7
|style="width:40px;background:#CEF2E0;border-right-width:0;"| Ziffer&#8239;5 ||style="width:40px;background:#CEDFF2;border-left-width:0;border-right-width:0;"| Ziffer&#8239;6 ||style="width:40px;background:#DDCEF2;border-left-width:0;"| Ziffer&#8239;7
|style="background:#CEF2E0"| Ziffer 8 ||style="background:#CEDFF2"| Ziffer 9 || ...
|style="width:40px;background:#CEF2E0;border-right-width:0;"| Ziffer&#8239;8 ||style="width:40px;background:#CEDFF2;border-left-width:0;border-right-width:0;"| Ziffer&#8239;9 ||style="width:40px;background:#DDCEF2;border-left-width:0;text-align:center;"| '''...'''
|}
|}


Die Zahl besteht aus
Die Zahl besteht aus
* einem Vorzeichen: dieses wird im Vorzeichenbit '''s''' gespeichert.
* einem Vorzeichen: dieses wird im Vorzeichenbit '''s''' gespeichert.
* einem Exponenten, der seinen Wertebereich von '''e<sub>min</sub>'''&#8239;...&#8239;'''e<sub>max</sub>''' unter Zuhilfenahme eines Bias auf die Werte 0&#8239;...&#8239;3&#8239;·&#8239;2<sup>'''e'''</sup>&#8239;−&#8239;1 = (0&#8239;...&#8239;2)&#8239;·&#8239;2<sup>'''e'''</sup>&#8239;+ (0&#8239;...&#8239;2<sup>'''e'''</sup>&#8239;−&#8239;1) abbildet. Die oberen drei Zustände werden im Kombinationsfeld, die restlichen '''e''' bit binär im restlichen Exponenten gespeichert.
* einem Exponenten, der seinen Wertebereich von '''e<sub>min</sub>'''&#8239;...&#8239;'''e<sub>max</sub>''' unter Zuhilfenahme eines Bias auf die Werte 0&#8239;...&#8239;3&#8239;·&#8239;2<sup>'''e'''</sup>&#8239;−&#8239;1 = (0&#8239;...&#8239;2)&#8239;·&#8239;2<sup>'''e'''</sup>&#8239;+ (0&#8239;...&#8239;2<sup>'''e'''</sup>&#8239;−&#8239;1) abbildet. Die oberen drei Zustände werden im Kombinationsfeld, die restlichen '''e''' Bit binär im restlichen Exponenten gespeichert.
* einer Mantisse, die aus '''p''' = 3&#8239;·&#8239;n&#8239;+&#8239;1 Ziffern besteht. Die höchstwertige Ziffer wird im Kombinationsfeld, die restlichen 3&#8239;·&#8239;n Ziffern werden in Dreiergruppen in der restlichen Mantisse gespeichert.
* einer Mantisse, die aus '''p''' = 3&#8239;·&#8239;n&#8239;+&#8239;1 Ziffern besteht. Die höchstwertige Ziffer wird im Kombinationsfeld, die restlichen 3&#8239;·&#8239;n Ziffern werden in Dreiergruppen in der restlichen Mantisse gespeichert.


Zeile 173: Zeile 175:
!rowspan="2"| Kod.<br />Wert
!rowspan="2"| Kod.<br />Wert
!rowspan="2"| Beschreibung
!rowspan="2"| Beschreibung
|- style="line-height:100%"
|-
! m4 !! m3 !! m2 !! m1 !! m0 !! Exp. !! Mant.
! m4 !! m3 !! m2 !! m1 !! m0 !! Exp. !! Mant.
|-
|-
Zeile 192: Zeile 194:
| 1 || 1 || 1 || 1 || 1 || NaN
| 1 || 1 || 1 || 1 || 1 || NaN
|}
|}
; Bemerkung: Das Vorzeichenbit von NaNs wird ignoriert. Das MSB des restlichen Exponenten bestimmt, ob das NAN quiet oder signaling ist.
; Hinweis: Das Vorzeichenbit von NaNs wird ignoriert. Das MSB des restlichen Exponenten bestimmt, ob das NAN ''quiet'' oder ''signaling'' ist.


{| class="wikitable" style="text-align:center; border-width:0;"
{| class="wikitable" style="text-align:center; border-width:0;"
|+ Tabelle 2: Kodierregeln für die Declets der dichtgepackten dezimalen Ziffern der restlichen Mantisse<ref name="Cowlishaw_2000">{{cite web |author=[[Michael F. Cowlishaw]] |publisher=[[IBM]] |title=A Summary of Densely Packed Decimal encoding |orig-year=2000-10-03 |date=2007-02-13 |url=http://speleotrove.com/decimal/DPDecimal.html |accessdate=2016-02-07 |dead-url=no |archiveurl=https://web.archive.org/web/20150924145411/http://speleotrove.com/decimal/DPDecimal.html |archivedate=2015-09-24}}</ref>
|+ Tabelle 2: Kodierregeln für die Declets der dichtgepackten dezimalen Ziffern der restlichen Mantisse<ref name="Cowlishaw_2000">{{cite web |author=[[Michael F. Cowlishaw]] |publisher=[[IBM]] |title=A Summary of Densely Packed Decimal encoding |orig-year=2000-10-03 |date=2007-02-13 |url=http://speleotrove.com/decimal/DPDecimal.html |accessdate=2016-02-07 |url-status=dead |language=en |archiveurl=https://web.archive.org/web/20150924145411/http://speleotrove.com/decimal/DPDecimal.html |archivedate=2015-09-24}}</ref>
|-
|-
! scope="col" colspan="10"| DPD kodierter Wert
! scope="col" colspan="10"| DPD kodierter Wert
|rowspan="10" style="border-width:0; background-color:#FFF;"|
|rowspan="10" style="border-width:0; background-color:#FFF;"|
! scope="col" colspan="5"| Dezimalziffern
! scope="col" colspan="5"| Dezimalziffern
|- style="line-height:100%"
|-
!scope="col"| b9 !!scope="col"| b8 !!scope="col"| b7 !!scope="col"| b6 !!scope="col"| b5
!scope="col"| b9 !!scope="col"| b8 !!scope="col"| b7 !!scope="col"| b6 !!scope="col"| b5
!scope="col"| b4 !!scope="col"| b3 !!scope="col"| b2 !!scope="col"| b1 !!scope="col"| b0
!scope="col"| b4 !!scope="col"| b3 !!scope="col"| b2 !!scope="col"| b1 !!scope="col"| b0
Zeile 224: Zeile 226:
|}
|}


;Hinweis: Da im Gegensatz zur Binärdarstellung, in der durch Normalisierung und Weglassen des MSBs eine Normalisierung erzwungen wird, keine Normalisierung erzwungen wird und die Ziffer '''0''' als höchstwertige Ziffer verfügbar ist, sind Zahlen nicht eindeutig kodierbar.
; Hinweis: Da im Gegensatz zur Binärdarstellung (in der durch Normalisierung und Weglassen des MSBs eine Normalisierung erzwungen wird), keine Normalisierung erzwungen wird und die Ziffer '''0''' als höchstwertige Ziffer verfügbar ist, sind Zahlen nicht eindeutig kodierbar.


<!-- Kauderwelsch von Feinsten
<!-- Kauderwelsch von Feinsten
Zeile 248: Zeile 250:
J besteht aus den restlichen 10j Bit oder 3j Dezimalziffern mit Werten zwischen 0 und 999, die in je 10 Bit (0…1024) Cowlishaw-codiert sind.
J besteht aus den restlichen 10j Bit oder 3j Dezimalziffern mit Werten zwischen 0 und 999, die in je 10 Bit (0…1024) Cowlishaw-codiert sind.


Alternativ können Dezimalzahlen auch binär codiert sein. Aus dem 5bitigen G-Feld werden wie bei dezimaler Codierung 2&nbsp;führende Exponentenbits und 4&nbsp;führende Mantissenbits extrahiert. Nach Verkettung mit den restlichen Mantissenbits aus dem J-Feld wird die gesamte Mantisse als Dualzahl interpretiert. Ist eine solche Mantisse ausnahmsweise ≥&nbsp;10^p, dann gilt sie als nichtkanonische Darstellung der Null.
Alternativ können Dezimalzahlen auch binär codiert sein. Aus dem 5-bittigen G-Feld werden wie bei dezimaler Codierung 2&nbsp;führende Exponentenbits und 4&nbsp;führende Mantissenbits extrahiert. Nach Verkettung mit den restlichen Mantissenbits aus dem J-Feld wird die gesamte Mantisse als Dualzahl interpretiert. Ist eine solche Mantisse ausnahmsweise ≥&nbsp;10^p, dann gilt sie als nichtkanonische Darstellung der Null.
-->
-->
=== Dezimale Gleitkommazahlen in der Praxis ===
=== Dezimale Gleitkommazahlen in der Praxis ===
Zeile 254: Zeile 256:
Die Probleme von dezimalen Gleitkommazahlen sind unter anderem:
Die Probleme von dezimalen Gleitkommazahlen sind unter anderem:
* Sowohl im Binär- wie im Dezimalformat sind die meisten Zahlen nicht präzise darstellbar. Nach wenigen Rechenschritten sind die meisten Berechnungen unpräzise. Eine Währungsumrechnung oder das Abziehen der Umsatzsteuer reicht aus.
* Sowohl im Binär- wie im Dezimalformat sind die meisten Zahlen nicht präzise darstellbar. Nach wenigen Rechenschritten sind die meisten Berechnungen unpräzise. Eine Währungsumrechnung oder das Abziehen der Umsatzsteuer reicht aus.
* Für die meisten angegebenen Probleme gibt es einfachere und gleichzeitig leistungsfähigere Lösungen. Für Finanzaufgaben steht unter [[.NET]] z.&nbsp;B. der Datentyp System.Decimal zur Verfügung, der Ganzzahlen mit Beträgen bis 79.228.162.514.264.337.593.543.950.335 exakt darstellen kann.
* Für die meisten angegebenen Probleme gibt es einfachere und gleichzeitig leistungsfähigere Lösungen. Für Finanzaufgaben steht unter [[.NET (Plattform)|.NET]] z.&nbsp;B. der Datentyp <code>System.Decimal</code> zur Verfügung, der Ganzzahlen mit Beträgen bis 79.228.162.514.264.337.593.543.950.335 exakt darstellen kann.
* Sie stellt eine weitere Fehlerquelle für Hardware (zusätzliche Logik) und Software (Konvertierfehler) dar.
* Sie stellt eine weitere Fehlerquelle für Hardware (zusätzliche Logik) und Software (Konvertierfehler) dar.


Zeile 260: Zeile 262:
Die Ergebnisse sind:
Die Ergebnisse sind:
* Dezimale Gleitkommazahlen sind standardisiert, aber auch nach 15 Jahren nicht in fester Hardware verfügbar. Man kann sie in Software, in FPGAs und in ASICs implementieren, aber selbst darüber halten sich die Publikationen in Grenzen und sind meist auf Addition und Subtraktion beschränkt.
* Dezimale Gleitkommazahlen sind standardisiert, aber auch nach 15 Jahren nicht in fester Hardware verfügbar. Man kann sie in Software, in FPGAs und in ASICs implementieren, aber selbst darüber halten sich die Publikationen in Grenzen und sind meist auf Addition und Subtraktion beschränkt.
* Die Dezimalformate werden hauptsächlich von der Finanzwirtschaft gefordert, aber sobald man genauer hinschaut, nicht benötigt. Festkommadarstellungen auf Basis der kleinsten Verrechnungseinheit und 64-bit-Ganzzahlen decken gegenüber Decimal64 einen 922× so großen Wertebereich exakt ab (−92.233.720.368.547.758,08...+92.233.720.368.547.758,07 gegenüber −99.999.999.999.999,99...+99.999.999.999.999,99). Sie können allerdings keine noch größeren Werte mit dann verminderter Genauigkeit darstellen noch können sie kleinere Beträge genauer darstellen.
* Die Dezimalformate werden hauptsächlich von der Finanzwirtschaft gefordert, aber sobald man genauer hinschaut, nicht benötigt. Festkommadarstellungen auf Basis der kleinsten Verrechnungseinheit und 64-Bit-Ganzzahlen decken gegenüber ''Decimal64'' einen 922-fach so großen Wertebereich exakt ab (−92.233.720.368.547.758,08...+92.233.720.368.547.758,07 gegenüber −99.999.999.999.999,99...+99.999.999.999.999,99). Sie können allerdings keine noch größeren Werte mit dann verminderter Genauigkeit darstellen noch können sie kleinere Beträge genauer darstellen.


Sinnvoll sind sie:
Sinnvoll sind sie:
Zeile 275: Zeile 277:
|Autor=William Kahan
|Autor=William Kahan
|Quelle=Floating-Point Arithmetic Besieged by “Business Decisions”
|Quelle=Floating-Point Arithmetic Besieged by “Business Decisions”
|Übersetzung=Warum ist dezimale Gleitkommahardware auf jeden Fall eine gute Idee? Weil sie unserer Industrie hilft die Fehler zu vermeiden, die verfahrensbedingt nicht gefunden werden können.
|Übersetzung=Warum ist dezimale Gleitkommahardware auf jeden Fall eine gute Idee? Weil sie unserer Industrie hilft, die Fehler zu vermeiden, die verfahrensbedingt nicht gefunden werden können.
|ref=<ref>{{Internetquelle |autor=William Kahan |url=http://www.cs.berkeley.edu/~wkahan/ARITH_17.pdf |titel=Floating-Point Arithmetic Besieged by “Business Decisions” |hrsg=IEEE-Sponsored ARITH 17 Symposium on Computer Arithmetic |seiten=6 von 28 |datum=2005-07-05 |format=PDF; 174&nbsp;kB |sprache=en |abruf=2020-02-19}}</ref>}}
|ref=<ref>{{Internetquelle |autor=William Kahan |url=http://www.cs.berkeley.edu/~wkahan/ARITH_17.pdf |titel=Floating-Point Arithmetic Besieged by “Business Decisions” |hrsg=IEEE-Sponsored ARITH 17 Symposium on Computer Arithmetic |seiten=6 von 28 |datum=2005-07-05 |format=PDF; 174&nbsp;kB |sprache=en |abruf=2020-02-19}}</ref>}}
Er übersieht dabei aber, dass
Er übersieht dabei aber, dass
* Gepackte Dezimalformate zusätzliche Chipfläche benötigen, eine geringere Effizienz aufweisen und langsamer sind.
* gepackte Dezimalformate zusätzliche Chipfläche benötigen, eine geringere Effizienz aufweisen und langsamer sind.
* Rechenleistung jeder Größenordnung neue Aufgabenbereiche eröffnet und es trotzdem immer wieder Aufgaben geben wird, für die sie nicht ausreicht.
* Rechenleistung jeder Größenordnung neue Aufgabenbereiche eröffnet und es trotzdem immer wieder Aufgaben geben wird, für die sie nicht ausreicht.
* Es niemals so viel Rechenleistung geben wird, dass man freiwillig auf diese verzichten würde.
* es niemals so viel Rechenleistung geben wird, dass man freiwillig auf diese verzichten würde.
* Je komplexer die Rechnung, desto weniger interessiert es jemanden, ob diese dezimal exakt darstellbar ist. Nur wenigen auserwählten Zahlen wird die Ehre zuteil, von einem Menschen im Dezimalsystem eingetippt zu werden oder von einem Menschen im Dezimalsystem gelesen zu werden.
* je komplexer die Rechnung, desto weniger interessiert es jemanden, ob diese dezimal exakt darstellbar ist. Nur wenigen auserwählten Zahlen wird die Ehre zuteil, von einem Menschen im Dezimalsystem eingetippt zu werden oder von einem Menschen im Dezimalsystem gelesen zu werden.


== Weblinks ==
== Weblinks ==
Zeile 302: Zeile 304:
<references />
<references />


{{SORTIERUNG:Ieee 00754r}}
[[Kategorie:Computerarithmetik]]
[[Kategorie:Computerarithmetik]]
[[Kategorie:Numerische Mathematik]]
[[Kategorie:Numerische Mathematik]]
[[Kategorie:IEEE-Norm]]
[[Kategorie:IEEE-Norm|#00754-2008]]

Aktuelle Version vom 1. März 2024, 08:06 Uhr

Der Standard IEEE 754-2008, der frühere Arbeitstitel lautete IEEE 754r, ist eine Überarbeitung des erstmals 1985 von dem ANSI und IEEE gemeinsam verabschiedeten Gleitkommastandards IEEE 754. Der originale Standard und seine internationale Fassung (IEC-60559:1989) waren sehr erfolgreich und wurden in zahlreiche Prozessoren und Programmiersprachen übernommen. Die Diskussion über die 2008er-Ausgabe begann im Jahr 2001; im Juni 2008 wurde der Standard angenommen und im August 2008 verabschiedet.[1] Die nochmals überarbeitete Ausgabe des Standards, IEEE 754-2019[2], hat sich gegenüber 2008 nur geringfügig geändert – sie enthält hauptsächlich Klarstellungen, behebt erkannte Probleme und empfiehlt zusätzliche Rechenoperationen.

Die Hauptziele des verabschiedeten Standards können aufgeteilt werden in

  • das Zusammenführen von IEEE 754 und IEEE 854,
  • die Reduktion von Implementierungsalternativen,
  • die Entfernung von Mehrdeutigkeiten der bisherigen IEEE 754,
  • ein zusätzliches kumulierendes Produkt fused multiply-add: FMA(A,B,C) = A·B + C,
  • neben einfacher und doppelter auch Arithmetik mit halber und vierfacher Genauigkeit (zusätzlich zu 32 und 64 Bit auch 16 und 128 Bit),
  • die von der Finanzwirtschaft als notwendig erachteten Dezimalformate (IEEE 854),
  • weitere variable Formate und Austauschformate,
  • min und max mit Spezifikationen für die Spezialfälle ±0 und ±∞, sowie
  • Kosmetik: „denormalisiert“ heißt ab sofort „subnormal“.

Der Standard soll Formate und Methoden für Gleitkommaarithmetik sowie eine Mindestqualität definieren.

Formate umfassen Gleitkommazahlen mit halber (16 Bit), einfacher (32 Bit), doppelter (64 Bit) sowie vierfacher (128 Bit) Genauigkeit. Das Halbformat stellt ein standardisiertes Minifloat dar. Ergänzt werden die Grundformate durch erweiterte (extended) und erweiterbare (neu!) Langzahl-Formate. Ebenfalls neu aufgenommen wurden Datenaustauschformate. Neben der 16/32/64/128-Bit-Darstellungen sind Darstellungen mit einem Vielfachen von 32 Bit definiert.

Dicht gepackte Dezimalformate (DFP, 3 Ziffern in 10 Bit) sind ebenfalls dazugekommen. Sie weichen von klassischen einzelzifferbasierten BCD-Formaten folgendermaßen ab:

  • Die Kapazität der nutzbaren Bits wird gut ausgenutzt, da 3 Dezimalziffern (000...999, 1000 genutzte Werte) in jeweils 10 Bit (0...1023, 1024 mögliche Werte) gespeichert werden. Eine solche Gruppe heißt Declet. Der Verschnitt ist gegenüber klassischen BCD-Zahlen deutlich kleiner. Die letzte Spalte der Tabelle enthält den Informationsgehalt in Bit, der nur geringfügig geringer ist als der Speicherplatz (bei d=7 Mantissenziffern und einem Exponentenwertebereich von emin - emax unter Berücksichtigung der Vorzeichenbits ).
  • Die Verarbeitung der Dezimalziffern in Dreiergruppen kommt der üblichen Gruppierungsgewohnheit (23 223 456; 24 W, 24 kW, 24 MW) entgegen.
  • Die Zahl 0 hat auch das Bitmuster „0000…0“. Allerdings hat 0 eine relativ große Kohorte.
  • Die Zahlen 0 bis 9 eines Declets haben in den 6 führenden Bits eine 0.
  • Die Zahlen 10 bis 99 eines Declets haben in den 3 führenden Bits eine 0.
  • Ungerade Zahlen in Declets können mit Hilfe eines einzelnen Bits erkannt werden.
  • Die 24 unbenutzten Bitmuster ddx11x111x mit dd = 01, 10 oder 11 können leicht identifiziert werden.
  • Die so mit Declets gepackten Zahlen (Densely Packed) sind nicht mehr binär sortierbar, im Gegensatz zu „klassischen BCD-Formaten“.
  • Statt Speicherung in Declets kann die Mantisse auch ganzzahlig binär in einem gleich großen Bitfeld gespeichert werden. Die Bitfeldaufteilung ist im Kombinationsfeld dann anders.
  • Eine Zahl ist nicht eindeutig; mehrere Bitmuster können dieselbe Zahl bezeichnen. Die Menge der Bitmuster einer Zahl heißt Kohorte. Innerhalb einer Kohorte wurde jedoch jeweils eine kanonische Darstellung festgelegt.

Signaling NaNs wurden zur Streichung vorgeschlagen (3. Februar 2003), später aber wieder in den Vorschlag aufgenommen (21. Februar 2003). Eine Signaling NaN ist eine NaN mit gesetztem Bit 7. Darstellungen von existieren und sind leicht erkennbar.

Typ Spei-
cher-
bedarf
Mantisse Exponent Infor-
mations-
gehalt
in Bit
Bits m effektive Bits einer normali­sier­ten Zahl p Bits e Wertebereich Werte der Ko­horte einer nor­ma­li­sier­ten Zahl
emin emax Bias
b16 (half) 016 Bit 010 011 05 0000−14 000015 000015 1 ≤ E ≤ 30 016
b32 (single) 032 Bit 023 024 08 000−126 000127 000127 1 ≤ E ≤ 254 032
b64 (double) 064 Bit 052 053 11 00−1.022 001.023 001.023 1 ≤ E ≤ 2.046 064
b128 (quadruple) 128 Bit 112 113 15 0−16.382 016.383 016.383 1 ≤ E ≤ 32.766 128
b256 (octuple) 256 Bit 236 237 19 −262.142 262.143 262.143 1 ≤ E ≤ 524.286 256
k = 32j
mit j ≥ 4
00k Bit k + 12 −
rnd(4·ld k)
k + 13 −
rnd(4·ld k)
rnd(4·ld k)
− 13
1 − emax 2k−p−1 − 1 emax 1 ≤ E ≤ 2·emax 00k
d32 032 Bit  (a)20+5 7 Ziffern 06 00−95 0096 0101 031,83
d64 064 Bit 50+5 16 Ziffern 08 0−383 0384 0398 063,73
d128 128 Bit 110+5 34 Ziffern 12 −6.143 6.144 6.176 127,53
d32k mit k ≥ 1 32k Bit 30k−10+5 9k − 2 Ziffern 2k + 4 1 − emax 3·22k+3 emax+p−2 031,9k−0,07
(a) 
20+5 (in Spalte 3) bedeutet:
  •   in den 20 Bits werden 6 Dezimalstellen der Mantisse gespeichert (3 Stellen in jeweils 10 Bit)
  •   in den 5 übrigen Bits wird gespeichert:
    •   eine weitere Dezimalstelle der Mantisse (ergibt 10 Möglichkeiten)
    •   der Rest des Exponents bei Division durch 3 (der Quotient selbst wird in den Bits e gespeichert) (ergibt 30 Möglichkeiten)
    •   Signalisierungen für ±NANs und ±INFs (ergibt 32 Möglichkeiten)

Zu den vier alten IEEE-754-Rundungen kommt eine zusätzliche hinzu, so dass folgende Rundungen gefordert werden:

  • vergrößernd (in Richtung +unendlich)
  • verkleinernd (in Richtung −unendlich)
  • betragsverkleinernd (in Richtung 0)
  • bestmöglich und in der Mitte zur nächsten geraden Zahl (to next or to even)
  • bestmöglich und in der Mitte betragsvergrößernd (to next – zwar neu in IEEE 754r, aber eigentlich nur die klassische Handrechnungsrundung)

Die IEEE 754-Rundung (next even) wurde schon von Carl Friedrich Gauß vorgeschlagen und vermeidet ein statistisches Ungleichgewicht bei längeren Rechnungen zu größeren Zahlen hin.

Ausnahmebedingungen und Ausnahmebehandlung werden spezifiziert.

Neue Funktionen sind Prädikatfunktionen (größer gleich) und Operatoren für Maximum und Minimum. Hier wird vor allem über die Ergebnisse bei den Sonderwerten (NaN, Inf) diskutiert.

Dezimalkodierungen

[Bearbeiten | Quelltext bearbeiten]
Speicherplatzbedarf
DPD Größe für äquivalente Packed BCD Gewinn
032 Bit 07×4 + 07,58 + 1 Bit = 036,58 Bit 0+4,48 Bit
064 Bit 16×4 + 09,58 + 1 Bit = 074,58 Bit +10,48 Bit
128 Bit 34×4 + 13,58 + 1 Bit = 150,58 Bit +22,48 Bit

Die primäre Idee hinter der dicht gepackten Dezimaldarstellung ist, dass diese mit extrem wenig (Gatter-)Aufwand in eine klassische BCD-Darstellung für die Mantisse sowie einen binären Exponenten umkodiert werden kann, aber gleichzeitig den Speicherplatz so effizient wie möglich ausnutzt. Die eigentliche Verarbeitung findet dann im klassischen BCD-Format statt, nur beim Lesen und Schreiben von Registern ist eine Umkodierung erforderlich.

Die Kodierung von 32-Bit-, 64-Bit- und 128-Bit-dezimalkodierten Zahlen erfolgt nach folgendem Schema. Für längere Dezimalkodierungen werden für jedes weitere 32-Bit-Wort dem Exponenten 2 Bit und der Mantisse 30 Bit (3× 10 Bit) zugeschlagen, so dass unter Beibehaltung des 5-Bit-Kombinationsfeldes der Wertebereich des Exponenten sich vervierfacht und die Mantisse weitere neun Ziffern erhält.

Format Vorzeichen Kombinationsfeld restl. Exponent restliche Mantisse
032 Bit 1 Bit 5 Bits 06 Bits 020 Bits
s m m m m m xxxxxx bbbbbbbbbb bbbbbbbbbb
064 Bit 1 Bit 5 Bits 08 Bits 050 Bits
s m m m m m xxxxxxxx bbbbbbbbbb bbbbbbbbbb bbbbbbbbbb bbbbbbbbbb bbbbbbbbbb
128 Bit 1 Bit 5 Bits 12 Bits 110 Bits
s m m m m m xxxxxxxxxxxx bbbbbbbbbb bbbbbbbbbb bbbbbbbbbb bbbbbbbbbb bbbbbbbbbb
bbbbbbbbbb bbbbbbbbbb bbbbbbbbbb bbbbbbbbbb bbbbbbbbbb
bbbbbbbbbb
0: positiv
1: negativ
Kodierung der MSBs
nach Tabelle 1
binäre
Kodierung
Jedes Declet ist nach Tabelle 2 kodiert und liefert drei weitere Ziffern.
Vorzeichen Ziffer 1 Expon. MSB Expon. LSB Ziffer 2 Ziffer 3 Ziffer 4 Ziffer 5 Ziffer 6 Ziffer 7 Ziffer 8 Ziffer 9 ...

Die Zahl besteht aus

  • einem Vorzeichen: dieses wird im Vorzeichenbit s gespeichert.
  • einem Exponenten, der seinen Wertebereich von emin ... emax unter Zuhilfenahme eines Bias auf die Werte 0 ... 3 · 2e − 1 = (0 ... 2) · 2e + (0 ... 2e − 1) abbildet. Die oberen drei Zustände werden im Kombinationsfeld, die restlichen e Bit binär im restlichen Exponenten gespeichert.
  • einer Mantisse, die aus p = 3 · n + 1 Ziffern besteht. Die höchstwertige Ziffer wird im Kombinationsfeld, die restlichen 3 · n Ziffern werden in Dreiergruppen in der restlichen Mantisse gespeichert.

Zur Dekodierung und Kodierung werden folgende Kodiertabellen benötigt:

Tabelle 1: Kodierregeln für das Kombinationsfeld der MSBs des Exponenten und der Mantisse
Kombinationsfeld MSBs des Kod.
Wert
Beschreibung
m4 m3 m2 m1 m0 Exp. Mant.
0 0 a b c 00 0abc (0-7) Ziffer bis 7
0 1 a b c 01 0abc
1 0 a b c 10 0abc
1 1 0 0 c 00 100c (8-9) Ziffer größer 7
1 1 0 1 c 01 100c
1 1 1 0 c 10 100c
1 1 1 1 0 ±Infinity
1 1 1 1 1 NaN
Hinweis
Das Vorzeichenbit von NaNs wird ignoriert. Das MSB des restlichen Exponenten bestimmt, ob das NAN quiet oder signaling ist.
Tabelle 2: Kodierregeln für die Declets der dichtgepackten dezimalen Ziffern der restlichen Mantisse[3]
DPD kodierter Wert Dezimalziffern
b9 b8 b7 b6 b5 b4 b3 b2 b1 b0 d2 d1 d0 Kodierter Wert Beschreibung
a b c d e f 0 g h i 0abc 0def 0ghi (0–7) (0–7) (0–7) drei Ziffern bis 7
a b c d e f 1 0 0 i 0abc 0def 100i (0–7) (0–7) (8–9) zwei Ziffern bis 7,
eine größer 7
a b c g h f 1 0 1 i 0abc 100f 0ghi (0–7) (8–9) (0–7)
g h c d e f 1 1 0 i 100c 0def 0ghi (8–9) (0–7) (0–7)
g h c 0 0 f 1 1 1 i 100c 100f 0ghi (8–9) (8–9) (0–7) eine Ziffer bis 7,
zwei Ziffern größer 7
d e c 0 1 f 1 1 1 i 100c 0def 100i (8–9) (0–7) (8–9)
a b c 1 0 f 1 1 1 i 0abc 100f 100i (0–7) (8–9) (8–9)
? ? c 1 1 f 1 1 1 i 100c 100f 100i (8–9) (8–9) (8–9) drei Ziffern größer 7
Hinweis
Da im Gegensatz zur Binärdarstellung (in der durch Normalisierung und Weglassen des MSBs eine Normalisierung erzwungen wird), keine Normalisierung erzwungen wird und die Ziffer 0 als höchstwertige Ziffer verfügbar ist, sind Zahlen nicht eindeutig kodierbar.

Dezimale Gleitkommazahlen in der Praxis

[Bearbeiten | Quelltext bearbeiten]

Die Probleme von dezimalen Gleitkommazahlen sind unter anderem:

  • Sowohl im Binär- wie im Dezimalformat sind die meisten Zahlen nicht präzise darstellbar. Nach wenigen Rechenschritten sind die meisten Berechnungen unpräzise. Eine Währungsumrechnung oder das Abziehen der Umsatzsteuer reicht aus.
  • Für die meisten angegebenen Probleme gibt es einfachere und gleichzeitig leistungsfähigere Lösungen. Für Finanzaufgaben steht unter .NET z. B. der Datentyp System.Decimal zur Verfügung, der Ganzzahlen mit Beträgen bis 79.228.162.514.264.337.593.543.950.335 exakt darstellen kann.
  • Sie stellt eine weitere Fehlerquelle für Hardware (zusätzliche Logik) und Software (Konvertierfehler) dar.

Die Ergebnisse sind:

  • Dezimale Gleitkommazahlen sind standardisiert, aber auch nach 15 Jahren nicht in fester Hardware verfügbar. Man kann sie in Software, in FPGAs und in ASICs implementieren, aber selbst darüber halten sich die Publikationen in Grenzen und sind meist auf Addition und Subtraktion beschränkt.
  • Die Dezimalformate werden hauptsächlich von der Finanzwirtschaft gefordert, aber sobald man genauer hinschaut, nicht benötigt. Festkommadarstellungen auf Basis der kleinsten Verrechnungseinheit und 64-Bit-Ganzzahlen decken gegenüber Decimal64 einen 922-fach so großen Wertebereich exakt ab (−92.233.720.368.547.758,08...+92.233.720.368.547.758,07 gegenüber −99.999.999.999.999,99...+99.999.999.999.999,99). Sie können allerdings keine noch größeren Werte mit dann verminderter Genauigkeit darstellen noch können sie kleinere Beträge genauer darstellen.

Sinnvoll sind sie:

  • uneingeschränkt als Austauschformate, wenn die genaue Repräsentation von Dezimalwerten erforderlich ist.

Hier prallen zwei gegensätzliche Standpunkte aufeinander.

  • Auf der einen Seite werden die Speicher-, Rechenzeit- und Kosten-Vorteile, sowie die gleichmäßigere Zahlenverteilung eines dualen Formates herausgestellt.
  • Auf der anderen Seite wird argumentiert, dass exakte Ergebnisse (meist sind Ergebnisse wie bei Handrechnungen gemeint) nur mit Dezimalarithmetik möglich sind und in Zeiten schneller Prozessoren und billiger Speicher die Nachteile nicht mehr ins Gewicht fallen.

William Kahan hat behauptet, dass duale Arithmetik in Zukunft kaum noch eine Rolle spielen wird.

“Why is decimal floating-point hardware a good idea anyway? Because it can help our industry avoid errors designed not to be found.”

„Warum ist dezimale Gleitkommahardware auf jeden Fall eine gute Idee? Weil sie unserer Industrie hilft, die Fehler zu vermeiden, die verfahrensbedingt nicht gefunden werden können.“

William Kahan: Floating-Point Arithmetic Besieged by “Business Decisions”[4]

Er übersieht dabei aber, dass

  • gepackte Dezimalformate zusätzliche Chipfläche benötigen, eine geringere Effizienz aufweisen und langsamer sind.
  • Rechenleistung jeder Größenordnung neue Aufgabenbereiche eröffnet und es trotzdem immer wieder Aufgaben geben wird, für die sie nicht ausreicht.
  • es niemals so viel Rechenleistung geben wird, dass man freiwillig auf diese verzichten würde.
  • je komplexer die Rechnung, desto weniger interessiert es jemanden, ob diese dezimal exakt darstellbar ist. Nur wenigen auserwählten Zahlen wird die Ehre zuteil, von einem Menschen im Dezimalsystem eingetippt zu werden oder von einem Menschen im Dezimalsystem gelesen zu werden.

Einzelnachweise

[Bearbeiten | Quelltext bearbeiten]
  1. IEEE 754-2008: Standard for Floating-Point Arithmetic. IEEE Standards Association, 2008, doi:10.1109/IEEESTD.2008.4610935
  2. 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 30. Dezember 2023]).
  3. Michael F. Cowlishaw: A Summary of Densely Packed Decimal encoding. IBM, 13. Februar 2007, archiviert vom Original am 24. September 2015; abgerufen am 7. Februar 2016 (englisch).
  4. William Kahan: Floating-Point Arithmetic Besieged by “Business Decisions”. (PDF; 174 kB) IEEE-Sponsored ARITH 17 Symposium on Computer Arithmetic, 5. Juli 2005, S. 6 von 28, abgerufen am 19. Februar 2020 (englisch).