| 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
|
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 |
Codierung von Ganzen Zahlen (Integer) |
||||||||||||||||
Ganze Zahlenwerden im Binärformat gespeichert. Dieser kleine Exkurs hilft beim Verständnis der Codierung von Gleitkommazahlen.Beispiel: (dezimal ↔ 8bit-binär )
3 ↔ 00000011
Mit 8 Bit sind alle positiven Dezimalzahlen 0..255 darstellbar.255 ↔ 11111111 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:
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 |
|||||||||||||||
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:
|
||||||||||||||||||
|
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:
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
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
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 !
|
|||||||||||||||||||||||||
|