Mantisse und Exponent

Die mathematische Grundlage für IEEE-754

Der Standard IEEE-754 beschreibt das interne Speicherformat für die Darstellung von Gleitkomma-Zahlen. Diese Seite zeigt einige der dabei verwendeten mathematischen Verfahren sowie die praktischen Konsequenzen verschiedener Speicherbreite.
IEEE-754 IEEE-754 Das Standardformat für Gleitkomma-Zahlen
Anforderungen an die Codierung durch Mathematik und Informatik
Ganze Zahlen Binäre Codierung ganzer Zahlen
Fixkomma Binäre Codierung von Fixkomma-Zahlen
Zerlegung Die Zerlegung von Zahlen in Mantisse und Exponent
Beispiele Praktische und theoretische Beispiele, Live-Beispiel

Anforderungen an die Codierung von Gleitkommazahlen

Die interne (binäre) Darstellung von Gleitkommazahlen ist eine interessante Herausforderung an numerische Mathematik und Informatik. Folgende Forderungen sollten so gut wie möglich erfüllt werden:

Großer Absoluter Zahlenbereich: Die größte darstellbare Zahl sollte so groß wie möglich sein - wenn schon nicht unendlich, dann zumindest so groß, dass fast alle praktisch auftretenden Rechen-Probleme damit abgedeckt werden können.
Das deckt auch die symmetrische Forderung nach einer gleich großen Zahl mit negativem Vorzeichen ab.

Großer Relativer Zahlenbereich: Der Betrag der kleinsten darstellbaren Zahl sollte sehr klein sein, nur um eine Winzigkeit von Null verschieden.

Hohe Genauigkeit: Auch bei sehr großen absoluten Zahlen sollten sich noch sehr kleine Unterschiede darstellen lassen.

Geringer Speicherbedarf: Die Anzahl der zur Speicherung verwendeten Bits sollte so gering wie möglich sein. Die Speicherbreite sollte ganzzahlige Vielfache der jeweiligen PC-Wortbreite betragen (ursprünglich 1 Byte, derzeit 4 → 8 Byte).
Es gibt kein System, welches alle Forderungen zufriedenstellend erfüllt. Zur Erfüllung der mathematischen Forderungen müsste man die Speicherbreite (Anzahl Bits pro Gleitkomma-Zahl) unendlich erhöhen. Mit endlicher Speicherbreite müssen die mathematischen Forderungen teilweise zurückgenommen werden.

Die Lösung ist historisch bedingt: In PC-Urzeiten war Speicher knapp und die von der CPU verarbeiteten "Worte" umfassten nur 8 Bit. Daraus entstand der Kompromiss der "Single Precision Floating Point" Zahlen: Eine Darstellungsform mit 32 Bit = 4 Byte pro Gleitkommazahl.

Die meisten derzeit verwendeten PC verarbeiten 32 Bit Wortbreite. Dort ist die naheliegende Speicherform die "Double Precision" Zahl mit 64 Bit = 8 Byte pro Gleitkommazahl.
"Double" Zahlen sind ein guter Kompromiss, d.h. für die meisten Anforderungen sowohl genau genug (16 Dezimalstellen) als auch schnell genug.

Neu gekaufte PC haben 64-Bit PC Wortbreite, verwenden jedoch weiterhin 'Double'-Typen: Quad-Typen erfordern für ihre 34 Dezimalstellen Genauigkeit eine gewaltige Rechenleistung, welche die Prozessoren derzeit nicht bieten können.
Der nächste Schritt wäre das Standard-Format 'Double Extended' mit 80 Bit = 10 Byte. Derartige Worte sind jedoch in einer binären Organisation umständlich zu verwalten. Speicher ist heute reichlich und kostengünstig verfügbar, deshalb wird sich wohl in einiger Zeit das 'Quad'-Format (Float128) mit 128 Bit durchsetzen.

Codierung von Ganzen Zahlen (Integer)

Ganze Zahlen

werden im Binärformat gespeichert. Dieser kleine Exkurs hilft beim Verständnis der Codierung von Gleitkommazahlen.
Beispiel:   (dezimal ↔ 8bit-binär )
  3 ↔ 00000011
255 ↔ 11111111
Mit 8 Bit sind alle positiven Dezimalzahlen 0..255 darstellbar.

