4 Zahlendarstellung im Rechner (Fortsetzung)
4 Zahlendarstellung im Rechner (Fortsetzung)
4 Zahlendarstellung im Rechner (Fortsetzung)
Sie wollen auch ein ePaper? Erhöhen Sie die Reichweite Ihrer Titel.
YUMPU macht aus Druck-PDFs automatisch weboptimierte ePaper, die Google liebt.
4 <strong>Zahlendarstellung</strong> <strong>im</strong> <strong>Rechner</strong> (<strong>Fortsetzung</strong>)<br />
4.1 Gleitkommazahlen<br />
Bisher haben wir nur ganze Zahlen betrachtet. Nun wollen wir auch reelle<br />
(gebrochene) Zahlen zulassen. Wie kann man aber<br />
1.) das Komma darstellen, wo die beiden binären Zeichen 0 und 1 schon belegt<br />
sind? Und wie kann man<br />
2.) einen unendlichen Zahlenbereich (zwischen zwei beliebigen reellen Zahlen<br />
liegen unendlich viele weitere reelle Zahlen!) mit endlich vielen Ziffern (Bits)<br />
so darstellen, dass ein endliches System (unser Computer) damit rechnen<br />
kann?<br />
Bei der Gleitpunktdarstellung ist die Kommastelle Bestandteil der Zahl. Dies<br />
erreicht man durch einen kleinen Kunstgriff:<br />
Die technisch wissenschaftliche Notation gibt die Kommaposition über einen<br />
Exponenten an. So kann z.B. die Zahl 3,84 auch so geschrieben werden:<br />
1. 384 x 10 -2<br />
2. 0,0384 x 10 2<br />
3. 38,4 x 10 -1<br />
Gesucht ist eine Darstellung, die folgendes leistet:<br />
• Sie soll ein möglichst großes Intervall der reellen Zahlen umfassen.<br />
• Ihre Genauigkeit soll bei kleinen Zahlen sehr hoch, bei großen Zahlen<br />
niedriger sein<br />
(Bei einem Betrag von 500.000€ auf dem Konto ist es relativ unwichtig, wie<br />
viel Cent hinter dem Komma stehen.<br />
Be<strong>im</strong> Versuch mit dem letzten Kleingeld eine DVB-Fahrkarte zu kaufen<br />
spielen Cents eine ungleich wichtigere Rolle.)<br />
Die Gleitpunktdarstellung erfüllt diese beiden Forderungen. Die Idee dahinter ist<br />
ganz einfach:<br />
Kleine Zahlen benötigen wenige Stellen vor dem Dez<strong>im</strong>alpunkt, so dass wir ihnen<br />
viele Stellen hinter dem Punkt und damit eine größere Genauigkeit spendieren<br />
können.<br />
Bei großen Zahlen ist es genau umgekehrt.<br />
Der Vorteil ist, dass man auf kurze und übersichtliche Weise einen sehr großen<br />
Zahlenbereich darstellen kann. Diese Darstellungsweise hat auch enorme Vorteile für<br />
die <strong>Zahlendarstellung</strong> in Computern: Hier ist man durch die Hardware auf eine oder<br />
wenige Wortgrößen (Anzahl von Bits) festgelegt, in denen ein Operand untergebracht<br />
werden muss. Würde nun nur die normale Dualdarstellung verwendet, könnte man<br />
bereits die Zahl 10 Milliarden in einem 32-Bit Wort nicht mehr darstellen. Wenn man<br />
andererseits auch gebrochene Zahlen in Festkommadarstellung zulassen möchte<br />
18
und jeweils 16 Bit vor und 16 Bit nach dem Komma verwendet, scheitert man bereits<br />
an der Zahl 100000. Der Bereich darstellbarer Zahlen ist in diesem Falle<br />
−<br />
2<br />
Gleitpunktzahlen bestehen nach dem Gesagten also aus drei Bestandteilen:<br />
• Dem Vorzeichenbit: V<br />
• Dem Exponenten: E<br />
• Der Mantisse: M<br />
Das Vorzeichenbit gibt an, ob die vorliegende Zahl positiv ('0') oder negativ ('1') ist.<br />
Der Exponent ist eine Binärzahl, zum Beispiel <strong>im</strong> Bereich -127 bis +127, die angibt,<br />
mit welcher Potenz einer Basiszahl b die vorliegende Zahl zu multiplizieren ist.<br />
Die Mantisse besteht aus Binärziffern m1...mn und gibt den Wert der vorliegenden<br />
Zahl an.<br />
Der Zahlenwert ergibt sich aus der Formel:<br />
Wert = Mantisse x Basis Exponent<br />
wobei das Vorzeichen +1 ist, wenn V=0 ist und -1, wenn V=1 ist. Dabei wird die<br />
Mantisse als positive Dualzahl und der Exponent als Dualzahl in<br />
Zweierkomplementdarstellung interpretiert.<br />
In den obigen Beispielen haben die Gleitpunktzahlen keine einheitliche Darstellung<br />
bezüglich der Vorkommastelle.<br />
Folglich gibt es unendlich viele Darstellungsmöglichkeiten für eine Zahl!<br />
--> Zur Bildung der normierten Gleitpunktzahl muss diejenige Darstellung gefunden<br />
werden, in der das (binäre) Ergebnis eine 1 vor dem Komma führt.<br />
Normierte Gleitpunktzahlen<br />
Motivation für eine Normierung:<br />
Es soll für jede darstellbare Zahl genau eine Darstellung als Gleitpunktzahl geben.<br />
• eindeutige Darstellung durch Normierung.<br />
15<br />
bis 2<br />
15<br />
− 2<br />
−16<br />
• Da durch die Normalisierung <strong>im</strong> Binärsystem <strong>im</strong>mer eine 1 vor dem Komma<br />
stehen muß, kann man diese auch weglassen.<br />
In der Mantisse werden dann nur noch die Stellen hinter dem Komma<br />
notiert! (Die führende "1," steht also gedacht links vor der Mantisse.)<br />
19
• Durch die Einsparung der führenden 1 können die Bits der Mantisse opt<strong>im</strong>al<br />
ausgenutzt werden, was besonders bei unendlich vielen Nachkommastellen<br />
(periodische Zahlen) eine höhere Rechengenauigkeit ermöglicht.<br />
Gleitpunktzahlen nach IEEE 754<br />
Nach IEEE 754 (Institute of Electrical and Electronics Engineers) normierte<br />
Gleitpunktzahlen verwenden b = 2 als Basiszahl.<br />
Zwei von IEEE verabschiedete Normen werden heute in den meisten <strong>Rechner</strong>n<br />
verwendet:<br />
• Short Real (einfache Genauigkeit) mit insgesamt 32 Bit:<br />
Vorzeichen - 1 Bit, Exponent - 8 Bit, Mantisse - 23 Bit<br />
• Long Real (doppelte Genauigkeit) mit insgesamt 64 Bit:<br />
Vorzeichen - 1 Bit, Exponent - 11 Bit, Mantisse - 52 Bit<br />
Im Folgenden betrachten wir einige Beispiele <strong>im</strong> Short Real Format mit 32 Bit:<br />
V Exponent ---> Mantisse ------------------------------------><br />
1 1 0 0 0 0 0 0 0 1 1 1 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0<br />
-3,7510 = 1100 0000 0111 0000 0000 0000 0000 00002<br />
= C070000016<br />
V Exponent ---> Mantisse ------------------------------------><br />
0 1 0 0 0 0 0 0 0 1 1 1 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0<br />
3,7510 = 0100 0000 0111 0000 0000 0000 0000 00002<br />
= 4070000016<br />
Rechenfehler mit Gleitpunktzahlen<br />
Dez<strong>im</strong>ale Gleitpunktzahlen und binäre Gleitpunktzahlen kann man ineinander<br />
umrechnen.<br />
Allerdings geht dieser Umrechnungsvorgang in beiden Richtungen nicht <strong>im</strong>mer auf,<br />
wenn wir jeweils eine best<strong>im</strong>mte Anzahl von Ziffern für die Mantisse vorschreiben<br />
(also die Genauigkeit einer Zahl begrenzen, indem wir die folgenden Stellen<br />
abschneiden).<br />
20
So lässt sich zum Beispiel die dez<strong>im</strong>ale Zahl 0,1 nicht exakt durch eine 32-Bit-<br />
Gleitpunktzahl darstellen, wie das folgende Beispiel zeigt:<br />
V Exponent ---> Mantisse ------------------------------------><br />
0 0 1 1 1 1 0 1 1 1 0 0 1 1 0 0 1 1 0 0 1 1 0 0 1 1 0 0 1 1 0 1<br />
0,110 ≈ 0011 1101 1100 1100 1100 1100 1100 11012<br />
= 3DCCCCCD16<br />
(Im 64-Bit-Format mit doppelter Genauigkeit sieht man, dass der Wert der Zahl<br />
eigentlich = 0,10000000149011612)<br />
V Exponent ---> Mantisse ------------------------------------><br />
0 0 1 1 1 1 0 1 1 1 0 0 1 1 0 0 1 1 0 0 1 1 0 0 1 1 0 0 1 1 0 0<br />
0,110 ≈ 0011 1101 1100 1100 1100 1100 1100 11002<br />
= 3DCCCCCC16<br />
(Im 64-Bit-Format mit doppelter Genauigkeit sieht man, dass der Wert der Zahl<br />
eigentlich = 0,09999999403953552)<br />
Wertebereiche reeller Zahlen in Programmiersprachen<br />
Wertebereich Bit Java C++<br />
-3,4x10 38 bis +3,4x10 38 32 float float<br />
-1,7x10 308 bis +1,7x10 308 64 double double<br />
Konvertierung reeller Zahlen in 32-Bit IEEE 754 Gleitpunktzahlen<br />
• Zunächst das generelle methodische Vorgehen:<br />
1. Das Vorzeichen wird mit 0 für positive Zahlen und 1 für negative Zahlen<br />
codiert.<br />
2. Konvertierung des ganzzahligen Anteils<br />
3. Der gebrochene Anteil wird sukzessive mit 2 multipliziert.<br />
• Wenn das Ergebnis größer (oder gleich) 1 ist, wird 1 subtrahiert und<br />
eine 1 als Ergebnis notiert.<br />
• Wenn das Ergebnis kleiner als 1 ist, wird erneut mit 2 multipliziert und<br />
eine 0 als Ergebnis notiert.<br />
• Diese Berechnung wird solange wiederholt, bis das Ergebnis gleich 0<br />
ist.<br />
• (Achtung! Dieser Prozess kann unendlich lange fortschreiten. Die<br />
Genauigkeit der Berechnung wird durch die für die Mantisse verfügbare<br />
Anzahl der Stellen begrenzt!)<br />
4. Das Ergebnis wird als Festkomma-Zahl notiert.<br />
21
5. Die Festkomma-Zahl wird normalisiert, d.h. das Komma wird so weit nach<br />
rechts oder links verschoben, bis vor dem Komma eine 1 steht.<br />
6. Die Anzahl der Stellen, um die das Komma verschoben wird, ergibt den Wert<br />
des Exponenten.<br />
7. Wird das Komma nach rechts verschoben, ist der Exponent negativ, wird er<br />
nach links verschoben, ist der Exponent positiv.<br />
8. Der Exponent e wird als natürliche Zahl e' codiert mit Wert e' = e + 127<br />
(Zum Exponenten addiert man einen sog. Bias von 127 und speichert das<br />
Ergebnis als vorzeichenlose 8-Bitzahl. Dies ist eine weitere Methode, um<br />
positive und negative Zahlen darzustellen. Sie wird <strong>im</strong> Falle von<br />
Gleitpunktzahlen angewendet, um Vergleiche zwischen verschiedenen<br />
Gleitpunktzahlen technisch besonders einfach zu machen.)<br />
9. Die Nachkommastellen (!) werden genommen und auf die Breite der<br />
Mantisse nach rechts mit Nullen aufgefüllt.<br />
10. Die Bits werden in der Reihenfolge Vorzeichen - Exponent - Mantisse<br />
angeordnet.<br />
Die Konvertierung am Beispiel<br />
• Beispiel: Konvertierung von (-3.75)10 in eine Gleitpunktzahl:<br />
•<br />
1. Vorzeichen: 1<br />
2. 3 = (11)2<br />
3. 0.75 * 2 = 1.5<br />
1.5 - 1 = 0.5 --> 1 als Ergebnis notieren.<br />
0.5 * 2 = 1<br />
1 - 1 = 0 --> 1 als Ergebnis notieren.<br />
4. Festkomma-Darstellung: (11.11)2<br />
5. Normalisieren: 1.111 * 2 1<br />
Da die erste Ziffer <strong>im</strong>mer 1 ist, fällt diese nach der Normalisierung weg!<br />
6. Exponent: 1 --> e' = 1 + 127 = 128 = (1000 0000)2<br />
7. Die Nachkommastellen der Mantisse m mit Nullen auffüllen:<br />
m = (111 0000 0000 0000 0000 0000)2<br />
8. Das Ergebnis: 1100 0000 0111 0000 0000 0000 0000 0000<br />
22
Gleitkomma-Arithmetik<br />
Die Multiplikation von Gleitkommazahlen ist einfach, denn es gilt laut den<br />
Potenzgesetzen:<br />
e1<br />
e2<br />
e1<br />
+ e2<br />
m1<br />
⋅ 2 ⋅ m2<br />
⋅ 2 = m1<br />
⋅ m2<br />
⋅ 2<br />
Das bedeutet, dass die Mantissen als normale Dualzahlen multipliziert werden<br />
können und die Exponenten addiert werden. Das gleiche gilt für die Division.<br />
Schwieriger ist dagegen die Addition: Hier muss zunächst dafür gesorgt werden,<br />
dass die Exponenten angeglichen werden, denn eine Addition der Mantissen kann<br />
entsprechend den Potenzgesetzen nur dann richtig ausgeführt werden, wenn die<br />
Exponenten gleich sind:<br />
1<br />
e1<br />
( m + m )<br />
m ⋅<br />
⋅<br />
e<br />
2 2<br />
1 2<br />
1 e1<br />
+ m ⋅ 2 = 2<br />
Zu diesem Zweck muss zunächst ermittelt werden, welcher Exponent der größere ist<br />
und die Exponentendifferenz d wird mittels einer Subtraktion gebildet. Sodann wird<br />
die Mantisse der Zahl mit dem kleineren Exponenten um d Stellen nach rechts<br />
verschoben, wobei von links Nullen nachgezogen werden. Dies entspricht einer<br />
Division der Mantisse durch 2 d bei gleichzeitiger Vergrößerung des Exponenten um<br />
d. Nun kann die Addition auf den angepassten Mantissen durchgeführt werden,<br />
wobei der größere Exponent der Operanden zum Exponenten des Ergebnisses wird.<br />
Durch die Addition kann es passieren, dass <strong>im</strong> Ergebnis eine Folge von führenden<br />
Nullen entsteht. Um aber für nachfolgende Operationen die Genauigkeit nicht<br />
einzuschränken, wird die Mantisse des Ergebnisses nun wieder nach links<br />
verschoben, bis die erste signifikante Stelle eine 1 ist. Wenn die Verschiebedistanz d’<br />
ist, muss schließlich der Exponent noch um d’ vermindert werden, damit der Wert<br />
des Ergebnisses nicht verändert wird.<br />
23
Hausaufgaben zur Übung 5<br />
Stellen Sie folgende Dez<strong>im</strong>alzahlen als Gleitkommazahlen <strong>im</strong> Format IEEE 754 mit<br />
32 Bit dar.<br />
a) 13,84 b) 9,37<br />
c) 10,1 d) 0,77<br />
e) -8,62 f) -13,75<br />
24