Interne Darstellung von Zahlen Drei Möglichkeiten Dezimal gepackt → Tetraden (BCD) Festpunktschreibweise Jede Ziffer einer Dezimalzahl separat binär kodiert Gezonte Zahlendarstellung (Extended Binary Coded Decimal Interchange Code) mit F(=1111) für linkes Byte Bsp.: 3210=0011200102 dual fixed point Gleitpunktschreibweise dual floating point Festpunktdarstellung Das Komma ist an einer fixen, vorgegebenen Stelle (Sonderfall: ganze Zahlen) Wertebereich durch Anzahl der Stellen für den ganzen Teil festgelegt: VZ ganzer Teil p gebrochener Teil q mit n-stelligem Binärwort kann man 2n verschiedene Dualwerte repräsentieren → betragsmäßig größter darstellbarer Wert: |2n-1|; z.B. ganze Zahlen in 16Bit-Wort (-32767…32767) Gleitpunktdarstellung (1) Die Zahl F wird über Mantisse und Exponent (jeweils mit Vorzeichen) beschrieben: F = ±m·B±e VZm VZe Exponent e Mantisse m Statt Exponent e wird auch Charakteristik c verwendet (=immer positive Exzessdarstellung des Exponenten): c = e + k → siehe Technische Grundlagen und Systemsoftware Gleitpunktdarstellung (2) Darstellung nicht immer eindeutig: 0,1 = 0,01·101 = 1,00·10-1 Abhilfe: Normalisierung (erste Ziffer d0 ungleich Null) Interne Darstellung nach einer einheitlichen Konstruktionsvorschrift (Normierung): 1 B m 1 Gleitpunktdarstellung (3) Bsp.: Darstellung von 10,5 in einem 32-Bit-Wort: 1 Bit Vorzeichen Mantisse 7 Bit Exponent 24 Bit Mantisse +10,5 = +(1010,1)2 · 20 = 0,10101 · 24 Mantisse 1010100...0 Exp 4 = 22 = 1002 0 0000100 101010000000000000000000 Gleitpunktdarstellung (4) 1 r p VZ e M Betragskleinste normalisiert darstellbare Zahl: Exponent = -2r-1 Mantisse = 0,5 z 0,5 2 2 q ( 2 r 1 -1) Betragsgrößte Zahl: L=1+r+p Exponent = 2r-1-1 Mantisse ≈ 1 Wertebereich: 2 ( 2r 1 1) z 2 (2r 1 1) z2 q-1 2 (2r 1 1) r … # Bits für Exponent -q … minimaler Exponent q-1 … maximaler Exponent Gleitpunktdarstellung (5) Zahlen exakt darstellbar im Bereich: 0z2 p 2p = 10x … durch p Bits sind genau p/ld10 Dezimalstellen darstellbar Gleitkommadarstellung ist auf p 3p 0,3p ld10 10 Dezimalstellen genau Gleitpunktarithmetik Addition (1) Mantisse und Exponent getrennt behandeln 1. Anpassung der Zahl mit dem kleineren Exponenten an die mit dem größeren Exponenten: Z klein mklein 2eklein e groß 2e groß m 2e groß 2. Mantissen addieren neue gemeinsamer Mantisse 3. Exponent Ergebnis normieren (=ev. Verschieben der Mantisse nach rechts, Exponenten ändern) Beachte: Durch Angleich der Charakteristiken bzw. Normierung können im Ergebnis Stellen verloren gehen! Addition (2) 0,680 · 105 + 0,748 · 105 1,428 · 105 = 0,142 · 106 od. 0,143 · 106 0,680·105 → 0,680 · 105 + 0,748·103 → 0,007 · 105 0,687 · 105 1024 → 0,100000000000000000000000 · 211 + 0,875 · 10-6 → 0,111010101110000110001010 · 2-20 = 0,000000000000000000000000 · 211 → 0,100000000000000000000000 · 211 A+B=A ! Weitere Operationen Subtraktion: Multiplikation: Prozedur wie bei Addition Normieren bedeutet u.U. Verschieben nach links (zusätzliche Nullen, vorgetäuschte Genauigkeit!) Multiplikation der Mantissen, Addition der Exponenten Produkt u.U. normieren Division: Division der Mantissen, Subtraktion der Exponenten Quotient u.U. normieren Gleitkommaformate (1) Basis β (Annahme: β gerade) Genauigkeit p β=10, p=3 → 0,110=1,00·10-1 β=2, p=24 → 0,110≈1,10011001100110011001101·2-4 Die Mantisse (oder Signifikante) hat p Stellen →βp mögliche Mantissenwerte ±d0,d1d2…dp-1·βe (0≤di<β) stellt folgende Zahl dar: d0 d1β 1 dp 1β (p 1) β e Gleitkommaformate (2) Größter bzw. kleinster erlaubter Exponent: emax, emin → emax-emin+1 mögliche Exponenten Anzahl der benötigten Bit inkl. Vorzeichen: log 2 (e max e min 1) log 2 (β p ) 1 Viele Zahlen nicht exakt darstellbar! periodische Darstellung außerhalb des darstellbaren Bereichs 1,0 β e min , β β e max Relativer Fehler Differenz von realem und berechnetem Wert, geteilt durch realen Wert 3,14 statt 3.14159: 0,00159/3,14159≈0,0005 „Normale“ Rundung: Differenz ist höchstens (β/2)β-p·βe, relativer Fehler schwankt um β: β p p 1 1 β ulp β 2 2 2 Obere Grenze (Maschinenepsilon): ε β2 β p Im Beispiel (β =10, p = 3): ε=0,005 Der relative Fehler von oben ist dann ≈0,1ε IEEE Standard für Floating-Point Arithmetic Single Precision: gesamt 32 Bit Wort 1 Bit Vorzeichen 8 Bit Exponent 7 β p ε β 1,2 10 23 Bit Mantisse 2 Double Precision: gesamt 64 Bit Wort 1 Bit Vorzeichen 11 Bit Exponent 16 β p ε β 2,2 10 52 Bit Mantisse 2 http://www.cs.berkeley.edu/~ejr/Projects/ieee754/, http://www.psc.edu/general/software/packages/ieee/ieee.html Probleme mit Größenordnungen Eine Möglichkeit der Differenzbildung: exakten Wert bestimmen, anschließend runden Problem: sehr aufwändig, wenn die Operanden sehr unterschiedliche Größe haben p=3: 2,15·1012 - 1,25·10-5: (2,15 - 0,0000000000000000125)·1012= 2,1499999999999999875·1012 ≈ 2,15·1012 Lösung: Rechnen mit begrenzter Stellenanzahl (überschüssige Stellen werden abgeschnitten) Guard Digits (1) (2,15 - 0,00)·1012 = 2,15·1012 Gleiches Ergebnis wie bei aufwändigerer Berechnung Problem (z.B): 10,1 - 9,93 (1,01 - 0,99)·101 = 2,00·10-1 (richtig: 1,70·10-1) jede Stelle ist falsch! Lösung: eine zusätzliche Stelle (=guard digit) für die Berechnung (1,010 - 0,993)·101 = 1,70·10-1 Guard Digits (2) Im allgemeinen gilt: Der relative Fehler bei Subtraktion mit einem guard digit ist stets kleiner als 2ε Wegfall von Stellen (Auslöschung) Ohne guard digit (Berechnung mit p Stellen) kann der relative Fehler bis zu β-1 betragen Es können sogar sämtliche Stellen bedeutungslos werden (siehe voriges Bsp.) Ein anderes Problem tritt auf, wenn nahe beieinander liegende Werte subtrahiert werden: die höchstwertigen Stellen werden eliminiert übrig bleiben nur niederwertige Stellen Wegfall (1) Tritt auf, wenn die Operanden bereits gerundet sind Beispiel: quadratische Formel b2 - 4ac: b2 und 4ac sind wegen GleitkommaMultiplikation bereits gerundet Jeder Summand hat zwar höchstens 0,5 ulp Schlimmstenfalls bleiben nach Subtraktion nur noch Stellen mit Rundungsfehlern übrig Das führt unter Umständen zu sehr großer Abweichung ! Wegfall (2) Beispiel: b=3,34; a=1,22; c=2,28 [β=10, p=3] Exakter Wert: 0,0292 Aber: b2=11,2 und 4ac=11,1 Also: berechneter Wert = 0,1 Relativer Fehler = 0,708 = 141,6 ε Beachte: 11,2 - 11,1 ist aber exakt 0,1! Die Subtraktion hat also nicht direkt zum Fehler beigetragen, sondern die Fehler der vorhergehenden Multiplikationen lediglich offen gelegt Rundungsarten Runden ist im allgemeinen sehr einfach Problem: Werte, die genau in der Mitte liegen (z.B. 12,5) Oft werden die Ziffern in zwei gleich große Bereiche geteilt, wobei von 0 bis 4 abgerundet und von 5 bis 9 aufgerundet wird (DEC-VAX) Dies führt aber dazu, dass gerundete Werte graduell ansteigen Ein anderer Ansatz sagt, dass Werte, die genau in der Mitte liegen auch zur Hälfte abund zur anderen Hälfte aufgerundet werden sollen Erhöhung der Genauigkeit Zwei Ansätze: 1. Verlängerung der Mantisse, gespeichert in mehreren Wörtern (Array); benötigt speziellen (Assembler-)Code für den Zugriff 2. „Splitting“: Speicherung in mehreren herkömmlichen Gleitkommazahlen, deren Addition (bei unendlicher Genauigkeit) wieder die ursprüngliche Zahl ergibt; Vorteil: kann in Hochsprache programmiert werden Matlab: vpa