Alle Programmiersprachen bieten die Möglichkeit, ganze Zahlen mit 8 Bit (Byte,Char,..), 16 Bit (Integer,Short,..) oder 32 Bit (Long,..) Breite zu verwenden.
Zahlenbereich ganzer Zahlen:
Bitpositivneg & pos
80 .. 255-127..+128
160 .. 65535-32767..+32768
320 .. 4.3E09-2.1E09..+2.1E09
640 .. 1.84E19-9.2E18..+9.2E18

Beispiel: Mit 8 Bit lässt sich entweder der Zahlenbereich 0...255 (unsigned) darstellen, oder der Bereich -127...+128 (signed).

2er-Komplement:

Bei Einbeziehung negativer ganzer Zahlen muss man 1 Bit für das Vorzeichen reservieren. Aus rechentechnischen Gründen werden negative ganze Zahlen im → 2er-Komplement gespeichert.

Algorithmus (nur für negative ganze Zahlen !):
Absolutwert binär codieren
1 subtrahieren
Bits invertieren (NOT)

Mit 8 Bit sind alle Zahlen -127..+128 darstellbar.
Die Null wird immer durch 8 Null-Bits dargestellt.
Das höchstwertige Bit negativer Zahlen im 2er-Komplement ist immer eine 1.

Beispiel:   Darstellung von -2 (dezimal ↔ binär ↔ hex)
Absolutwert 2 ↔ 00000010 ↔ #02
      2-1 = 1 ↔ 00000001 ↔ #01
invertiert    → 11111110 ↔ #FE

Beispiele:
  -2 ↔ 11111110 ↔ #FE
  -5 ↔ 11111011 ↔ #FB
 -23 ↔ 11101001 ↔ #E9
-100 ↔ 10011100 ↔ #9C
   0 ↔ 00000000 ↔ #00
+100 ↔ 01100100 ↔ #64

Codierung von Fixkomma-Zahlen

Bruchzahlen:

kann man nicht nur durch Dezimalzahlen sondern auch durch Binärzahlen darstellen. Ein binäres "Komma" ist nur ungewohnt, aber nicht unmöglich:
0.5  ↔ 0.1000000
0.25 ↔ 0.0100000

Das Komma lässt sich an jede Stelle setzen:
 1.5  ↔ 1.1000000
17.25 ↔ 10001.010
Das bedeutet eine Erweiterung der binären Darstellung auf den gesamten Zahlenraum

Binäre Fixkomma-Zahlen ?

Nach dem gezeigten Prinzip sollte es möglich sein, Fixkommazahlen binär darzustellen. Man muss lediglich die Lage des Dezimalpunkts festlegen. Rechts eine Tabelle der Möglichkeiten, wenn das Komma in die Mitte gelegt wird.
Beispiel   8 Bit:
2-4 =        0.0625 ↔ 000.0001
2+3 - 2-4 = 7.9375 ↔ 111.1111
Die kleinste darstellbare Gleitkommazahl (min) wäre 0.0625, die größte (max) 7.9375, ein Bit ist für das Vorzeichen reserviert.

Die Tabelle rechts zeigt, dass Genauigkeit und Zahlenbereich erst bei 256 Bit Speicherbreite in brauchbare Bereiche kommen (werden) - dann allerdings mit enorm erhöhter Rechengeschwindigkeit !
Binäre Gleitkomma-Zahlen: (theoretische Möglichkeiten !)
Bitminmax
80.06257.9375
160.0039127.996
321.53E-053.28E+04
642.33E-102.15E+09
1285.42E-209.22E+18
2562.94E-391.70E+38

Diese Möglichkeit wird in gängigen PC-Systemen nicht eingesetzt. In einigen Mikroprozessor-Anwendungen mit genau bekannten Ansprüchen an die Genauigkeit werden jedoch auch binäre Fixkomma-Typen verwendet: Die Rechen-Geschwindigkeit ist damit viel größer als mit ↓ Standard Gleitkomma-Typen.
Diese Art der Darstellung wurde in der PC-Anfangszeit nicht in Betracht gezogen, da nicht genug Speicher für 256 Bit (32 Byte) breite Gleitkommazahlen zur Verfügung stand, und deren Verarbeitung bei 1 Byte Wortbreite viel zu lange gedauert hätte. Deshalb wurde ein anderer Weg gewählt, um auf Kosten der mathematischen Anforderungen mit weniger Speicher auszukommen: Die Speicherung als Mantisse + Exponent.

Zerlegung von Zahlen in Mantisse und Exponent

Die Mathematik bietet die Möglichkeit, jede Zahl in Vorzeichen (sign) Mantisse (fraction) und Exponent (exponent) zu zerlegen. Dieser Vorgang kann in jedem Zahlensystem (Dezimal, Binär, ..) erfolgen.

