2 Rechnen auf einem Computer 2.1 Binär, Dezimal und Hexadezimaldarstellung reeller Zahlen Jede positive reelle Zahl r besitzt eine Darstellung der Gestalt r = r n r n 1... r 1 r 0. r 1 r 2... (1) := ( r n r n 1...r 1 r 0. r 1 r 2...) 10 := r n 10 n + r n 1 10 n 1 +... + r 1 10 1 + r 0 10 0 }{{} =1 +r 1 10 1 + r 2 10 2 +... mit r i {0,..., 9}, r n 0, n Z geeignet. (Da wir n Z zulassen, können die Zahlen (1) auch das Aussehen 0. 00...0r n r n 1 r n 2... (n < 0) (2) haben.) (1) heißt Dezimaldarstellung von r oder Darstellung im Zehnersystem. Beispiel 1 a) r = 1 = 0.333... =: 0.3; 3 n = 1, r i = 3, r periodisch, da rational. b) r = 10 2 = 14.142...; n = 1, r 1 = 1, r 0 = 4, r 1 = 1,... unregelmäßige, nichtperiodische Ziffernfolge, da r irrational. Analog zu (1) besitzt jede positive reelle Zahl r die Binärdarstellung r = ( b k b k 1...b 1 b 0. b 1 b 2...) 2 (3) := b k 2 k + b k 1 2 k 1 +... + b 1 2 1 + b 0 }{{} 2 0 =1 +b 1 2 1 +b 2 2 2 +... }{{} =1/2 mit b i {0, 1}, b k 0, k Z geeignet mit einer zu (2) analogen Form, falls k < 0. (3) heißt auch Dualdarstellung oder Darstellung im Dual oder Zweier 1
system. Ebenso besitzt jede positive reelle Zahl r die Hexadezimaldarstellung (auch: Darstellung im 16er System) r = ( h l h l 1... h 1 h 0. h 1 h 2...) 16 (4) := h l h l 1...h 1 h 0. h 1 h 2... := h l 16 l + h l 1 16 l 1 +... + h 1 16 1 + h 0 }{{} 16 0 =1 +h 1 16 }{{} 1 +h 2 16 2 +... = 1 16 mit h i {0,...,9, A, B, C, D, E, F }, h l 0, l Z geeignet. Dabei ist A := 10, B := 11,..., F := 15. Beispiel 2 r = 987 = (987) 10 = 1 512 + 1 256 + 1 128 + 1 64 + 0 32 + 1 16 + 1 8 +0 4 + 1 2 + 1 = (}{{} 11 1101 }{{} 1011 }{{}) 2 3 13 11 = (2 + 1) 256 + (8 + 4 + 0 + 1) 16 + (8 + 0 + 2 + 1) = 3 16 2 + 13 16 1 + 11 = (3DB) 16 Den Übergang vom Zweier ins 16er System erhält man dadurch, dass man (ausgehend vom Dualpunkt) jeweils zusammenhängende, nichtüberlappende Vierergruppen von Dualziffern zusammenfasst, diese zunächst in eine Dezimalzahl rückverwandelt und ihr die entsprechende Hexadezimalziffer zuordnet. Entsprechend erhält man den Übergang vom 16er ins Zweiersystem durch Darstellung der Hexadezimalziffern als Dualzahl gegebenenfalls unter Ergänzung von führenden Nullen, so dass Vierergruppen von Dualziffern entstehen. Beispiel 3 (}{{} 11 1101 1011 ) 2 = (3DB) 16 3 }{{} 13ˆ=D }{{} 11ˆ=B (3DB) 16 = (11 1101 1011) 2 Das Dualsystem ist entscheidend für das Rechnen auf einem Computer, da dieser die beiden Spannungszustände niedrig bzw. hoch mit 0 bzw. 1 kodieren und somit Dualzahlen problemlos darstellen kann. Da Dualzahlen in der Regel sehr lang sind, gibt man sie gern als Hexadezimalzahlen an. 2
Definiert man negative Zahlen durch Voransetzen eines Minuszeichens, so zeigen die Definitionen oben, dass sich jede ganze Dezimalzahl als ganze Dualzahl und als ganze Hexadezimalzahl schreiben lässt und umgekehrt. Endliche Dezimalbrüche brauchen im Allgemeinen jedoch keine endlichen Dualbrüche zu sein! Beispiel 4 Nebenrechnung: 0.1 = (0. 1) 10 = 1 10 = 1 (1010) 2 = 0.0001100 1 : (1010) 2 = 0.0001100 10000 1010 1100 1010 1000. 2.2 Rechnen mit Dualzahlen Additionstafel: + 0 1 0 0 1 1 1 10 Diese Tafel kann durch elektronische Schaltelemente realisiert werden. Beispiel 5 (Dualarithmethik) 1101 1101 1101 110 1101 : 110 = 10.0010 + 110 110 1101 110 10011 111 11010 1000 1001110 110 100 Bemerkung 1 Alle vier Grundoperationen (+,,,/) können auf die Addition zurückgeführt werden. Die Subtraktion verwendet dabei das sogenannte Zweierkomplement (alle Nullen durch Einsen und alle Einsen durch Nullen ersetzen [ = Stellenkomplement ] und dann 1 addieren). Es reicht somit, wenn das Rechenwerk des Computers ein Addierwerk besitzt. 3
Zur Subtraktion: Zahl: z Stellenkomplement: z Maximale Stellenzahl: n Zweierkomplement: z = z + 1 z + z = 2 n 1 + 2 n 2 +...2 1 + 1 = ( } 111 {{...1} ) 2 = 2n 1 2 1 = 2n 1 n Stellen z = z + 1 z + z = 2 n z = 2 n z z w = z+(2 n w) 2 } {{ } n = z+w 2 n ( = [2 n (z+w)] = z + w, falls z < w ) =w Beispiel 6 a) 1101 1101 } z } 110 + 1001 } w? + 1 w 1 0111 } {{ } z+w 111 ( = z + w 2 n ) b) 110 110 } z } 1101 + 0010 } w w? + 1 } 1001 }{{} 0110 z + w z+w + 1 111 111 ( = z + w ) 2.3 Zahlendarstellung im Rechner Dualzahlen werden im Rechner im Allgemeinen nur mit einer festen Stellenanzahl dargestellt. Dezimalbrüche wie (0.1) 10 sind daher nicht immer exakt darstellbar, sondern sind auf die maschinenvorgeschriebene Stellenanzahl gerundet. Konversionsfehler Hierauf beruht das falsche Ergebnis in Beispiel 1.1b). Beispiel 7 (0. 1) 10 = (0. 00011) 2 wird bei 8-ziffriger Darstellung als (0. 0001100) 2 dargestellt (Festpunktformat) und ist somit nicht exakt. Es gibt im Rechner im Wesentlichen zwei Zahlendarstellungen: 4
a) Festpunktdarstellung mit dem Dualpunkt nach einer festen Anzahl von Dualziffern (etwa nach den Einern um ganze Zahlen darzustellen). b) Gleitpunktdarstellung mit der Zahlendarstellung z = ±m 2 e ; (1) m heißt Mantisse und besitzt die Gestalt m = m 0. m 1 m 2...m lm 1 mit m 0 = 1, falls z 0, und m i {0, 1} sonst; (1) heißt dann normalisierte Gleitpunktdarstellung; l m heißt Mantissenlänge; e heißt Exponent und besitzt die Darstellung e = ±e 1 e 2...e le mit der Exponentenlänge l e. Lage der Gleitpunktzahlen: (endlich viele; nicht gleichmäßig auf dem Zahlenstrahl verteilt!) Überlauf (overflow) 0 Unterlauf (underflow) Überlauf (overflow) Eine Normierung der Zahlendarstellung schreibt der ANSI IEEE Standard 754 1985 vor. (ANSI = American National Standard Institute; IEEE = Institute of Electrical and Electronics Engineers) Beispiel 8 a) Festpunktdarstellung (Integer Zahlen) Format: 2 Byte (=16 Bit) Vorzeichen: 1 Bit Größte darstellbare Integer-Zahl: z max = 2 15 1 = 32767 5
Abspeicherung: V Ziffern 15 14 0 high bit low bit Ringdarstellung von Integer Zahlen unter Verwendung des Zweier komplements (Format: 1 2 Byte = 4 Bit der Einfachheit halber) 1001 = 7 1000 = 8 0111 = 7 1010 = 6 0110 = 6 1011 = 5 0101 = 5 1100 = 4 negative Zahlen positive Zahlen 0100 = 4 1101 = 3 0011 = 3 1110 = 2 0010 = 2 1111 = 1 0000 = 0 0001 = 1 Erstes Bit = Null positive Zahl (oder Null) Erstes Bit = Eins negative Zahl 6
Beispiel Zweierkomplement von 3 = (0011) 2 : (vergleiche 2.2) 1100 (Stellenkomplement) + 1 1101 ˆ= 3 Zweierkomplement von 3 = (1101) 2 : 0010 + 1 0011 ˆ= 3 b) Gleitpunktdarstellung (nach IEEE-Standard beim Zahlenformat double) Format: 8 Byte ( = 64 Bit ) Vorzeichen Mantisse: 1 Bit Mantissenlänge l m : 53 Bit Vorzeichen Exponent: 1 Bit Exponentenlänge l e : 10 Bit : 65 Bit Wegen der Normalisierung der Mantisse braucht die führende Eins nicht abgespeichert zu werden ( hidden bit ). Platzbedarf: 64 Bit Bereiche: i) Mantisse 2 53 = 2 10 5.3 (10 3 ) 5.3 10 16, 2 10 = 1024 10 3 d.h. durch die Mantisse können 15 16 Dezimalen kodiert werden. ii) Exponent Maximaler Exponent: e max = 2 10 1 = 1023 2 emax = 2 1023 = 2 10 102.3 10 3 102.3 10 307 (genauer: 10 308 ) Potenzbereich: 2 1023... 2 1023 (theoretisch!) 10 308... 10 308 Vergleiche aber die nachstehende IEEE Abspeicherung! IEEE Abspeicherung: (V,E,M) V E M 63 62 52 51 0 V := { 0, falls x 0 ( = VZ von m) 1, falls x < 0 7
E := e + bias ( 0) (2) (bias = 1023 = e max = e min + 1 = (11 } {{...1} ) 2 mit e min = 1022) 10 Einsen M := m 1 m 2... m lm 1 Bemerkung 2 a) Positive Exponenten beginnen wegen (2) mit 1, negative mit 0. b) Die Addition des bias erweitert den Exponentenbereich um eine Einheit nach oben: e min = 1022 ; e max = 1023 ; 11 } {{...1} 10 Einsen + bias = 11...10 11...1 } {{ } 11 Einsen ist noch frei; ebenso } 00 {{...0} ; 11 Nullen Die Exponenten 00... 0 und 11... 1 sind für Spezialfälle (vorzeichenbehaftete Null bzw. ± bzw. NaN [not-a-number]) bzw. denormalisierte Zahlen reserviert. Dadurch kann die kleinste normalisierte Gleitpunktzahl noch ohne Überlauf invertiert werden (ohne Beweis). c) (Normalisierte) Gleitpunktzahl: z = ( 1) V E bias 1.M 2 Beispiel 9 (Addition zweier Gleitpunktzahlen) Geg.: z = +m 2 e, z = +m 2 e, o.b.d.a. e e ; m, m [1, 2) (normalisiert) Ges.: z + z Vorgehen in mehreren Schritten: 1. Exponentenvergleich: e e? 2. Exponentenangleichung: Angleichen der Summanden an den größeren Exponenten Mantissenverschiebung z = m 2 e e } {{ } 2 e ; ˆm ist neue Mantisse, nicht normalisiert =: ˆm 3. Mantissenaddition: (unter Beibehaltung des gemeinsamen Exponenten) z + z = (m + ˆm ) } {{ } =: ˆm 2 e 8
4. Normalisierung der Mantisse: ˆm m [1, 2) e e z + z = m 2 e Bemerkung 3 Durch die Mantissenverschiebung in 2. und durch die Normalisierung in 4. können wegen des fest vorgegebenen Zahlenformats Ziffern verlorengehen. Rundungsfehler (z.b. Runden durch Abschneiden oder kaufmännisches Runden) Beispiel 10 (Addition) Format: 4 Byte (= 32 Bit) Vorzeichen Mantisse: 1 Bit Mantissenlänge l m : 24 Bit Vorzeichen Exponent: 1 Bit Exponentenlänge l e : 7 Bit : 33 Bit 1 Bit (hidden bit wie oben) : 32 Bit Addition von z = 1 2 25 und z = 1 2 1 : 1. Exponentenvergleich: 25 > 1 2. Exponentenangleichung bei z : z = 0. 0 }.{{..0} 1 2 25 23 Nullen 3. Mantissenaddition: z + z = 1. 0 }.{{..0} 1 2 25 23 Nullen 4. Normalisierung: (Runden durch Abschneiden) z + z = 1. } 0.{{..0} 2 25 23 Nullen Beachte: Durch die Rundung trägt z nichts zur Summe bei. Selbst kaufmännisches Runden würde das falsche Ergebnis z + z = 1. } 0.{{..0} 1 2 25 22 Nullen 9
liefern. Probleme beim Umgang mit Festpunktzahlen a) Bereichsüberschreitung (eventuell ohne Warnung oder Fehlermeldung) Beispiel 1.1e): i := 32767 ist die größte durch 2 Byte darstellbare Integer Zahl; i + 1 ˆ= 32768 (unter Beachtung der Ringdarstellung der Integer Zahlen) (i + 1) + i = 1. Probleme beim Umgang mit Gleitpunktzahlen a) Summation mehrerer Zahlen unterschiedlicher Größe Kleinere Summanden tragen wegen der Rundung bei der Gleitpunktaddition eventuell nichts zur Gesamtsumme bei (vergleiche Beispiel 1.1a) und Beispiel 9). Faustregel (nicht immer zutreffend): Addiere die Summanden nach Vorzeichen getrennt und summiere dabei nach aufsteigendem Betrag. b) Auslöschung Subtrahiert man zwei etwa gleich große Zahlen voneinander, so dass sich mehr als die Hälfte der führenden Ziffern wegheben, spricht man von Auslöschung. Theoretische Überlegungen und die Erfahrung zeigen, dass Auslöschung auf dem Rechner möglichst vermieden werden sollte. Beispiel 1.1c): 10 9 x 2 10 9 x + 10 9 = 0 b 2 4ac = 10 18 4 10 9 10 9 = 10 18 4 =. 10 18 aufgrund von Rundungsfehlern b b 2 4ac =. b b = 10 9 10 9 = 0 (vollständige) Auslöschung aufgrund vorheriger Rundungsfehler. x 1 = 0 Dies begründet das falsche Ergebnis. Abhilfe im vorliegenden Fall: x 1 = b b 2 4ac 2a b + b 2 4ac b + b 2 4ac = b2 (b 2 4ac) 2a( b + b 2 4ac) = 2c b + b 2 4ac. = Wurzel Trick 2c b + b = 2 109 10 9 + 10 = 1 9 10
Durch den Wurzel Trick wird Auslöschung vermieden. Bemerkung 4 Die falschen Vorzeichen in Beispiel 1.1d) resultieren ebenfalls aus Rundungsfehlern. 11