Dezimaler Gleitkomma - Decimal floating point

Dezimalgleitkomma- ( DFP ) arithmetic bezieht sich sowohl auf eine Darstellung und Operationen auf dezimale Fließkommazahlen. Durch direktes Arbeiten mit Dezimalbrüchen (Basis 10) können Rundungsfehler vermieden werden, die sonst normalerweise bei der Umwandlung zwischen Dezimalbrüchen (häufig in von Menschen eingegebenen Daten, wie Messungen oder Finanzinformationen) und binären (Basis 2) Brüchen auftreten.

Der Vorteil der dezimalen Gleitkommadarstellung gegenüber der dezimalen Festkomma- und Ganzzahldarstellung besteht darin, dass sie einen viel größeren Wertebereich unterstützt. Während beispielsweise eine Festkommadarstellung, die 8 Dezimalstellen und 2 Dezimalstellen zuweist, die Zahlen 123456.78, 8765.43, 123.00 usw. darstellen kann, könnte eine Gleitkommadarstellung mit 8 Dezimalstellen auch 1.2345678, 1234567.8, 0.000012345678, 12345678000000000 und so weiter. Dieser breitere Bereich kann die Akkumulation von Rundungsfehlern während aufeinanderfolgender Berechnungen dramatisch verlangsamen; Beispielsweise kann der Kahan-Summationsalgorithmus in Gleitkommazahlen verwendet werden, um viele Zahlen ohne asymptotische Akkumulation von Rundungsfehlern zu addieren.

Implementierungen

Frühe mechanische Verwendungen von dezimalen Gleitkommazahlen sind im Abakus , Rechenschieber , dem Smallwood-Rechner und einigen anderen Taschenrechnern offensichtlich , die Eingaben in wissenschaftlicher Notation unterstützen . Bei den mechanischen Taschenrechnern wird der Exponent oft als Nebeninformation behandelt, die separat ausgewiesen wird.

Der IBM 650- Computer unterstützte 1953 ein 8-stelliges dezimales Gleitkommaformat. Die ansonsten binäre Wang VS- Maschine unterstützte 1977 ein dezimales 64-Bit-Gleitkommaformat. Die Gleitkomma-Unterstützungsbibliothek für den Motorola 68040- Prozessor stellte ein 96 -bit dezimales Gleitkomma-Speicherformat im Jahr 1990.

Einige Computersprachen haben Implementierungen der dezimalen Gleitkommaarithmetik, darunter PL/I , C# , Java mit großer Dezimalzahl, Emacs mit Calc und das Dezimalmodul von Python . In 1987 wird die IEEE veröffentlicht IEEE 854 , ein Standard mit dezimalen Gleitkomma zur Berechnung, die für den Austausch mit anderen Systemen codiert sollte eine Spezifikation für wie Gleitkommadaten fehlte werden. Dies wurde anschließend in IEEE 754-2008 adressiert , das die Kodierung von dezimalen Gleitkommadaten standardisiert, wenn auch mit zwei verschiedenen alternativen Methoden.

IBM POWER6 und neuere POWER-Prozessoren enthalten DFP in der Hardware, ebenso wie das IBM System z9 (und spätere zSeries-Maschinen). SilMinds bietet SilAx, einen konfigurierbaren Vektor-DFP- Coprozessor . IEEE 754-2008 definiert dies genauer. Fujitsu hat auch 64-Bit Sparc- Prozessoren mit DFP in der Hardware.

Microsoft C# oder .NET verwendet System.Decimal.

IEEE 754-2008-Kodierung

Der Standard IEEE 754-2008 definiert 32-, 64- und 128-Bit-Dezimal-Gleitkommadarstellungen. Wie bei den binären Gleitkommaformaten wird die Zahl in ein Vorzeichen, einen Exponenten und einen Signifikand unterteilt . Im Gegensatz zu binären Gleitkommazahlen werden Zahlen nicht unbedingt normalisiert; Werte mit wenigen signifikanten Stellen haben mehrere mögliche Darstellungen: 1×10 2 =0,1×10 3 =0,01×10 4 usw. Wenn der Signifikand null ist, kann der Exponent ein beliebiger Wert sein.

