12.07.2012 Aufrufe

4 Zahlendarstellung im Rechner (Fortsetzung)

4 Zahlendarstellung im Rechner (Fortsetzung)

4 Zahlendarstellung im Rechner (Fortsetzung)

MEHR ANZEIGEN
WENIGER ANZEIGEN

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

Hurra! Ihre Datei wurde hochgeladen und ist bereit für die Veröffentlichung.

Erfolgreich gespeichert!

Leider ist etwas schief gelaufen!