Die Zerlegung wird so vorgenommen, dass immer 1 <= Mantisse < Basis (des Zahlensystems) wird (Normalisierung).
Nur für die Zahl Null wird Mantisse=0 verwendet.
Die Mantisse ist eine Gleitkommazahl, deren Genauigkeit durch die Anzahl der Nachkomma-Stellen bestimmt wird.
Der Exponent ist eine ganze Zahl, die angibt, um wieviele Stellen die Mantisse verschoben wird, um die darzustellende Zahl zu erhalten.
Beispiele: Zerlegung von Zahlen in Mantisse und Exponent:
ZahlDezimalBinär
55.0 * 1001.01 * 22
171.7 * 1011.0001 * 24
-20-2.0 * 101-1.01 * 24
0.252.5 * 10-11.0 * 2-2
1/33.333333 * 10-11.010101 * 2-2
Die Beispiele zeigen u.a.:

Für Mantisse und Exponent muss je ein Vorzeichen gespeichert werden.
Die normalisierte Mantisse m im Dezimalsystem ist 1<=m<10.
Die normalisierte Mantisse im Binärsystem ist 1<=m<2.
Jede binäre Mantisse (außer 0) beginnt daher mit der Ziffer 1. Das wird bei der 'Hidden Bit'-Technik (s.u.) verwendet.

Es gibt Zahlen, die sich nicht fehlerfrei darstellen lassen (hier z.B. 1/3). Die Genauigkeit steigt in diesen Fällen mit der Zahl der angegebenen bzw. gespeicherten Stellen.
Beispiel: 0.33333 ist näher zu 1/3 als 0.33
Es gibt verschiedene Methoden, eine Mantisse mit 'kleinem Fehler' zu berechnen (s.u.). Darüber hinaus kann man bei der Erstellung eigener Programme die Genauigkeit bewahren: Vermeiden sie in Algorithmen möglichst die Berechnung kleiner Differenzen zweier großer Zahlen !

Hidden Bit:

Jede binäre Mantisse (außer 0) beginnt mit der Ziffer 1.
Beim Speichern binärer Mantissen kann man daher die führende Binärziffer "1" weglassen, das höchstwertige Bit wird also "versteckt".
Bei der Decodierung (Bitmuster Mantisse) wird das Hidden Bit wieder vorangestellt.
Die übliche Angabe der Speicherbreite drückt das so aus: 52+1 Bit (für die 'Double'-Mantisse) bedeutet: 52 Bit werden wirklich verwendet, 1 Bit wird beim Rechnen ergänzt, d.h. die Genauigkeit beträgt 52+1=53 Bit.

Diese aufwändige Methode zur Einsparung eines einzelnen Bits ist historisch bedingt: In der Computer-Urzeit war Speicherplatz knapp und kostbar.

Rest:

Die Berechnung der Mantisse ist begrenzt durch die Anzahl verfügbarer Speicher-Bits. Für die Behandlung eines allfälligen Rests sind 2 Methoden möglich:
Abschneiden: Der Rest wird verworfen. Das ist schneller, es entstehen jedoch größere und 'asymmetrische' Umwandlungsfehler.
Runden: Das letzte Speicherbit wird aus dem Rest gerundet. Das erfordert mehr Rechenzeit, die mittleren Umwandlungsfehler sind jedoch nur halb so groß und 'symmetrisch' verteilt.
Der IEEE-Standard für Rundungen (rounding rule) fordert die Rundung zur nächsten geraden ganzen Zahl. Danach ist zwar round(2.5)=2 jedoch round(3.5)=4 !

Beispiele für Kombinationen Mantisse & Exponent Speicherform

Die Zerlegung von Zahlen in Mantisse und Exponent ist die Grundlage für die Codierung von Gleitkomma-Zahlen nach IEEE-754.

Die Tabelle zeigt die Aufteilung der Speicher-Bits (Mantisse + 1 Vorzeichen-Bit + Exponent + 1 Vorzeichen-Bit des Exponenten).
Die Typen 'Single' und 'Double' werden heute von jeder gängigen Software unterstützt.
'Single Extended' erlangte keine praktische Bedeutung.
'Double Extended' (80 Bit) bzw. Float128 (Quad) werden derzeit nur von wenigen Geräten (Prozessor), Betriebssystemen und Programmen unterstützt.
Speicher-Aufwand in Bit:
NameMantisseExponentSpeicher
Single23+17+1 32
SingExt>=31+1>=10+1>=43
Double52+110+164
DoublExt>=63+1>=14+1>=79
Float128112+114+1 128
Angabe der Breite + Vorzeichen-Bit