IEEE 754-2008 dezimale Gleitkommaformate
dezimal32 dezimal64 dezimal128 dezimal(32 k ) Format
1 1 1 1 Vorzeichenfeld (Bits)
5 5 5 5 Kombinationsfeld (Bits)
6 8 12 w = 2× k + 4 Exponentenfortsetzungsfeld (Bits)
20 50 110 t = 30× k -10 Koeffizienten-Fortsetzungsfeld (Bits)
32 64 128 32× k Gesamtgröße (Bit)
7 16 34 p = 3× t /10+1 = 9× k −2 Koeffizientengröße (Dezimalstellen)
192 768 12288 3×2 w = 48×4 k Exponentenbereich
96 384 6144 Emax = 3×2 w -1 Größter Wert ist 9,99...×10 Emax
−95 -383 −6143 Emin = 1−Emax Kleinster normalisierter Wert ist 1,00...×10 Emin
−101 -398 -6176 Etiny = 2−p−Emax Kleinster Wert ungleich Null ist 1×10 Etiny

Die Exponentenbereiche wurden so gewählt, dass der für normierte Werte verfügbare Bereich annähernd symmetrisch ist. Da dies mit einer geraden Anzahl möglicher Exponentenwerte nicht exakt möglich ist, wurde der Zusatzwert Emax gegeben.

Es sind zwei unterschiedliche Darstellungen definiert:

  • Eines mit einem binären ganzzahligen Signifikantenfeld codiert den Signifikand als eine große binäre ganze Zahl zwischen 0 und 10 p –1. Es wird erwartet, dass dies für Softwareimplementierungen, die eine binäre ALU verwenden, bequemer ist .
  • Ein anderes mit einem dicht gepackten Dezimal-Signifikand-Feld codiert Dezimalziffern direkter. Dies macht die Konvertierung in und aus der binären Gleitkommaform schneller, erfordert jedoch spezielle Hardware, um effizient zu manipulieren. Es wird erwartet, dass dies für Hardwareimplementierungen bequemer ist.

Beide Alternativen liefern exakt den gleichen Bereich an darstellbaren Werten.

Die zwei höchstwertigen Bits des Exponenten sind auf den Bereich 0–2 beschränkt und die höchstwertigen 4 Bits des Signifikanten sind auf den Bereich 0–9 beschränkt. Die 30 möglichen Kombinationen sind in einem 5-Bit-Feld codiert, zusammen mit Sonderformen für unendlich und NaN .

Liegen die vier höchstwertigen Bits des Signifikanden zwischen 0 und 7, beginnt der codierte Wert wie folgt:

s 00mmm xxx   Exponent begins with 00, significand with 0mmm
s 01mmm xxx   Exponent begins with 01, significand with 0mmm
s 10mmm xxx   Exponent begins with 10, significand with 0mmm

Wenn die führenden 4 Bits des Signifikanden binär 1000 oder 1001 (dezimal 8 oder 9) sind, beginnt die Zahl wie folgt:

s 1100m xxx   Exponent begins with 00, significand with 100m
s 1101m xxx   Exponent begins with 01, significand with 100m
s 1110m xxx   Exponent begins with 10, significand with 100m

Das führende Bit (s im obigen) ist ein Vorzeichenbit, und die folgenden Bits (xxx im obigen) codieren die zusätzlichen Exponentenbits und den Rest der höchstwertigen Stelle, aber die Details variieren je nach verwendeter Codierungsalternative.

Die endgültigen Kombinationen werden für Unendlichkeiten und NaNs verwendet und sind für beide alternative Codierungen gleich:

s 11110 x   ±Infinity (see Extended real number line)
s 11111 0   quiet NaN (sign bit ignored)
s 11111 1   signaling NaN (sign bit ignored)

In letzteren Fällen werden alle anderen Bits der Codierung ignoriert. Somit ist es möglich, ein Array auf NaNs zu initialisieren, indem es mit einem einzelnen Byte-Wert gefüllt wird.

Binäres Integer-Signifikandenfeld

Dieses Format verwendet einen binären Signifikand von 0 bis 10 p −1. Der Dezimal32-Signifikand kann beispielsweise bis zu 10 7 −1 = 9 999 999 = 98967F 16 = 1001 1000100101 1001111111 2 betragen . Obwohl die Codierung größere Signifikanten darstellen kann, sind sie illegal und der Standard verlangt von Implementierungen, sie als 0 zu behandeln, wenn sie bei der Eingabe angetroffen werden.

Wie oben beschrieben variiert die Codierung in Abhängigkeit davon, ob die vier höchstwertigen Bits des Signifikanten im Bereich von 0 bis 7 (0000 2 bis 0111 2 ) oder höher (1000 2 oder 1001 2 ) liegen.

