2.1. Digitale Zahldarstellung im Computer#

Wir beschäftigen uns zunächst mit der Frage, wie moderne Digitalrechner, wie zum Beispiel jeder handelsübliche PC, eine reelle Zahl \(x \in \mathbb{R}\) intern speichern und verarbeiten. Es ist klar, dass durch die endliche Anzahl der integrierten Schaltungen in einem Computerspeicher eine Zahl nur endlich viele Stellen besitzen kann. Dadurch ist es unmöglich eine beliebige irrationale Zahl numerisch exakt zu speichern, so dass durch die Endlichkeit des Computerspeichers zwangsläufig Rundungsfehler auftreten müssen.

Definition 2.1 (Maschinenzahlen)

Wir bezeichnen die Menge aller in einem Digitalrechner darstellbaren Zahlen \(A \subset \mathbb{Q}\) als Maschinenzahlen. Die Menge der Maschinenzahlen wird durch das gewählte Format der Zahldarstellung definiert.

Um die Rundungsfehler durch die digitale Zahldarstellung im Folgenden näher zu charakterisieren, muss man verstehen, dass jede Zahl in einem Digitalrechner eine Darstellung aus \(0\)en und \(1\)en, den sogenannten Bits, besitzt. Die Anzahl \(n\in \mathbb{N}\) der Dualstellen für die Repräsentation einer Zahl wird auch Wortlänge genannt. Sie wird typischerweise durch die Prozessorarchitektur vorgegeben. Aktuelle PCs verwenden eine Wortlänge von \(n=64\) Bit. Wir nehmen im folgenden eine Rechnerarchitektur an, die ein Speicherwort in der Little Endian-Konvention speichert, d.h., dass das am wenigsten signifikante Byte (1 Byte \(\hat{=}\) 8 Bit) am Anfang des Wortes steht.

2.1.1. Festkommazahlen#

Betrachtet man die sogenannte Festkommadarstellung einer Zahl in einem Digitalrechner, so teilt man die vorliegende Wortlänge in \(n = n_1 + n_2\) Dualstellen auf und nimmt implizit an, dass der Dezimalpunkt zwischen dem \(n_1\)-ten und \((n_1+1)\)-ten Bit liegt. Nehmen wir zur Vereinfachung im Folgenden an, dass wir nur positive Zahlen darstellen wollen, dann können wir auf die Darstellung eines Vorzeichens verzichten. Damit kann man Maschinenzahlen \(x\in A\) der folgenden Form darstellen:

\[x \ = \ \sum_{i=0}^{n_1-1} a_i 2^i + \sum_{i=1}^{n_2} b_i 2^{-i} \ = \ \underbrace{a_{n_1-1}2^{n_1-1} + \ldots + a_12^1 + a_02^0}_{n_1 \text{ Summanden}} + \underbrace{b_12^{-1} + \ldots b_{n_2}2^{-n_2}}_{n_2 \text{ Summanden}}\]

Die Koeffizienten \(a_i,b_i\) stellen die Bits eines Speicherwortes der Länge \(n\) dar und können dementsprechend nur die Werte \(0\) oder \(1\) annehmen.

Beispiel 2.1 (Festkommadarstellung)

Sei die Wortlänge eines Digitalrechners \(n=4\). Verwenden wir also die Festkommadarstellung mit \(n_1=3\) und \(n_2=1\), so würde das Speicherwort \(\fbox{101}\fbox{1}\) die Zahl \(5.5\) darstellen, denn es lässt sich ausrechnen:

\[\boxed{1\cdot 2^2 + 0\cdot 2^1 + 1\cdot 2^0} +\boxed{ 1\cdot 2^{-1}} = 4 + 0 + 1 + 0.5 = 5.5\]

2.1.2. Gleitkommazahlen#

Heutzutage wird die oben beschriebene Festkommadarstellung von Zahlen kaum noch in Digitalrechnern verwendet, da sie zu unflexibel ist und über eine zu geringe Mächtigkeit bei der Zahldarstellung verfügt. Aus diesem Grund hat man die Gleitkommadarstellung von Zahlen in Digitalrechnern eingeführt. Man verwendet typischerweise die normalisierte Gleitkommadarstellung, für die es bereits seit 1985 den IEEE 754 Standard gibt, welchen wir in IEEE 754 Standard näher betrachten werden. Dieser ist auf fast allen modernen Digitalrechnern heutzutage implementiert. Hierbei wird die Stelle des Dezimalpunktes nicht fest vorgegeben, sondern kann in Abhängigkeit der zu darstellenden Zahl flexibel gewählt werden. Der zu Grunde liegende Gedanke bei dieser Darstellung ist es, dass große Zahlen häufig wenig Genauigkeit bei den Nachkommastellen benötigen, wohingegen sehr kleine Zahlen eine hohe Genauigkeit bei den Nachkommastellen brauchen.

Wir betrachten im Folgenden die digitale Zahldarstellung mit Hilfe von Gleitkommazahlen.

Definition 2.2 (Gleitkommazahlen)

