3.1 Gleitkommaformate

Die im Kapitel 2 behandelte Zahlenrepräsentation ist für viele Zwecke nicht geeignet, weil der Bereich der repräsentierbaren Werte zu klein ist. In der Physik vorkommende Zeiten (z.B. Halbwertszeiten von Teilchen) überstreichen 40 dezimale Größenordnungen. Dem entsprechend müsste der Binärpunkt einer Festkommarepräsentation um log2(1040) ≈ 133 Binärstellen verschiebbar sein. Für eine akzeptable Genauigkeit bei den absolut kleinsten Zahlen sollten noch ca. 50 Bits rechts des Binärpunktes verbleiben. Insgesamt wären 183 Bits die untere Grenze für eine Repräsentation wissenschaftlicher Daten durch eine Festkommadarstellung. Die relative Genauigkeit ist dabei abhängig von der absoluten Grösse der Zahl.

Konrad Zuse führte deshalb die in den Wissenschaften schon lange übliche halblogarithmische Notation der Form -3.7215*105 auch bei der binären Repräsentation ein. Heute wird diese Repräsentation als Gleitkommaformat bezeichnet. Jede Zahl z wird dabei zerlegt nach

 z = v * m * be                                                 

Die Komponenten v, m, e werden getrennt binär repräsentiert. Für das Vorzeichen v genügt ein einziges Bit. Die Anzahl der Bit zur Repräsentation der Mantisse m bestimmt die relative Genauigkeit der Repräsentation, und die Anzahl der Bits zur Repräsentation des Exponenten e legt den Bereich der darstellbaren Zahlen fest. Da bei der Multiplikation zweier so repräsentierter Zahlen deren Exponenten addiert werden, liegt es nahe, für die Repräsentation der Exponenten das b-Komplement zu verwenden. Um Größenvergleiche von Zahlen in Festkomma- und Gleitkommadarstellung mit der selben Hardware durchführen zu können, wird anstelle des b-Komplements durchweg eine Exzess-Darstellung verwendet. Dabei wird immer anstelle von e der Wert r = e + a repräsentiert mit einem festgelegten a , wobei r > 0 .

Der Übersichtlichkeit halber betrachten wir zunächst eine solche Repräsentation im Dezimalsystem. Als Beispiel legen wir fest:

m habe 4 Dezimalstellen
Der Dezimalpunkt stehe zwischen der ersten und der zweiten Stelle e habe 2 Dezimalstellen
Die Basis sei b = 10
Der Exzess sei a = 50

Damit wird anstelle des Exponenten als natürliche Zahl repräsentiert: r = e + a

Die Zahl π wird dann repräsentiert durch

 +1 * 3.142 * 100 ;   also  v = 1 ;  m = 3.142 ;  r = 50        

oder durch

 +1 * 0.314 * 101 ;   also  v = 1 ;  m = 0.314 ;  r = 51        
 +1 * 0.031 * 102 ;   also  v = 1 ;  m = 0.031 ;  r = 52        
 +1 * 0.003 * 103 ;   also  v = 1 ;  m = 0.003 ;  r = 53        
 +1 * 0.000 * 104 ;   also  v = 1 ;  m = 0.000 ;  r = 54        

Offenbar ist die Darstellung nicht eindeutig. Die Eindeutigkeit kann jedoch leicht durch eine zusätzliche Forderung hergestellt werden, nämlich:

Vor dem Punkt in der Darstellung der Mantisse soll genau eine Ziffer stehen und diese soll nicht 0 sein. Eine Repräsentation in dieser Form nennt man normalisiert. In der normalisierten Form wird die größte relative Genauigkeit erreicht. Auch wenn Gleitkommazahlen in Rechnersprachen häufig als "real" bezeichnet werden, so kann man damit nur endlich viele verschiedene rationale Zahlen genau repräsentieren.

Auf Rechnern werden Gleitkommazahlen binär repräsentiert. Man fügt dabei v , r und m lückenlos aneinander zu einem Binärwort. Am weitesten verbreitet sind die in der Norm IEEE-754 festgelegten Formate für Binärwörter der Längen 32 , 64 und 80 Bit. Einige Festlegungen dieser Formate zeigt die folgende Tabelle:

 Gleitkomma-Formate nach IEEE-754                                               
 ================================                                               