Wenn die 2 Bits nach dem Vorzeichenbit "00", "01" oder "10" sind, besteht das Exponentenfeld aus den 8 Bits nach dem Vorzeichenbit (die 2 genannten Bits plus 6 Bits des "Exponentenfortsetzungsfelds") , und der Signifikand sind die verbleibenden 23 Bits, mit einem impliziten führenden 0-Bit, hier in Klammern gezeigt:

 s 00eeeeee   (0)ttt tttttttttt tttttttttt
 s 01eeeeee   (0)ttt tttttttttt tttttttttt
 s 10eeeeee   (0)ttt tttttttttt tttttttttt

Dies schließt subnormale Zahlen ein, bei denen die führende Signifikandziffer 0 ist.

Wenn die 2 Bits nach dem Vorzeichenbit "11" sind, wird das 8-Bit-Exponentenfeld um 2 Bits nach rechts verschoben (nach dem Vorzeichenbit und den "11"-Bits danach) und der dargestellte Signifikand befindet sich in den restlichen 21 Bit. In diesem Fall gibt es eine implizite (also nicht gespeicherte) führende 3-Bit-Folge "100" im wahren Signifikand:

 s 1100eeeeee (100)t tttttttttt tttttttttt
 s 1101eeeeee (100)t tttttttttt tttttttttt
 s 1110eeeeee (100)t tttttttttt tttttttttt

Die 2-Bit-Sequenz "11" nach dem Vorzeichenbit zeigt an, dass es ein implizites 3-Bit-Präfix "100" für den Signifikanten gibt.

Beachten Sie, dass die führenden Bits des Signifikand-Feldes nicht die höchstwertige Dezimalziffer kodieren; sie sind einfach Teil einer größeren rein-binären Zahl. Zum Beispiel wird ein Signifikand von 8 000 000 als binär 0111 1010000100 1000000000 codiert , wobei die führenden 4 Bits 7 codieren; der erste Signifikand, der ein 24. Bit erfordert (und damit die zweite Kodierungsform) ist 2 23 = 8 388 608 .

In den obigen Fällen ist der dargestellte Wert:

(−1) Vorzeichen × 10 Exponent−101 × Signifikand

Decimal64 und Decimal128 arbeiten analog, jedoch mit größeren Exponenten-Fortsetzungs- und Signifikand-Feldern. Für Decimal128 wird die zweite Codierungsform eigentlich nie verwendet; das größte gültige Signifikand von 10 34 −1 = 1ED09BEAD87C0378D8E63FFFFFFFF 16 kann in 113 Bit dargestellt werden.

Dicht gepacktes Dezimal-Signifikandenfeld

In dieser Version wird der Signifikand als Folge von Dezimalziffern gespeichert. Die führende Ziffer liegt zwischen 0 und 9 (3 oder 4 binäre Bits), und der Rest des Signifikanten verwendet die dichte gepackte Dezimalcodierung (DPD).

Die führenden 2 Bits des Exponenten und die führende Ziffer (3 oder 4 Bits) des Signifikanden werden zu den fünf Bits zusammengefasst, die dem Vorzeichenbit folgen. Darauf folgt ein Fortsetzungsfeld des Exponenten mit festem Offset.

Schließlich besteht das Signifikanz-Fortsetzungsfeld aus 2, 5 oder 11 10-Bit- Deklets , die jeweils 3 Dezimalziffern kodieren.

Wenn die ersten beiden Bits nach dem Vorzeichenbit "00", "01" oder "10" sind, dann sind dies die führenden Bits des Exponenten und die drei Bits danach werden als führende Dezimalstelle interpretiert (0 bis 7 ):

    Comb.  Exponent          Significand
 s 00 TTT (00)eeeeee (0TTT)[tttttttttt][tttttttttt]
 s 01 TTT (01)eeeeee (0TTT)[tttttttttt][tttttttttt]
 s 10 TTT (10)eeeeee (0TTT)[tttttttttt][tttttttttt]

Wenn die ersten beiden Bits nach dem Vorzeichenbit "11" sind, dann sind die zweiten beiden Bits die führenden Bits des Exponenten und dem letzten Bit wird "100" vorangestellt, um die führende Dezimalstelle (8 oder 9) zu bilden:

    Comb.  Exponent          Significand
 s 1100 T (00)eeeeee (100T)[tttttttttt][tttttttttt]
 s 1101 T (01)eeeeee (100T)[tttttttttt][tttttttttt]
 s 1110 T (10)eeeeee (100T)[tttttttttt][tttttttttt]

Die verbleibenden zwei Kombinationen (11110 und 11111) des 5-Bit-Feldes werden verwendet, um ±unendlich bzw. NaNs darzustellen.