Die Menge aller Maschinenzahlen \(A \subset \mathbb{Q}\) der Form

\[x \ = \ m\cdot b^e ,\]

für \(x\in A\) stellt die Menge der exakt darstellbaren Gleitkommazahlen in Abhängigkeit der gewählten Mantisse \(m \in \mathbb{Q}\), der Basis \(b \in \mathbb{N}\) und des Exponenten \(e \in \mathbb{Z}\) dar.

Typischerweise wird die Basis \(b\) in Digitalrechnern als \(b=2\) angenommen, wohingegen Menschen natürlicherweise mit einer Zehnerpotenz, d.h. \(b=10\) als Basis rechnen.

Für eine Gleitkommazahl \(x\in A\) wird die Mantisse \(m \in \mathbb{Q}\) durch \(p\in\mathbb{N}\) Stellen mit \(p < n\) festgelegt und bestimmt die Genauigkeit bei der Approximation einer Zahl durch \(x\). Für die Speicherung einer Maschinenzahl im Digitalrechner wird angenommen, dass die Mantisse durch eine positive Ganzzahl in Binärdarstellung repräsentiert wird.

Der Exponent erhält bei der Zahldarstellung \(r\in\mathbb{N}\) Stellen mit \(r < n\) und ist maßgeblich für die Definition des Wertebereichs von Maschinenzahlen und der genauen Stelle des Kommas bei einer Zahldarstellung verantwortlich. Für die Speicherung einer Maschinenzahl im Digitalrechner wird angenommen, dass der Exponent eine positive oder negative Ganzzahl repräsentiert und die entsprechenden Bits werden daher als solche interpretiert. Hierbei verwendet man typischerweise jedoch nicht die Darstellung des Exponenten im Zweierkomplement [Zwe], sondern führt einen festen Biaswert ein (mehr dazu in IEEE 754 Standard zum IEEE 754 Standard).

Das erste Bit einer Gleitkommazahl wird für das Vorzeichen reserviert (\(\fbox{0}\) ist positiv und \(\fbox{1}\) ist negativ), während die restlichen Bit zwischen Mantissenlänge und Exponentenlänge aufgeteilt werden, d.h., es gilt insgesamt

\[n \ = \ 1 + p + r.\]

2.1.3. Normalisierung#

Im Allgemeinen ist die Darstellung einer Zahl durch eine Gleitkommazahl nicht eindeutig, wie folgendes Beispiel zeigt.

Beispiel 2.2 (Uneindeutigkeit von Gleitkommazahlen)

Wir betrachten im Folgenden unterschiedliche Zahldarstellungen einer Zahl jeweils im Dezimal- sowie im Dualsystem.

  1. Die Darstellung der Zahl \(x = 3.5\) lässt sich in der Dezimaldarstellung bezüglich der Basis \(10\) auch schreiben als \(x= 35\cdot10^{-1}\) oder \(x = 0.35\cdot10^1\). Die Darstellung ist also nicht eindeutig, da das Komma an beliebige Stelle verschoben werden kann durch die Änderung des Exponenten.

  2. Für ein Speicherwort der Länge \(n=8\) Bit mit Basis \(2\), Mantissenlänge \(p=5\) und Exponentenlänge \(r=2\) gibt es für die Zahl \(14\) die Gleitpunktdarstellungen

\[\fbox{0} \underbrace{\fbox{00}}_{r} \underbrace{\fbox{01110}}_{p} \ = \ + \: 2^{(0\cdot 2^1 + 0\cdot 2^0)} \cdot (0\cdot2^4 + 1\cdot2^3 + 1\cdot2^2 + 1\cdot2^1 + 0\cdot2^0) \ = \ 1 \cdot 14 \ = \ 14\]

und

\[\fbox{0} \fbox{01} \fbox{00111} \ = \ + \: 2^{(0\cdot 2^1 + 1\cdot 2^0)} \cdot (0\cdot2^4 + 0\cdot2^3 + 1\cdot2^2 + 1\cdot2^1 + 1\cdot2^0) \ = \ 2 \cdot 7 \ = \ 14.\]

Für dieses Beispiel haben wir die Bits für den Exponenten und für die Mantisse jeweils als eine positive Ganzzahl interpretiert.

Um die Eindeutigkeit der Darstellung einer Zahl in einem Digitalrechner sicher zu stellen, muss man die Gleitkommazahl normieren.

Definition 2.3 (Normalisierung von Gleitkommazahlen)

Wir nennen die Gleitkommadarstellung einer Zahl normalisiert, falls für die Mantisse eine feste Bedingung \(a_1 \leq m < a_2\) für \(0 \leq a_1 < a_2\) gilt.

Typische Normalisierungsbedingungen für Gleitkommazahlen sind \(b^{-1} \leq m < 1\) oder \(1 \leq m < b\).

Der Vorteil der Normalisierung besteht darin, dass man die Ziffer vor dem Komma nicht explizit speichern muss, da man davon ausgehen kann, dass diese für alle normalisierte Gleitkommazahlen gleich ist. Man spricht auch in diesem Zusammenhang vom Hidden Bit.

