25.10.2012 Vorlesung „Programmieren“ Zahlendarstellung Dr. Dennis Pfisterer Institut für Telematik, Universität zu Lübeck http://www.itm.uni-luebeck.de/people/pfisterer Agenda • Zahlendarstellung • Oder: wie rechnen Computer? Security - 04 Cryptology #2 Dezimalsystem • Normal rechnen wir im Dezimalsystem 0+1= 1 1+1= 2 – Basis 10 2+1= 3 • 10 verschiedene „Symbole“ (0 bis 9) zur Zahlendarstellung vorhanden 3+1= 4 4+1= 5 5+1= 6 6+1= 7 • Größere Zahlen werden durch Sequenz von Symbolen gebildet 7+1= 8 8+1= 9 9 + 1 = 10 – „Stelle“ bestimmt Wertigkeit des Symbols Security - 04 Cryptology #3 1 25.10.2012 Dezimalsystem 1 100 1 ·100 • Darstellung von Zahlen in Summenform möglich 10 101 1 ·101 100 102 1 ·102 1.000 103 1 ·103 10.000 104 1 ·104 100.000 105 1 ·105 • Beispiele – 20 – 1024 = 2 ·101 + 0 ·100 = 1 ·103 + 0 ·102 + 2 ·101 + 4 ·100 Security - 04 Cryptology #4 Generalisierung: Andere Basen • Wir verwenden (normalerweise) das Dezimalsystem – Sehr einfach, damit (als Mensch) zu rechnen • Man kann jedoch auch Zahlensysteme mit beliebigen anderen Basen verwenden – z.B. zur Basis b = 2, 3, 8, 16 oder 34 • Unterscheidung von Zahlen verschiedener Basen – Optional: tiefgestellte Angabe der Basis – 12 zur Basis 10: 1210 – 12 zur Basis 16: 1216 Security - 04 Cryptology #5 Generalisierung: Andere Basen • Man benötigt b verschiedene Symbole zur Darstellung • Beispiel: b = 11 – Symbole: 0, 1, 2, 3, 4, 5, 6, 7, 8, 9, A – Rechnen: 0+0 = 0, 9+1 = A oder 9+2 = 10 – Symbole: A, B, C, D, E, F, G, H, I, J, K – Rechnen: A+A = A, J+B=K oder J+C = BA Security - 04 Cryptology #6 2 25.10.2012 Wichtiges Zahlensystem: Binärsystem • Um die technische Realisierung möglichst einfach zu halten, arbeitet ein moderner Rechner binär – Binär: Zwei Zustände • Mögliche Symbole – – – – An, aus Strom, kein Strom 0, 1 A, B Security - 04 Cryptology #7 Binärsystem • Symbole: 0 und 1 Basis 2 – Eine Binärziffer heißt „Bit“ (binary digit) – Folge von 8 Bit heißt „Byte“ • Rechnen – 0+0=0 – 1+0=0 – 1 + 1 = 10 Basis 2 Basis 10 0+1 = 1 1 1+1 = 10 2 10 + 1 = 11 3 11 + 1 = 100 4 100 + 1 = 101 5 101 + 1 = 110 6 110 + 1 = 111 7 111 + 1 = 1000 8 1000 + 1 = 1001 9 1001 + 1 = 1010 10 Security - 04 Cryptology Binärsystem und Computer #8 Arbeitsspeicher • Computer besitzen Arbeitsspeicher 1 0 0 0 1 1 0 1 0 1 1 0 1 1 1 0 1 0 0 0 1 1 0 1 1 1 1 1 1 1 1 1 ..... 0 0 0 0 0 0 0 1 0003 0 0 1 1 1 0 1 0 0002 0 1 0 1 0 1 0 0 0001 0 0 0 0 1 0 1 0 – Besteht aus Menge von 1-Bit Speichern – Jeweils Gruppe von 8 speichert ein Byte • Jedes Byte ist unter einer bestimmten Adresse erreichbar – Jedes Byte kann individuell gelesen und geschrieben werden – Bit-weiser Zugriff nicht möglich • Beispiel (Pseudocode) – setze_adresse[3] = 5810 – gebe_aus_adresse[3] 5810 Security - 04 Cryptology #9 3 25.10.2012 Darstellung von Zahlen im Binärsystem • Analog zum Dezimalsystem Basis 2 Basis 10 100 10 21 101 100 22 1010 1000 23 1011 10000 24 10100 100000 25 10101 • Beispiel – 1012 – Basis 10: 1 · 22 + 0 · 21 + 1 · 20 – Basis 2: 1 · 1010 + 0 · 101 + 1 · 100 Basis 2 1 20 • Diese Darstellung erlaubt einfaches Umrechnen in andere Zahlensysteme Security - 04 Cryptology #10 Beziehung Dezimal- ↔ Binärsystem • Beispiel: 14 • Zahlenbasis „10“: Tausender Hunderter Zehner Einer 103 = 100010 102 = 10010 101 = 1010 100 = 110 0 0 1 4 0 ⋅10 + 0 ⋅10 + 1 ⋅10 + 4 ⋅10 3 2 1 0 • Zahlenbasis „2“: 23 = 810 22 = 410 21 = 210 20 = 110 1 1 1 0 1 ⋅ 23 + 1⋅ 22 + 1⋅ 21 + 0 ⋅ 20 11 Umrechnung: Binär- nach Dezimalsystem • Beispiel: 11102 • Beispiel: 100101112 1 ⋅ 23 + 1 ⋅ 27 + 1 ⋅ 22 + 0 ⋅ 26 + 1⋅ 2 + 0 ⋅ 25 + 0 ⋅ 2 = 1410 1⋅ 24 + 1 0 0 ⋅ 23 + 1⋅ 22 + 1 ⋅ 21 + 1 ⋅ 20 = 15110 12 4 25.10.2012 Umrechnung: Dezimal- nach Binärsystem • Horner-Schema 14 2 = 7 R0 7 2 = 3R1 Least significant bit (LSB) 3 2 = 1R1 1 2 = 0 R1 Most significant bit (MSB) 1110 MSB LSB 13 Hexadezimalsystem (zur Basis 16) • Neben dem Binärsystem gibt es für den Programmierer noch ein weiteres wichtiges Zahlensystem – Das Hexadezimalsystem, kurz: hex • 16 Ziffern: 0, 1, 2, 3, 4, 5, 6, 7, 8, 9, a, b, c, d, e, f – a bis f stehen für die Zahlen 10 bis 15 – Groß-/Kleinschreibung unerheblich (a = A) • Umrechnung zwischen Dezimal und Hex analog zum Binärsystem 14 Dezimal-, Binär- & Hexadezimalsystem • Beispiel: 253 • Zahlenbasis „10“: • Zahlenbasis „2“: • Zahlenbasis „16“: Hunderter Zehner 102 101 Einer 100 2 5 3 27 26 25 24 23 22 21 20 1 1 1 1 1 1 0 1 161 160 f d 15 ⋅161 + 13 ⋅160 15 5 25.10.2012 Verwendung des Hexdezimalsystems • Programmierer verwenden oft Hex-Schreibweise – Ziel: Binärzahlen kompakter schreiben • Eine Hex-Ziffer entspricht immer vier Bit – Bytes werden oft als Folge von zwei Hex-Ziffern angegeben 13 240 27 26 25 24 23 22 21 20 1 1 1 1 1 1 0 1 161 160 f d 16 Rechnen mit binären Zahlen Rechnen mit binären Zahlen • Binäre Darstellung genügt, um alle Rechenaufgaben durchzuführen • Alle Grundrechenarten lassen sich auch im binären Zahlensystem durchführen 18 6 25.10.2012 Binäre Addition • Wiederholung: Addition im Dezimalsystem 14 + 19 33 • Identisches Vorgehen im Binärsystem 1110 + 10011 100001 19 Binäre Subtraktion • Wiederholung: Subtraktion im Dezimalsystem 14 −2 12 • Identisches Vorgehen im Binärsystem 1110 − 10 1100 20 Binäre Multiplikation • Multiplikation im Dezimalsystem 1 4 x 1 1 4 2 7 9 8 3 8 • Identisches Vorgehen im Binärsystem 1 1 1 0 x 1 1 1 1 0 1 1 1 0 0 0 0 1 1 1 1 0 1 1 1 0 21 7 25.10.2012 • Wiederholung: Division im Dezimalsystem 2 2 3 1 2 2 2 / 3 = 7 7 R 1 2 1 1 • Identisches Vorgehen im Binärsystem 1 1 1 1 0 0 1 1 0 1 0 1 0 0 0 0 1 1 1 1 1 0 1 0 0 1 1 0 1 0 0 0 0 1 0 / 1 1 = 1 0 0 1 1 0 1 R 1 0 1 1 22 Zwischenergebnis • Alle Grundrechenarten funktionieren auch im Binärsystem – Natürlich auch in allen anderen Zahlensystemen – Insbesondere auch im Hexadezimalsystem • Bisher: Nur positive ganze Zahlen • Wie geht man mit vorzeichenbehafteten ganzen Zahlen um? – Wie stellt man -7 im Computer dar? 23 Negative Zahlen 8 25.10.2012 Negative Binärzahlen mit Vorzeichenbit • Beispiel: 3-Bit-Zahlen Vorzeichen Bit 1 Bit 0 Dezimalwert 1 1 1 -3 1 1 0 -2 1 0 1 -1 1 0 0 -0 0 0 0 0 0 0 1 1 0 1 0 2 0 1 1 3 • Bewertung: Prinzipiell ok • Nachteile: – Zwei Nullen – VZ-Bit muss ausgewertet werden Für Maschinen nicht optimal 25 Negative Binärzahlen im Einerkomplement • Zur Vorzeichenumwandlung (+ wird jedes Bit invertiert - bzw. - +) • Beispiel: -710 – Darstellung als 4-Bit Binärzahl: -01112 – Bitweise invertiert: 10002 • Erstes Bit 1: negative Zahl – Zahlenwert bestimmen: Invertieren – 10002 -01112 -710 Security - 04 Cryptology #26 Negative Binärzahlen im Einerkomplement • Es ergibt sich folgender Zusammenhang: 1000 1010 1100 7 0111 6 -5 positive Zahlen -3 1101 0110 5 negative Zahlen -4 1011 -7 -6 1001 1110 2 -1 1 0 1111 0100 4 3 -2 0101 0011 0010 0001 0000 27 9 25.10.2012 Negative Binärzahlen im Einerkomplement • Vorteile – Einerkomplementzahlen können prinzipiell direkt (d.h. bitweise) addiert werden! – Beispiel: 3 – 7 = 3 + (-7) • Nachteile – Problem: Round Carry: siehe nächste Folie – Zwei Nullen Security - 04 Cryptology #28 Addition im Einerkomplement: 4+(-2) • Problem bei Addition: Round Carry 0100 + 1101 Übertrag! (1)0001 + 0001 0010 29 Negative Binärzahlen im 2er-Komplement • Alternative zum 1er-Komplement • Vorzeichenumwandlung – Invertiere bitweise und addiere 1 – Alternativ: 1er-Komplement + 1 • Beispiel: -710 -01112 – invertiere(01112) +12 10002 + 12 Security - 04 Cryptology 10012 #30 10 25.10.2012 Negative Binärzahlen im 2er-Komplement • Positive Zahlen: Höchstes Bit ist 0 1000 1001 1011 -8 -7 7 0111 -6 1010 6 0110 -5 5 -4 • Negative Zahlen: Höchstes Bit ist 1 1101 4 -3 1110 0101 3 -2 1111 2 -1 1 0 0100 0011 0010 0001 0000 31 Addition im 2er-Komplement • Beispiel: 4+(-2) 0100 – Als 4-Bit Zahl – 410 = 01002 – -210 = 11102 + 1110 10010 0010 • 2er-Komplementdarstellung ist sehr praktisch! • Moderne Rechner arbeiten mit dieser Darstellung Übertrag kann ignoriert werden 32 2er-Komplement und moderne Rechner • Ganze Zahlen werden im Arbeitsspeicher in 2erKomplementdarstellung abgelegt Arbeitsspeicher • Man „sieht“ der binären Repräsentation der Zahl nicht an, dass sie im 2er-Komplement dargestellt ist – Es könnte auch eine 4-Bit positive Zahl sein – Es kommt darauf an, wie man dieses Muster interpretiert 1 0 0 0 1 1 0 1 0 1 1 0 1 1 1 0 1 0 0 0 1 1 0 1 1 1 1 1 1 1 1 1 ..... 0 0 0 0 0 0 0 1 0003 0 0 1 1 1 0 1 0 0002 0 1 0 1 0 1 0 0 0001 0 0 0 0 1 0 1 0 Security - 04 Cryptology #33 11 25.10.2012 Reelle Zahlen Darstellung reeller Zahlen • Bisher nur ganze Zahlen betrachtet • Für viele Aufgaben benötigt man jedoch reelle Zahlen – Wie stellt man diese im Computer dar? – Antwort: gar nicht • Computer haben nur einen endlichen Speicher – Unmöglich potentiell unendlich lange Zifferfolgen darzustellen – Aber: Man kann auf einige Nachkommastellen genau rechnen 35 Festkommadarstellung • Typischerweise hat man im Computer eine feste Anzahl an Speicher für eine Zahl verfügbar • Eine Möglichkeit: Diese Anzahl aufteilen in Teil vor dem Komma und dahinter • Beispiel im Dezimalsystem: je 3 Stellen vor und nach dem Komma – Es sind je 1000 Zahlen darstellbar – Diese sind in jeweils 1000 „Teilschritte“ unterteilt • Beispiel: 175,381 Hunderter Zehner Einer Zehntel 102 101 100 10-1 Hundertstel Tausendstel 10-2 10-3 1 7 5 3 8 1 36 12 25.10.2012 Festkommadarstellung • Äquivalente Darstellung im Binärsystem möglich • Annahme: 32 Bit „Breite“ – Ergibt 16 Binärstellen und 16 binäre Nachkommastellen – Damit sind 65.536 Zahlen darstellbar – Diese sind jeweils wieder in 65.536 Teilschritte unterteilt • Beispiel: 1001 0110 1010 0001, 1010 0101 0000 0010 215 214 213 212 211 210 29 28 27 26 25 24 23 22 21 20 2-1 2-2 2-3 2-4 2-5 2-6 2-7 2-8 2-9 2-10 2-11 2-12 2-13 2-14 2-15 2-16 1 0 0 1 0 1 1 0 1 0 1 0 0 0 0 1 1 0 1 0 0 1 0 1 0 0 0 0 0 0 1 0 37 Festkommadarstellung (Umrechnungen) • Binärsystem Dezimalsystem (siehe weiter vorne) • Dezimalsystem – – – – Binärsystem Ebenfalls mit Horner-Schema Getrennte Berechnung von Vor- und Nachkommateil Vorkommateil: Division durch 2 mit Rest Nachkommaanteil: Division Multiplikation! (wegen negativer Exponenten) • Beispiel: Umrechnung von 14, 1 (nächste Folie) 38 Beispiel: 14,1(nur Vorkommateil 14) • Ergebnis: 1110 14 / 2 = 7 R 0 LSB 7/2 = 3 R 1 3/2 = 1 R 1 1/2 = 0 R 1 MSB 39 13 25.10.2012 Beispiel: 14,1(nur Nachkommateil 0,1) • 0,1 von dezimal nach binär – 0,1 x 2 = 0,2 = 0,2 + 0 – 0,2 x 2 = 0,4 = 0,4 + 0 – 0,4 x 2 = 0,8 = 0,8 + 0 – 0,8 x 2 = 1,6 = 0,6 + 1 – 0,6 x 2 = 1,2 = 0,2 + 1 – 0,2 x 2 = 0,4 = 0,4 + 0 … • • MSB LSB Ergebnis (mit 16 Bit): 0, 0001 1001 1001 1001 Erstaunlich: Nachkommateil ist periodisch – Darstellung mit endlicher Bitanzahl ist nicht exakt! – Dennoch muss man irgendwann abschneiden (z.B. nach 16 Bit) 40 Fließkommazahlen • Wertebereich und Genauigkeit von Festkommazahlen oft zu gering • Große Zahlen: Wunsch nach größerem Wertebereich – Nachkommateil nicht so relevant – Beispiel: 343847348734734,01 • Kleine Zahlen: Wunsch nach mehr Nachkommastellen – Dafür ist vor dem Komma nicht so viel Spielraum – Beispiel: 1,3434378343784384 • Lösungsansatz – Schreibe Zahl D als Produkt aus Festkommazahl und Potenz – D = X * 10Y (X, 10 und Y sind Dezimalzahlen!) – Bekannt aus dem Physikunterricht: 1,5637 * 10-6 m/s² 41 Fließkommazahlen • Exponent bewirkt „Verschiebung des Kommas“ – Daher der Name Fließkommazahl – Beispiel: 101,1 * 1011 = 101100,0 Mantisse Exponent (Achtung: Alles Binärzahlen) • Sinnvoll: Mantisse mit 1 beginnen zu lassen – Also 1,xxxxxx – Die „Kommaverschiebung“ vermerkt man im Exponenten – Eine solche Zahl heißt normalisiert 42 14 25.10.2012 32-Bit-Fließkommazahlen nach IEEE 754 • Rechner verwenden Darstellung nach IEEE 754 – IEEE 7534 verwendet „Platzspartrick“ – Mantisse beginnt immer mit einer 1 (außer bei der Zahl 0) – Durch Weglassen dieser Ziffer gewinnt man ein Bit • Format einer 32-Bit IEEE 754-Fließkommazahl V Exponent (8 Bit) Mantisse (23 Bit, Nachkommateil) 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 Vorzeichen (1-Bit) 43 32-Bit-Fließkommazahlen nach IEEE 754 • Wert des Exponenten eeffektiv definiert als – eeffektiv = e – 011111112 (= e - 12710) • Dadurch gilt – e = 0000 0001 (1 - 127 = -126) eeffektiv = -126 – e = 0111 1111 (127–127 = 0) Komma nicht verschoben – e = 1111 1110 (254–127 = 127) eeffektiv = +127 V Exponent e (8 Bit) Mantisse m (23 Bit, Nachkommateil) 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 44 32-Bit-Fließkommazahlen nach IEEE 754 • Binärer Wert g einer Fließkommazahl (für e ≠ 0 und m ≠ 0) g = ( − 1) v ∗ (1, m ) ∗ 10 e− 01111111 • Problem: Darstellung der 0 (1,mx immer ungleich 0) • Daher Sonderfälle – – – – e=0 und m≠0 e=0 und m=0 e=1111 1111 und m≠0 e=1111 1111 und m=0 Zahl ist denomalisiert (0,M) Darstellung der Zahl 0 NaN (Not a Number) Unendlich (Infinity, je nach Vorzeichen +/-) V Exponent e (8 Bit) Mantisse m (23 Bit, Nachkommateil) 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 45 15 25.10.2012 Umrechnung IEEE 754 Dezimalzahl • Mantisse und Exponent in Dezimalzahlen umrechnen • Damit folgende Formel benutzen g dezimal = ( − 1) v ∗ (1,0 + M dezimal / 2 23 ) ∗ 2 edezimal −127 • Beispiel: 0100 0000 0010 0000 0000 0000 0000 0000 – v=0 010 – e=1000 0000 27 10 12810 – m= 010 0000 0000 0000 0000 0000 22110 g dezimal = ( −1) 0 ∗ (1,0 + 2 21 / 2 23 ) ∗ 2128 −127 209715210 = 1 ∗ (1 + 2 − 2 ) ∗ 21 = 1, 25 * 2 = 2 ,5 46 Dezimalzahl IEEE 754 (am Bsp. für 14,1) 1. Dezimalzahl in Festkommabinärzahl umrechnen (mit 23 Binärstellen hinter erster 1) – 1110, 0001 1001 1001 1001 1001 2. Verschiebe Komma um n Stellen nach, sodass Zahl die Form 1,… bekommt – 1,110 0001 1001 1001 1001 1001 n=3 3. Schreibe das Vorzeichenbit (1 falls negativ, 0 sonst) – v=0 4. Rechne e=n+127 und schreibe binäre Darstellung von e – 3+127=130 e= 1000 0010 5. Schreibe m (Bitfolge hinter dem Komma aus Schritt 2) – m=110 0001 1001 1001 1001 1001 47 Dezimalzahl IEEE 754 (am Bsp. für 14,1) • Zwischenergebnis – v=0 – e= 1000 0010 – m=110 0001 1001 1001 1001 1001 • Darstellung nach IEEE 754 – Ergebnis – Wirklichkeit 0 100 0001 0110 0001 1001 1001 1001 1001 0 100 0001 0110 0001 1001 1001 1001 1010 ( komplizierte Rundungsregeln, ignorieren wir) 48 16 25.10.2012 Rechnen mit Fließkommazahlen 1. Exponenten angleichen – Zahl mit kleinerem Exponenten wird denormalisiert – Grund: Kein Spezialfall für mehr als eine Stelle vor dem Komma! 2. Mantissen addieren, subtrahieren, multiplizieren oder dividieren 3. Ergebnis normalisieren 4. Fertig! 49 Rechnen mit Fließkommazahlen (Beispiel) 1. 12,75 + 53,5 2. 12,75 1100,11 – e1 = 3 + 127 = 130 • 10000010 – 0,01100110000000000000000 +1,10101100000000000000000 10,00010010000000000000000 110101,1 – e2 = 5 + 127 = 132 – m1 = 10011 000000000000000000 3. e1 < e2 ⇒ e1 anpassen! 53,5 10000100 – m2 = 101011 00000000000000000 • 66,25 • 0100 0010 1000 0100 1000 000000000000 – 1,000010010000000000000000 e3 = 133 ! 50 Fließkommazahlen: Vor- und Nachteile • Vorteile – Fühlen sich für Programmierer wie reelle Zahlen an – Großer Wertebereich, inkl. Werten für 0, +inf und –inf • Nachteile – Sind nur endlich genau! – Zahlen, die im Dezimalsystem exakt dargestellt werden können, müssen im Binärsystem u.U. gerundet werden. – Durch diese Ungenauigkeit kommt es schon bei einfachen Rechnungen zu Rundungsfehlern – Beispiele: siehe nächste Folie 51 17 25.10.2012 Fließkommazahlen: Rundungsfehler • 1234.567 × 3.333333 = 4115.223 1.234567 × 3.333333 = 4.115223 4115.223 + 4.115223 = 4119.338 aber: 1234.567 + 1.234567 = 1235.802 1235.802 × 3.333333 = 4119.340 Distributivgesetz verletzt: a * x + b * x != (a+b) * x • Konsequenz – Für exakte Berechnungen (z.B. im Bankwesen) sind Fließkommazahlen ungeeignet – Double-Precision (64 Bit IEEE 754): 1 Vorzeichenbit, 11 Bit Exponent, 52 Bit Mantisse 52 Zusammenfassung • Zahlensysteme mit verschiedenen Basen – Umwandlung zwischen Zahlensystemen (2er, 10er, 16er) – Rechnen mit diesen Darstellungen • Binäre Zahlendarstellung im Computer – – – – • Ganze Zahlen (mit/ohne Vorzeichen) 1er- und 2er-Komplement Fließkommadarstellung Grenzen (Wertebereich, Genauigkeit)? Bitmuster im Speicher enthält keine Information über Art der Interpretation – Als Programmierer muss man dies „wissen“ bzw. beim Programmieren definieren – Beginnt an Adresse 3 z.B. eine 8 Bit Zahl oder 32 Bit? – Ganzzahl, 1er- / 2er-Komplement oder IEEE 754 Kodierung? 53 18