IEEE 754-2008

aus Wikipedia, der freien Enzyklopädie
Dies ist eine alte Version dieser Seite, zuletzt bearbeitet am 1. Oktober 2018 um 00:45 Uhr durch Frank Klemm (Diskussion | Beiträge) (Dezimalkodierungen). Sie kann sich erheblich von der aktuellen Version unterscheiden.
Zur Navigation springen Zur Suche springen

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.[1]

Hauptziele

Die Hauptziele des verabschiedeten Standards konnten 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 halbte und vierfachet 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: ab sofort heißt „denormalisiert“ „subnormal“

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

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

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 (001...999, 999 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 Combinationfield 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 Speicher-
bedarf
Mantisse Exponent Infor-
mations-
gehalt
in Bit
Bits m effektive Bits einer
normalisierten Zahl
p
Bits e Wertebereich Werte der Ko-
horte einer nor-
malisierten Zahl
emin emax Bias
b16 (half) 016 Bit 010 011 05 000−14 00015 00015 1 ≤ E ≤ 30 016
b32 (single) 032 Bit 023 024 08 00−126 00127 00127 1 ≤ E ≤ 254 032
b64 (double) 064 Bit 052 053 11 0−1022 01023 01023 1 ≤ E ≤ 2046 064
b128 (quad) 128 Bit 112 113 15 −16382 16383 16383 1 ≤ E ≤ 32766 128
k = 32j mit j ≥ 4 00k Bit k − rnd(4·ld(k)) + 12 k − rnd(4·ld(k)) + 13 rnd(4·ld(k)) − 13 1 − emax 2k−p−1 − 1 00emax 00k
d32 032 Bit 020+5 (a) 07  Ziffern 06 00−95 0096 0101 031,83
d64 064 Bit 050+5 16  Ziffern 08 0−383 0384 0398 063,73
d128 128 Bit 110+5 34  Ziffern 12 −6143 6144 6176 127,53
k = 32j mit j ≥ 1 00k Bit 15 k/16 − 10 9 k/32 − 2  Ziffern k/16 + 4 1 − emax 3·2k/16+3 emax + p − 2
(a) 
20+5 in Spalte 3 bedeutet:
  • in den 20 Bits werden 6 Dezimalstellen gespeichert (3 Stellen in jeweils 10 Bit)
  • in den 5 übrigen Bits wird gespeichert:
    • eine weitere Dezimalstelle
    • der Rest des Exponents bei Division durch 3
    • Signalisierungen für NaNs und Infs

Rundungen

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 – neu in IEEE 754r, 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.

In der Diskussion um den neuen Standard wird diese Erkenntnis offensichtlich wieder verworfen und die „Handrechnungsrundung“ (to next) wieder eingeführt.

Ausnahmen

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

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 2
binäre Kodierung Jedes Declet ist nach Tabelle 1 kodiert und liefert drei weitere Ziffern.
Vorzeichen Ziffer 1 MSB + LSB Exponent Ziffer 2 Ziffer 3 Ziffer 4 Ziffer 5 Ziffer 6 Ziffer 7 Ziffer 8 Ziffer 9 Ziffer 10 ...

Es werden folgende Kodiertabellen benötigt:

Tabelle 1: Kodierregeln für die Declets der dichtgepackten dezimalen Ziffern der restlichen Mantisse[2]
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
Tabelle 2: 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

Bemerkung:
Das Vorzeichenbit von NaNs wird ignoriert. Das MSB des restlichen Exponenten bestimmt, ob das NAN quiet oder signaling ist.


Eine Dezimalzahl kann mehrere verschiedene Darstellungsbitmuster haben (nichteindeutige Darstellung). Die Bitmuster, die eine Zahl repräsentieren, heißen die Kohorte dieser Zahl. Die Darstellungen (s, q, c) und (s, q+1, c/10) gehören zur selben Kohorte, wenn c durch 10 teilbar ist (Streng genommen ist die Menge {+0, –0} in der alten IEEE 754 Norm die Kohorte der Zahl 0. Der Standard IEEE 754R sagt jedoch explizit, dass +0 und −0 in verschiedene Kohorten gehören sollen).

Die Darstellung erfolgt in vier Bitfeldern S, G, F und J. S ist 1 Bit breit und enthält das Vorzeichen der Zahl. G enthält bei allen Dezimalformaten in 5 Bit zwei Exponentenbit und die führende Mantissenziffer. Der restliche Exponent steht in w Bit der Feldes F. Den Abschluss bilden die restlichen Mantissenziffern im Feld J mit j Declets, 10j Bit und 3j Ziffern.

S G0 G1 G2 G3 G4 F2 F3 … F[w+1] J1, J2, … Jj

G = 11111: r = NaNq oder r = NaNs; v = NaN

G = 11110: r = v = (–1)^s Infinity

G < 11110: r = (S, E–B, c); v = (–1)^s 10^(E–B) c, mit c = d0 d1 … d[p–1]

G = 110xx | G = 1110x: d0 = 8 + G4 in {8, 9}; E = G2G3 in {0, 1, 2}

G = 0xxxx | G = 10xxx: d0 = G2G3G4 in {0, 1, 2, 3, 4, 5, 6, 7}; E = G0G1 in {0, 1, 2}

Exponent: ggf...f besteht aus w Bit im Feld F plus zwei Bit im Feld G. Die zwei Bit aus Feld G können nur die drei Werte {00, 01, 10} annehmen. Damit stehen nur 3/4 der rechnerischen Exponentenwerte zur Verfügung. (Beispiel: d32, w=6, w+2 = 8, was rechnerisch 256 verschiedene Exponentenwerte bedeuten würde.) Da der Exponent nie mit 11f...f beginnen darf, sind es lediglich 3/4*256=192 Werte. Unter Berücksichtigung des Bias von 101 ist der Wertebereich des Exponenten 0-101 .. 191-101 = −101 .. 90. Da bei d32 sieben dezimale Stellen in der Mantisse stehen, und man davon ausgeht, dass nach der ersten Ziffer ein Punkt steht (D0. D1 bis D6), kann dem Exponenten +6 dazugezählt werden. Somit kommt man auf die in der obigen Tabelle geschriebenen Werte −95..+96.

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 führende Exponentenbits und 4 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 ≥ 10^p, dann gilt sie als nichtkanonische Darstellung der Null.

Intention von dezimalen Gleitkommazahlen

  • Dicht gepackte Dezimalformate (3 Ziffern in 10 Bit) sind standardisiert, aber auch nach 15 Jahren in käuflich erwerblicher fester Hardware nicht 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 288× so großen Wertebereich exakt ab (−92.233.720.368.547.758,08...+92.233.720.368.547.758,07 gegenüber −319.999.999.999.999,99...+319.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.

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.

Manche Experten gehen sogar soweit, zu behaupten, dass duale Arithmetik in Zukunft kaum noch eine Rolle spielen wird. Ein zugegeben polemisches Zitat zu diesem Thema stammt vom „Gleitkomma-Altmeister“ William Kahan:

“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.“[3]

Einzelnachweise

  1. IEEE 754-2008: Standard for Floating-Point Arithmetic, IEEE Standards Association, 2008, doi:10.1109/IEEESTD.2008.4610935
  2. A Summary of Densely Packed Decimal encoding. IBM, 13. Februar 2007, archiviert vom Original am 24. September 2015; abgerufen am 7. Februar 2016.
  3. Floating-Point Arithmetic Besiegedby “Business Decisions” (PDF; 174 kB), IEEE-Sponsored ARITH 17 Symposium on Computer Arithmetic, 2007 (englisch)