Bezeichnung: short real long real temporary real
Wortlänge (Bits) 32 64 80
Länge der Mantissenrepräsentation (Bits) 23 52 64
MSB der normalis. Mantisse repräsentiert: nein nein ja
Länge der Exponentenrepräsentation 8 11 15
Exzess a 127 1023 16383
absolut kleinste normalisierte Zahl 2-126 2-1022 2-16382
absolut kleinste Zahl > 0 2-149 2-1074 2-16446
absolut größte Zahl < +inf 2128-2104 21024-2971 216384-216318

Eine Besonderheit der normalisierten binären Darstellung ist, dass das höchstwertige Bit der Mantisse immer 1 ist. Man speichert es deshalb nicht und beginnt in der Repräsentation der Mantisse mit dem folgenden Bit. Dies ist bei der Angabe der Mantissenlänge in der obigen Tabelle schon berücksichtigt, die wahre Länge ist um 1 größer. Das gilt jedoch nur für short real und long real. Temporary real wird nur Prozessor-intern benutzt.

Neben der normalisierten Form gibt es die denormalisierte Form. Wenn nämlich der Exponent den kleinsten möglichen Wert hat, also repräsentiert wird durch r = 0, dann kann man kleinere Zahlen mit einer nicht normalisierten Mantisse schreiben. In der Notation unseres oben benutzten dezimalen Beispiels ist 1.000 * 10-50 die absolut kleinste normalisiert darstellbare Zahl. Dennoch kann man z.B. die Zahl +0.725613 * 10-52 notieren, nämlich in der nicht normalisierten Form +0.073 * 10-50 , also repräsentieren durch v = 1 ; m = 0.073 ; r = 0 . Die nicht-normalisierte Form ist zu erkennen an r = 0 . Auch in diesem Fall wird das höchstwertige Bit bei short real und long real nicht gespeichert, weil es immer 0 ist.

Die absolut größte Darzustellende Zahl liegt vor, wenn sowohl Exponent wie Mantisse ihre größten Werte haben, also alle Bits gleich 1 sind. Das ergibt z.B. für das short real Format (2 - 2-23)*2128 = 2129 - 2105 . Dies ist doppelt so groß wie die Angabe in der obigen Tabelle. Tatsächlich hat man auf die Darstellung der letzten Zweierpotenz verzichtet. Statt dessen codieren alle Bitmuster, deren Feld für die Repräsentation des Exponenten nur Einsen enthält, für "not a number" (NaN) , "+infinity" (inf) oder "-infinity" (-inf). In den Fällen inf und -inf ist die Mantisse gleich 0 , sonst liegt NaN vor. Mit den Bits der Mantisse kann man codieren, wie in diesem Fall weiter verfahren werden soll. Auf die Besprechung dieser Details wird hier verzichtet.

Die folgende Funktion bietet eine interaktive Demo für die drei Formate nach IEEE-754. Die Demo benutzt die normale Rechner-Arithmetik. Deshalb ist die Darstellung im Falle temporary real unpräzise. In Grenzfällen gilt das auch für long real:

demoieee754

Werden Operationen durchgeführt mit der Repräsentation für NaN , so ist das Resultat immer NaN bzw. 0 bei Vergleichsoperationen. Ist dagegen einer der Operanden inf oder -inf , so ergibt dies mehr oder weniger sinnvolle Resultate.

Probieren Sie im Kommandofenster z.B. 3/inf , inf + inf , 3*(-inf) , (-inf)2

Man sollte aber außerordentlich vorsichtig sein im Umgang mit diesen "Werten". Warnende Beispiele sind:

Die folgenden Programmzeilen sind nur mit Matlab-Lizenz aufrufbar:

inf/(-1+1)     % liefert das Resultat  +inf
inf/-(1-1)     % liefert das Resultat  -inf

x = 1.0e308,   y = 2*x-x-x   % lieferte bis Matlab 6  inf  anstelle von  0

Auch die Vergleiche

inf==inf       % Resultat:  1

inf==27*inf    % Resultat:  1

sind nicht plausibel - im Gegensatz zu

NaN==NaN       % Resultat:  0

Operationstabellen für Operanden der Art 0 , NaN , -inf , +inf liefert der folgende Aufruf für die Operationen < , + , - , * , / :

Dies ist ohne Matlab aufrufbar:

naninfoperation;