Zahlenbereich:

Der Umfang des Werte-Bereichs (+/- größte darstellbare Zahl) wird durch den Exponenten bestimmt.
Die Tabelle zeigt die größte darstellbare Zahl für verschiedene Breite des binären Exponenten.
Mit Double sind immerhin bereits Zahlen von -1E+308 bis +1E+308 darstellbar. - Deren absolute Genauigkeit (s.u.) ist jedoch variabel.
Die neueren Formate (Double Extended, Quad, Float 128) bieten einen gewaltigen Zahlenbereich:
Das Alter des Universums beträgt dagegen 'nur' ca. 5E+17 Sekunden, unser Abstand zur Sonne 1.5E+14 Millimeter, zum Zentrum der Milchstraße 3E+23 Millimeter...

Algorithmen: Durch geschickte Formulierung kann man manchmal vermeiden, die Werte-Grenze zu überschreiten.
Beispiel: Diese Formel kann mit großen Zahlenwerten Probleme bereiten:
x = (a*b*c)/(r*s*t)
Besser ist oft:
x = (a/r)*(b/s)*(c/t)
Größte darstellbare Zahl
NameExp-BitsGrößte Zahl
Single7+11E+38.5
Double10+11E+308
Quad14+11E+4932
Angabe der Breite + Vorzeichen-Bit
Es gibt kaum Bereiche, in denen noch größere / kleinere Zahlen benötigt werden, als mit 14 Bit erreicht werden.

Nur die erste Zahl kann man noch mit einem Kalkulations-Programm berechnen (exp_bits sind die real verwendeten Bits des binären Exponenten):
max_zahl = ln(2^(2^exp_bits)) / ln(10)
Die angegebenen dezimalen Exponenten wurden so berechnet:
max_dec_exp = (2^(exp_bits - 1)) * ln(2) / ln(10)

Live-Test des verwendbaren Zahlen-Bereichs mit Browser und Kalkulations-Programmen.

Genauigkeit:

Die absolute Genauigkeit ist von der Länge der Mantisse und von der Größe der Zahl abhängig.
Eine relative Genauigkeit von 1E-5 ( =0.001%) bedeutet z.B. bei der Zahl 100 einen mittleren Fehler von 0.001, bei der Zahl 1 Mio bereits einen mittleren Fehler von 10.
Anders ausgedrückt: Bei dieser relativen Genauigkeit lässt sich die Zahl 100 gerade noch von der Zahl 100.001 unterscheiden.
Der Codier-Fehler ist nicht konstant, da sich manche Zahlen "restlos" in binäre Mantissen codieren lassen, andere nur mit einem kleinen Fehler.
Die Angabe der relativen Genauigkeit in Dezimalstellen bedeutet: Zählen sie die Ziffern einer Dezimalzahl von links nach rechts, beginnend mit der ersten Ziffer, die nicht Null ist.
4.5 Dezimalstellen bedeutet: Die Ziffern 1-4 sind garantiert richtig, die 5. Ziffer in einigen Fällen, alle weiteren sind zufällig.

Algorithmen: Die maximal erreichbare Genauigkeit spielt eine wichtige Rolle. Beispiel: Alle → Reihen-Entwicklungen (Iterationen) muss man spätestens bei Erreichen dieser Grenze abbrechen.
Relative Genauigkeit
NameMant-BitsRel.GenauigkeitDezimalstellen
Single23+16.0E-087.2
SingExt31+12.3E-109.6
Double52+11.1E-1616.0
DoublExt63+15.4E-2019.3
Quad112+19.6E-3534.0
Um Rechnungen mit 34 Dezimalstellen Genauigkeit auszuführen, ist eine gewaltige Prozessor-Leistung notwendig, jedoch auf derzeitigen PC nicht verfügbar.

Die angegebenen Zahlen wurden so berechnet:
rel_genauigkeit = 2^(- mantissen_bits)
dezimal_stellen = -log10(rel_genauigkeit)

Live-Test der maximal erreichbaren Genauigkeit mit Browser und Kalkulations-Programmen.
Live-Beispiel: Messen sie Live die Anzahl der Bits, die ihr Browser für Exponent und Mantisse von Gleitkomma-Zahlen verwendet !