Gleitkomma-Rechenoperationen

Die übliche Regel für die Durchführung von Gleitkomma-Arithmetik ist, dass der exakte mathematische Wert berechnet wird und das Ergebnis dann auf den nächsten darstellbaren Wert mit der angegebenen Genauigkeit gerundet wird. Dies ist tatsächlich das für IEEE-konforme Computerhardware vorgeschriebene Verhalten unter normalem Rundungsverhalten und in Abwesenheit außergewöhnlicher Bedingungen.

Zur Vereinfachung der Darstellung und des Verständnisses wird in den Beispielen eine 7-stellige Genauigkeit verwendet. Die Grundprinzipien sind in jeder Genauigkeit gleich.

Zusatz

Eine einfache Methode zum Hinzufügen von Gleitkommazahlen besteht darin, sie zunächst mit demselben Exponenten darzustellen. Im folgenden Beispiel wird die zweite Zahl um 3 Stellen nach rechts verschoben. Wir gehen mit der üblichen Additionsmethode vor:

Das folgende Beispiel ist dezimal, was einfach bedeutet, dass die Basis 10 ist.

  123456.7 = 1.234567 × 105
  101.7654 = 1.017654 × 102 = 0.001017654 × 105

Somit:

  123456.7 + 101.7654 = (1.234567 × 105) + (1.017654 × 102)
                      = (1.234567 × 105) + (0.001017654 × 105)
                      = 105 × (1.234567 + 0.001017654)
                      = 105 × 1.235584654

Dies ist nichts anderes, als in wissenschaftliche Notation umzuwandeln . Im Detail:

  e=5;  s=1.234567     (123456.7)
+ e=2;  s=1.017654     (101.7654)
  e=5;  s=1.234567
+ e=5;  s=0.001017654  (after shifting)
--------------------
  e=5;  s=1.235584654  (true sum: 123558.4654)

Dies ist das wahre Ergebnis, die genaue Summe der Operanden. Es wird auf 7 Stellen gerundet und dann bei Bedarf normalisiert. Das Endergebnis ist:

  e=5;  s=1.235585    (final sum: 123558.5)

Beachten Sie, dass die unteren 3 Ziffern des zweiten Operanden (654) im Wesentlichen verloren gehen. Dies ist ein Rundungsfehler . In extremen Fällen kann die Summe zweier von Null verschiedenen Zahlen gleich einer von ihnen sein:

  e=5;  s=1.234567
+ e=−3; s=9.876543
  e=5;  s=1.234567
+ e=5;  s=0.00000009876543 (after shifting)
----------------------
  e=5;  s=1.23456709876543 (true sum)
  e=5;  s=1.234567         (after rounding/normalization)

Ein weiteres Problem des Signifikanzverlustes tritt auf, wenn zwei nahe Zahlen subtrahiert werden. e=5; s=1,234571 und e=5; s=1,234567 sind Darstellungen der rationalen Zahlen 123457,1467 und 123456.659.

  e=5;  s=1.234571
− e=5;  s=1.234567
----------------
  e=5;  s=0.000004
  e=−1; s=4.000000 (after rounding/normalization)

Die beste Darstellung dieser Differenz ist e=−1; s=4,877000, was mehr als 20% von e=−1 abweicht; s=4.000000. Im Extremfall kann das Endergebnis Null sein, obwohl eine genaue Berechnung mehrere Millionen betragen kann. Diese Aufhebung veranschaulicht die Gefahr, wenn man davon ausgeht, dass alle Ziffern eines berechneten Ergebnisses sinnvoll sind.

Der Umgang mit den Folgen dieser Fehler sind Themen der Numerischen Analysis .

Multiplikation

Zum Multiplizieren werden die Signifikanten multipliziert, während die Exponenten addiert und das Ergebnis gerundet und normalisiert wird.

  e=3;  s=4.734612
× e=5;  s=5.417242
-----------------------
  e=8;  s=25.648538980104 (true product)
  e=8;  s=25.64854        (after rounding)
  e=9;  s=2.564854        (after normalization)

Die Aufteilung erfolgt ähnlich, aber das ist komplizierter.

Es gibt keine Aufhebungs- oder Absorptionsprobleme bei der Multiplikation oder Division, obwohl sich kleine Fehler ansammeln können, wenn Operationen wiederholt ausgeführt werden. In der Praxis kann die Art und Weise, wie diese Operationen in digitaler Logik ausgeführt werden, ziemlich komplex sein.

Siehe auch

Verweise

Weiterlesen