Kapitel 4: Repräsentation von Daten – Binärcodierung von rationalen Zahlen und Zeichen Einführung in die Informatik Wintersemester 2007/08 Prof. Bernhard Jung Übersicht Codierung von rationalen Zahlen Konvertierung gebrochener Zahlen zwischen Zahlensystemen Festkommazahlen Gleitkommazahlen Codierung von Text Literatur Küchlin & Weber. Einführung in die Informatik. 2005. Kapitel 2, 31-44 Herold, Bruno Lurz, Wohlrab: Grundlagen der Informatik. 2006. Kapitel 3 Prof. B. Jung Grundlagen der Informatik, WS 2007/08 TU Bergakademie Freiberg 1 Konvertieren echt gebrochener Zahlen in das Dezimalsystem Eine echt gebrochene Zahl n (n < 1): lässt sich mit Hilfe des Hornerschemas wie folgt darstellen: Beispiele (0.193) = 1 ⎛ 1 1 ⎞ ⋅ ⎜1 + ⋅ (9 + ⋅ 3) ⎟ 10 ⎝ 10 10 ⎠ (0.101) = 1 ⎛ 1 1 ⎞ ⋅ ⎜1 + ⋅ (0 + ⋅1) ⎟ = 0.625 2 ⎝ 2 2 ⎠ 10 2 Mit Hilfe dieser Darstellung können wieder Konvertierungen von anderen Systemen in das Dezimalsystem einfach durchgeführt werden … Prof. B. Jung Grundlagen der Informatik, WS 2007/08 TU Bergakademie Freiberg Konvertieren echt gebrochener Zahlen vom Dezimalsystem in andere Systeme Für die Umwandlung des Nachkommateils einer Dezimalzahl in ein anderes Positionssystem existiert folgender Algorithmus, wobei B die Basis des Zielsystems ist: Prof. B. Jung Grundlagen der Informatik, WS 2007/08 TU Bergakademie Freiberg 2 Konvertieren echt gebrochener Zahlen vom Dezimalsystem in andere Systeme Beispiele: Die Überläufe z von oben nach unten nach 0. nebeneinander geschrieben liefern dann die gesuchte Zahl. Prof. B. Jung Grundlagen der Informatik, WS 2007/08 TU Bergakademie Freiberg Genauigkeitsverluste bei der Umwandlung gebrochener Dezimalzahlen Manche gebrochenen Zahlen, die sich ganz genau im Dezimalsystem darstellen lassen, lassen sich leider nicht ganz genau als Dualzahl darstellen. Typische Beispiele dafür sind Zahlen, die sich im Dualsystem nur durch eine periodische Ziffernfolge repräsentieren lassen, wie z. B. (0.1)10 = (0.0001 1001 1001 1…)2: Solche Ungenauigkeiten treten dann natürlich auch in den Rechnern auf, die ja mit dem Dualsystem arbeiten Im Beispiel wiederholt sich das Bitmuster 0011und es gilt: (0.1)10 = (0.0 0011 0011 0011…)2 z.B. in Python Prof. B. Jung Grundlagen der Informatik, WS 2007/08 TU Bergakademie Freiberg 3 Konvertieren unecht gebrochener Zahlen Um eine unecht gebrochene Zahl zu konvertieren, muss diese in ihren ganzzahligen Teil und ihren echt gebrochenen Teil aufgeteilt werden, die dann getrennt von einander zu konvertieren sind. Beispiel: (12.25)10 = (1100.01)2 Prof. B. Jung Grundlagen der Informatik, WS 2007/08 TU Bergakademie Freiberg Rationale Zahlen Festkommazahlen Bei Festkommazahlen steht das Komma (der Punkt) immer an einer bestimmten festgelegten Stelle, wobei der Punkt natürlich nicht eigens mitgespeichert wird: zahl hat die Länge n + m, wobei n Stellen vor und m Stellen nach dem Punkt gesetzt sind. Prof. B. Jung Grundlagen der Informatik, WS 2007/08 TU Bergakademie Freiberg 4 Rationale Zahlen Festkommazahlen Durch Einführen eines eigenen Vorzeichenbits können dann noch positive und negative Zahlen unterschieden werden Die Nachteile der Festkommadarstellung sind: Man kann mit einer bestimmten Anzahl von Bits nur einen beschränkten Wertebereich abdecken Die Stelle des Punkts (Kommas) muss allgemein festgelegt werden. Und wo soll man diesen festlegen, wenn manchmal mit sehr kleinen, hochgenauen Werten und ein anderes Mal mit sehr großen Werten gearbeitet werden muss? Aufgrund dieser Nachteile wird die Festkommadarstellung nur in Rechnern verwendet, die für Spezialanwendungen benötigt werden. In den üblichen heute verbreiteten Rechnern wird stattdessen die Gleitkommadarstellung verwendet… Prof. B. Jung Grundlagen der Informatik, WS 2007/08 TU Bergakademie Freiberg Rationale Zahlen IEEE-Format für float und double 1234.56 = 123.456 * 101 = 12.3456 * 102 = 1.23456 * 103 Jede rationale Zahl kann in der Form 2.3756·103 angegeben werden. Bei dieser Darstellungsform setzt sich die Zahl aus zwei Bestandteilen zusammen: Mantisse (2.3756) und Exponent (3), der ganzzahlig ist Diese Form wird auch meist in Rechnern verwendet, außer dass dort nicht mit Basis 10, sondern mit Basis 2 gearbeitet wird Die für die Darstellung einer Gleitpunktzahl verwendete Anzahl von Bytes legt fest, ob man mit einfacher (Datentyp float) oder mit doppelter Genauigkeit (Datentyp double) arbeitet Prof. B. Jung Grundlagen der Informatik, WS 2007/08 TU Bergakademie Freiberg 5 Rationale Zahlen IEEE-Format für float und double Zur Darstellung verwenden die C/C++- und Java-Datentypen float und double das standardisierte IEEE-Format, wobei vier Bytes für float und acht Bytes für double definiert sind. Prof. B. Jung Grundlagen der Informatik, WS 2007/08 TU Bergakademie Freiberg Rationale Zahlen IEEE-Format für float und double Das IEEE-Format geht von normalisierten Gleitkommazahlen aus. „Normalisierung“ bedeutet, dass der Exponent so verändert wird, dass der gedachte Dezimalpunkt immer rechts von der ersten NichtNull-Ziffer liegt (im Binärsystem ist dies immer eine 1). Prof. B. Jung Grundlagen der Informatik, WS 2007/08 TU Bergakademie Freiberg 6 Rationale Zahlen IEEE-Format für float und double In der Mantisse steht durch die normalisierte Form das höchstwertige „Einser-Bit“ immer links vom gedachten Dezimalpunkt (außer für 0.0). Beim IEEE-Format wird dieses Bit nicht gespeichert Der Exponent ist eine Ganzzahl, welche (nach Addition eines bias) ohne Vorzeichen dargestellt wird. Durch diese bias-Addition wird für den Exponent keine Vorzeichenrechnung benötigt. Der Wert von bias hängt vom Genauigkeitsgrad ab: - float (mit 4 Bytes, 8 Bits für Exponent): bias=127 - double (mit 8 Bytes, 11 Bits für Exponent): bias=1023 Das Vorzeichenbit zeigt das Vorzeichen der Mantisse, die immer als Betragswert, auch im negativen Fall nicht als Komplement, dargestellt wird Prof. B. Jung Grundlagen der Informatik, WS 2007/08 TU Bergakademie Freiberg Rationale Zahlen IEEE-Format für float und double Prof. B. Jung Grundlagen der Informatik, WS 2007/08 TU Bergakademie Freiberg 7 Rationale Zahlen IEEE-Format für float und double Nach IEEE gilt für float (einfach) und double (doppelt): Einige Sonderfälle des IEEE-Formats: Prof. B. Jung Grundlagen der Informatik, WS 2007/08 TU Bergakademie Freiberg Codes zur Darstellung von Zeichen ASCII-Code Der ASCII-Code (American Standard for Coded Information Interchange) ist eine festgelegte Abbildungsvorschrift (Norm) zur binären Kodierung von Zeichen. Der ASCII-Code umfasst Klein-/Großbuchstaben des lateinischen Alphabets, (arabische) Ziffern und viele Sonderzeichen aber z.B. keine deutschen Umlaute 7-Bit-Zeichenkodierung damit 27 = 128 Zeichen darstellbar Früher: 8. Bit zur Fehlerkorrektur (Paritätsbit) Heute: Erweiterungen von ASCII auf 8 Bit, Prof. B. Jung z.B. ISO 8859 (Latin-1, Latin-2, …) Grundlagen der Informatik, WS 2007/08 TU Bergakademie Freiberg 8 ASCII-Code Prof. B. Jung Grundlagen der Informatik, WS 2007/08 TU Bergakademie Freiberg Codes zur Darstellung von Zeichen ASCII-Code Zur Speicherung von Texten werden einzelne Bytes, die jeweils immer ein Zeichen kodieren, einfach hintereinander abgespeichert, so dass man eine Zeichenkette (String) erhält Um das Ende der Zeichenkette zu identifizieren, werden (in den Programmiersprachen) unterschiedliche Verfahren verwendet: Die Länge der Zeichenkette wird im ersten bzw. in den ersten Bytes vor der eigentlichen Zeichenkette gespeichert. Dieses Verfahren benutzt z. B. die Programmiersprache PASCAL. Das Ende der Zeichenkette wird durch ein besonderes, nicht darzustellendes Zeichen gekennzeichnet. So verwendet z.B. die Programmiersprache C/C++ ein 0-Byte (Byte, in dem alle Bits 0 sind), um das Ende einer Zeichenkette zu kennzeichnen. Prof. B. Jung Grundlagen der Informatik, WS 2007/08 TU Bergakademie Freiberg 9 Codes zur Darstellung von Zeichen ASCII-Code Python Unterscheidung zwischen Ziffern und Zeichen Prof. B. Jung Grundlagen der Informatik, WS 2007/08 TU Bergakademie Freiberg Codes zur Darstellung von Zeichen ASCII-Code Beispiele zum Speichern von Zeichen im ASCII-Code: Python Prof. B. Jung Grundlagen der Informatik, WS 2007/08 TU Bergakademie Freiberg 10 Codes zur Darstellung von Zeichen Unicode Mit dem Unicode wurde ein Code eingeführt, in dem die Zeichen oder Elemente praktisch aller bekannten Schriftkulturen und Zeichensysteme festgehalten werden können Die Zeichenwerte der von Unicode erfassten Zeichen wurden bis vor kurzem noch ausschließlich durch eine zwei Byte lange Zahl ausgedrückt. Auf diese Weise lassen sich bis zu 65 536 verschiedene Zeichen in dem System unterbringen (2 Byte = 16 Bit = 216 Kombinationsmöglichkeiten) In der Version 3.1 wurden 94 140 Zeichen aufgenommen, wobei die Zwei-Byte-Grenze durchbrochen wurde. Das Zwei-Byte-Schema, im Unicode-System als Basic Multilingual Plane (BMP) bezeichnet, wird deshalb von einem Vier-Byte-Schema abgelöst Prof. B. Jung Grundlagen der Informatik, WS 2007/08 TU Bergakademie Freiberg Weitere Codes BCD-Code BCD-Werte (Binary Coded Decimals) sind eine weitere Art der binären Kodierung von Zahlen bzw. Ziffern. Decimal: 0 1 2 3 4 5 6 7 8 9 BCD: 0000 0001 0010 0011 0100 0101 0110 0111 1000 1001 Es ist eigentlich eine Speicherplatz verschwendende Art der Speicherung von Dezimalzahlen, erleichtert aber manche Anwendungen Anwendungsbereiche: Rechnen im Dezimalsystem (exakte Darstellung gebrochener Zahlen!) Speichern von Dezimalzahlen (Telefonnummern u.ä.) Ansteuerung von LCD-Anzeigen, um Dezimalziffern einzeln anzuzeigen Prof. B. Jung Grundlagen der Informatik, WS 2007/08 TU Bergakademie Freiberg 11 Weitere Codes BCD-Code Beispiele: Die Bitmuster 1010, 1011, …, 1111 werden im BCD-Code nicht für Ziffern benötigt. Sie können genutzt werden z.B. für Vorzeichen +: 1010 und -: 1011 Prof. B. Jung Grundlagen der Informatik, WS 2007/08 TU Bergakademie Freiberg Datentypen in Java (Auswahl) Typ Beschreibung Anzahl Bits Wertebereich int signed two's complement integer 32 -231 ... 231-1 -2 147 483 648 … 2 147 483 647 long signed two's complement integer 64 -263 ... 263-1 -9 223 372 036 854 775 808 … 9 223 372 036 854 775 807 short signed two's complement integer 16 -215 ... 215-1 float IEEE 754 floating point 32 Beträge: 1.2E-38 … 3.4E+38 double IEEE 754 floating point 64 Beträge: 2.3E-308 … 1.7E+308 char Unicode character 16 Prof. B. Jung -32 768 … 32 767 Grundlagen der Informatik, WS 2007/08 TU Bergakademie Freiberg 12 Datentypen in Python (Auswahl) Typ Beschreibung Anzahl Bits Wertebereich int signed two's complement integer (mindestens) 32 -231 ... 231-1 -2 147 483 648 … 2 147 483 647 long signed two's complement integer unbeschränkt beliebig float IEEE 754 floating point (double) 64 Beträge: 2.3E-308 … 1.7E+308 sowie u.a. ascii und unicode strings Prof. B. Jung Grundlagen der Informatik, WS 2007/08 TU Bergakademie Freiberg 13