2.1.4. IEEE 754 Standard#

Es wird klar, dass man bei der Aufteilung der \((n-1)\) Bit eines Maschinenworts der Länge \(n\) einen Kompromiss zwischen der Approximationsgenauigkeit einer Zahl (definiert durch \(p\)) und der Größe des Wertebereichs (definiert durch \(r\)) finden muss. Aus diesem Grund gibt es verschiedene vorgeschlagene IEEE-Standards zur Implementierung und Interpretation von Gleitkommazahlen in Digitalrechnern, z.B. Half-, Single- und Double-Precision Gleitkommazahlen. Wir wollen uns im Folgenden ein Beispiel zur Speicherung einer Gleitkommazahl im Single Precision Format nach dem IEEE 754 Standard [IEE] betrachten.

Beispiel 2.3 (Gleitkommazahldarstellung nach IEEE 754 Standard)

Wir wollen die Zahl \(x = 18.4\) in einem Digitalrechner nach dem IEEE 754 Standard für Single Precision Gleitkommazahlen zur Basis \(b=2\) darstellen, d.h., wir haben eine Wortlänge von \(n=32\), Mantissenlänge \(p=23\) und Exponentenlänge \(r=8\). Der IEEE 754 Standard benutzt zur Speicherung des Exponenten einen festen Bias von \(B=127\), der auf den Exponenten aufaddiert wird und dadurch immer eine vorzeichenfreie, positive Zahl \(E = e+B\) entsteht. Dies hat Vorteile beim Vergleich von Exponenten verschiedener Gleitkommazahlen.

Im ersten Schritt nähern wir die Zahl \(18.4\) als Festkommazahl an wie in Festkommazahlen beschrieben. Hierzu stellen wir zuerst die Zahl \(18\) vor dem Komma im Binärsystem dar als:

\[18 \ = \ 16 + 2 \ = \ 1\cdot2^4 + 0\cdot2^3 + 0\cdot2^2 + 1\cdot2^1 + 0\cdot2^0 \ = \ \fbox{10010}.\]

Versuchen wir nun den Rest \(0.4\) nach dem Komma darzustellen:

\[\begin{split} 0.4 \ =& \ 0\cdot2^{-1} + 1\cdot2^{-2} + 1\cdot2^{-3} + 0\cdot2^{-4} + 0\cdot2^{-5} + 1\cdot2^{-6} + 1\cdot2^{-7} + \ldots \\ \ =& \ \fbox{0110011\ldots} \end{split}\]

sehen wir, dass die Zahl \(0.4\) eine periodische Struktur in der Binärdarstellung besitzt. Da man nur eine endliche Wortlänge von \(n=32\) hat, wird die Zahl inexakt dargestellt. Es ergibt sich also folgende Festkommadarstellung der Zahl \(18.4\) im Dualsystem:

\[18.4 \ = \ \fbox{10010,0110011\ldots}\]

Für die Normalisierung der Gleitkommazahl im IEEE 754 Format müssen wir die Bedingung \(1 \leq m < 2\) erfüllen. Dies kann erreicht werden indem wir den Exponenten \(e = 4\) wählen, d.h., wir verschieben das Komma um \(4\) Stellen nach links, multiplizieren die resultierende Zahldarstellung mit dem Faktor \(2^4\) und erhalten somit die Darstellung:

\[\fbox{1,00100110011\ldots} \cdot 2^4.\]

Wir stellen den Exponenten nun mit Hilfe des Bias von \(B=127\) dar, d.h.,

\[E \ = \ e + B \ = \ 4 + 127 \ = \ \fbox{00000100} + \fbox{01111111} \ = \ \fbox{10000011} \ = \ 131.\]

Da wir normalisierte Gleitkommazahlen verwenden müssen wir die führende \(1\) vor dem Komma nicht explizit speichern. Aus den obigen Berechnungen lässt sich die Zahl \(18.4\) nun als folgende \(32\) Bit Gleitkommazahl approximieren:

\[18.4 \ \approx \ \underbrace{\fbox{0}}_{\text{Vorz.}} \underbrace{\fbox{10000011}}_{8 \text{ Bit Exponent}} \underbrace{\fbox{00100110011001100110011}}_{23 \text{ Bit Mantisse}}\]

Bemerkung 2.1

Bei der Rückkonvertierung der in Beispiel 2.3 berechneten Gleitkommazahldarstellung in eine Dezimalzahl erhält man auf Grund der Endlichkeit der Mantisse und der Periodizität der Dualdarstellung von \(0.4\) das inexakte Ergebnis

\[18.4 \ \approx \ \fbox{0} \fbox{10000011} \fbox{00100110011001100110011} \ = \ 18.39999961853\]

Wir erkennen also, dass \(x=18.4 \not\in A\) keine Maschinenzahl in Bezug auf den IEEE 754 Standard ist und daher nicht exakt dargestellt werden kann. Es kommt automatisch zu Rundungsfehlern.