Das Kefk Network Wiki befindet sich im Testbetrieb.
IEEE 754r
Aus Kefk.
IEEE 754r ist eine notwendig gewordene Revision des vor etwa 20 Jahren (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.
Inhaltsverzeichnis |
Hauptziele
Hauptziele sind:
- das Zusammenführen von IEEE 754 und IEEE 854
- die Reduktion von Implementierungsalternativen
- die Entfernung von Mehrdeutigkeiten aus IEEE 754
- ein zusätzliches kumulierendes Produkt (fused multiply-add: FMA(A, B, C) = A·B + C)
- halbe und vierfache Genauigkeit (Formate für 16, 32, 64 und 128 Bit)
- die von der Finanzwirtschaft als notwendig erachteten Dezimalformate (IEEE 854)
- weitere variable und Austauschformate
- min und max mit Spezifikationen für die Spezialfälle ±0, ±∞
- Kosmetik: ab sofort soll „denormalisiert“ „subnormal“ heißen
Der Standard soll Formate und Methoden für Gleitkommaarithmetik sowie eine Mindestqualität definieren.
Formate
Formate umfassen halbgenaue (16 Bit), einfach, doppelt und vierfach genaue (128 Bit) Gleitkommazahlen. Ergänzt werden die Grundformate durch erweiterte (extended) und erweiterbare (neu) Formate. Ebenfalls neu aufgenommen werden Datenaustauschformate. Dafür sollen die „single extended“ und „double extended“ genannten Formate entfallen.
Dicht gepackte Dezimalformate (3 Ziffern in 10 Bit) sind geplant. Die Dezimalformate werden hauptsächlich von der Finanzwirtschaft gefordert. 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 „Gleitpunktaltmeister“ Prof. 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.“ [1] (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.)
Das konzipierte Dezimalformat weist gegenüber klassischen BCD-Formaten eine Reihe von guten innovativen Ideen auf (wenn man schon so ein Format überhaupt für notwendig hält):
- Die Kapazität der nutzbaren Bits wird gut ausgenutzt, wenn 3 Dezimalziffern (1000 Werte) in jeweils 10 Bit (1024 mögliche Werte mit 1000 genutzten) gespeichert werden. Der Verschnitt beträgt nur 0,34 % (bei BCD-Zahlen 16,95 %)
- 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“.
- Die Zahlen 0 bis 9 haben in den 6 führenden Bits eine 0.
- Die Zahlen 10 bis 99 haben in den 3 führenden Bits eine 0.
- Ungerade Zahlen 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.
Signaling NaNs wurden zur Streichung vorgeschlagen (3. Februar 2003), später aber wieder in den Vorschlag aufgenommen (21. Februar 2003).
Typ Größe Mantisse m Mant. bei NZ Exponent e emin emax Werte der Ch. bei NZ Bias b16 16 Bit 10 Bit 11 Bit 5 Bit –14 15 1 ≤ E ≤ 30 15 b32 (single) 32 Bit 23 Bit 24 Bit 8 Bit –126 127 1 ≤ E ≤ 254 127 b64 (double) 64 Bit 52 Bit 53 Bit 11 Bit –1022 1023 1 ≤ E ≤ 2046 1023 b128 128 Bit 112 Bit 113 Bit 15 Bit –16382 16383 1 ≤ E ≤ 16382 16383 d32 32 Bit 20+ Bit 7 Ziffern 6 Bit –95 96 101 d64 64 Bit 50+ Bit 16 Ziffern 8 Bit –383 384 398 d128 128 Bit 110+ Bit 34 Ziffern 12 Bit –6143 6144 6176
Rundungen
Zu den fünf 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) ist seit den 1960er Jahren beschrieben (Knuth) 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.
Dezimalarithmetik
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. (Strenggenommen ist die Menge {+0, –0} in der alten IEEE 754 Norm die Kohorte der Zahl 0.)
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 in 5 Bit zwei Exponentenbit und eine Mantissenziffer. Der restliche Exponent steht in w Bit der Feldes G. 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}
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.
