Suche im Lexikon
Lexikon auf Ihrer Homepage Lexikon als Lesezeichen hinzufügen

Gleitkommazahl

Eine Gleitkommazahl (auch Gleitpunktzahl oder Fließkommazahl; englisch floating point number) ist eine approximative Darstellung einer reellen Zahl (Exponentialdarstellung).

Gleitkomma.png

Die Menge der Gleitkommazahlen ist eine endliche Teilmenge der rationalen Zahlen. Zusammen mit den auf ihnen definierten Operationen (Gleitkommaarithmetik) bilden die Gleitkommazahlen eine endliche Arithmetik, die vor allem im Hinblick auf numerische Berechnungen mit Computern entwickelt wurde.

Inhaltsverzeichnis

Grundlagen

Problem

Alle (mechanischen oder elektronischen) Rechenhilfsmittel vom Abakus bis zum Computer verwenden als einfachste Form der Zahldarstellung Festkommazahlen. Dabei wird eine meistens begrenzte Ziffernfolge gespeichert und an festgelegter Stelle das Komma angenommen.

Bei grĂ¶ĂŸeren Rechnungen treten unweigerlich ÜberlĂ€ufe auf, die eine Skalierung der Werte und eine erneute Durchrechnung erforderlich machen, um Endergebnis und alle Zwischenergebnisse in den erlaubten Wertebereich zu bringen. Diese Skalierung ist zeitraubend und muss automatisiert werden.

Exponentialschreibweise

Ein naheliegender und direkt zu Gleitkommazahlen fĂŒhrender Gedanke ist dabei, bei jedem Wert die genaue Stelle des Kommas zusĂ€tzlich zu speichern. Das bedeutet mathematisch nichts anderes als die Darstellung der Zahl <math>x</math> mit zwei Werten, der Mantisse <math>m</math> und dem Exponenten <math>e</math>: <math>x = m \cdot 10^e</math>. Die Freiheit bei der Wahl des Exponenten kann genutzt werden, um die Mantisse in einen festgelegten Wertebereich, zum Beispiel <math>1 \le m < 10</math> zu bringen. Dieser Schritt heißt Normalisierung der Mantisse.

Beispiel: Die Lichtgeschwindigkeit im Vakuum betrĂ€gt c = 299.792.458 m/s = 299.792,458 Â· 103 m/s = 0,299792458 Â· 109 m/s = 2,99792458 Â· 108 m/s. Nur die Mantisse der letzten Darstellung ist auf den Wertebereich [1, 10[ normalisiert.

Diese Schreibweise wurde von Physikern und Mathematikern schon seit langem verwendet, um sehr große und sehr kleine Zahlen angeben zu können. Noch heute wird deshalb die Gleitkommaschreibweise auf Taschenrechnern speziell als wissenschaftliches Format (sci) bezeichnet.

Gleitkommaarithmetik

Bei Rechnungen mit Gleitkommazahlen wird jede Zahl und jedes Zwischenergebnis individuell skaliert (im Gegensatz zu einer globalen Skalierung). Die Skalierung (Berechnung des Exponenten) jedes Zwischenergebnisses erfordert zusĂ€tzlichen Rechenaufwand und wurde deshalb bis weit in die 1980er Jahre nach Möglichkeit vermieden. So hatten die damaligen PCs standardmĂ€ĂŸig keinen Gleitkommaprozessor. Ein weiterer Faktor war der höhere Speicherbedarf von Gleitkommazahlen, der nur durch Verzicht auf höhere Genauigkeit eingeschrĂ€nkt werden konnte. Dementsprechend hatten zunĂ€chst nur die Höchstleistungsrechner (number cruncher) eine Gleitkommaarithmetik oder wenigstens eine HardwareunterstĂŒtzung einer Software-Gleitkommaarithmetik.

Die Wahl der Basis 10 ist willkĂŒrlich und nur dem ĂŒblichen Zehnersystem geschuldet. Gleitkommazahlen können mit beliebigen Basen dargestellt werden, im Allgemeinen gilt <math>x = m \cdot b^e</math> mit einer beliebig gewĂ€hlten Basis <math>b</math>. Rechenanlagen verwenden <math>b = 2</math> (vorherrschend), <math>b = 16</math> (heute selten) oder <math>b = 10</math> (z. B. fĂŒr Finanzmathematik, siehe unten). Bei beliebiger Basis ist die Bedingung fĂŒr normalisierte Zahlen <math>1 \le m < b</math>.

Geschichtliche Entwicklung

Die erste dokumentierte Verwendung der Gleitkommaschreibweise liegt etwa 2700 Jahre zurĂŒck: Im Zweistromland (Mesopotamien) wurden wissenschaftliche Rechnungen mit der Basis <math>b = 60</math> durchgefĂŒhrt und der Exponent (eine meistens kleine ganze Zahl) einfach im Kopf mitgefĂŒhrt.[1][2][3][4] Dasselbe Vorgehen war bis vor kurzer Zeit bei Berechnungen mit einem Rechenschieber ĂŒblich.

In Rechenautomaten wurde erstmals von Konrad Zuse eine eigene Gleitkommadarstellung fĂŒr seine Computer Z1 und Z3 verwendet.

Darstellung

Im vorigen Abschnitt wurden die grundlegenden Parameter einer Gleitkommazahl bereits vorgestellt. Es sind Basis <math>b</math>, Anzahl der Mantissenstellen <math>p</math> und Anzahl der Exponentenstellen <math>r</math>. Hinzu kommen weitere Parameter, die beim Rechnen die Rechenoperationen erleichtern sollen. In diesem Abschnitt werden Parameter und Bitfelder einer allgemeinen Gleitkommazahl kurz beschrieben.

Basis

<math>2{,}997.924.58 \cdot {\color{Red}10}^8</math>

Ein Parameter ist die gewĂ€hlte Basis <math>{\color{Red}b}</math>. Zahlen, die von Menschen direkt verarbeitet werden, verwenden entweder <math>b = 10</math> oder <math>b = 1000</math>. In diesem speziellen Fall verwendet man fĂŒr den Exponenten die VorsĂ€tze Kilo=10001, Mega=10002, Giga=10003, Tera=10004 und Milli=1000−1, Mikro=1000−2, Nano=1000−3, Piko=1000−4 des internationalen Einheitensystems. Die Entfernungsangabe von Regensburg nach WĂŒrzburg mit 220 km kann daher auch in der Form 220,0 Â· 10001 m dargestellt werden.

Im Computer haben sich das Dualsystem und seine Verwandten durchgesetzt und es sind die Basen <math>b = 2</math>, <math>b = 8</math> und <math>b = 16</math> ĂŒblich. Seit der Norm fĂŒr Gleitkommazahlen IEEE 754 wird in modernen Computern fast ausschließlich die Basis <math>b = 2</math> verwendet.

FĂŒr die externe Schreibweise von Gleitkommazahlen im Dezimalsystem beim Computer hat sich eine Form durchgesetzt, bei der die Basis mit dem Buchstaben e, bei einem double-Format manchmal auch mit d markiert wird.

Beispiel: Die Lichtgeschwindigkeit im Vakuum betrĂ€gt c = 2,997.924.58 Â· 108 m/s = 2,997.924.58e8 m/s.

Mantisse

<math>{\color{Red}2{,}997.924.58} \cdot 10^8</math>

Die Mantisse <math>{\color{Red}m}</math> enthĂ€lt die Ziffern der Gleitkommazahl. Speichert man mehr Ziffern ab, so erhöht sich die Genauigkeit. Die Anzahl <math>p</math> der Mantissenziffern drĂŒckt also aus, wie exakt die Zahl approximiert wird. Dieser Gleitkommaparameter wird entweder direkt angegeben oder auch in Form der kleinsten Zahl <math>\epsilon</math> beschrieben, die zu 1 addiert werden kann und ein von 1 verschiedenes Ergebnis liefert (<math>1 + \epsilon > 1 </math>; <math> \epsilon</math> minimal!) (s. u. bei Eigenschaften).

Beispiel: Bei IEEE-754-Zahlen vom Typ Single mit der Basis <math>b = 2</math> ist die Mantisse <math>p = 23</math> Stellen lang. Hier ist <math>\epsilon = </math> 1,19209289551e−0007.

Exponent

<math>2{,}997.924.58 \cdot 10^{\color{Red}8}</math>

Der Exponent <math>{\color{Red}e}</math> speichert die genaue Stelle des Kommas und damit die GrĂ¶ĂŸenordnung der Zahl. Die Anzahl <math>r</math> der Exponentenziffern beschrĂ€nkt die Variationsmöglichkeiten des Kommas und beschreibt damit den Wertebereich der dargestellten Gleitkommazahlen. Um ein System von Gleitkommazahlen zu beschreiben, gibt man den kleinsten und den grĂ¶ĂŸten möglichen Exponenten an oder auch die Anzahl der Exponenten und die Verschiebung zur 0 (Bias).

Beispiel: Bei IEEE-754-Zahlen vom Typ Single mit der Basis <math>b = 2</math> ist der kleinste mögliche Exponent −126 und der grĂ¶ĂŸte 127. Damit ist die grĂ¶ĂŸte in diesem System darstellbare Gleitkommazahl <math>\max = 1{,}1111\ldots \cdot 2^{127} \approx 3{,}4 \cdot 10^{+38}</math> und die kleinste normalisierte Gleitkommazahl <math> \operatorname{minpos} = 1{,}00000\ldots \cdot 2^{-126} \approx 1{,}175 \cdot 10^{-38}</math>. Diese GrĂ¶ĂŸen, <math>\max = 3{,}4 \cdot 10^{+38}</math> und <math> \operatorname{minpos} = 1{,}175 \cdot 10^{-38}</math>, beschreiben den zulĂ€ssigen Wertebereich.

Normalisierung

<math>{\color{Red}2{,}}997.924.58 \cdot 10^8</math>

Die Darstellung einer Gleitkommazahl ist zunÀchst nicht eindeutig bestimmt. Die Zahl 2 kann als <math>2{,}0 \cdot 10^0</math> oder auch <math>0{,}2 \cdot 10^1</math> geschrieben werden.

Um die Benutzung einer eindeutig bestimmten Darstellung zu erzwingen, werden daher oft normalisierte Gleitkommazahlen verwendet, bei denen die Mantisse in einen definierten Bereich gebracht wird. Die beiden natĂŒrlichen Normalisierungsbedingungen sind <math>1/b \le m < 1</math> und <math>1 \le m < b</math>. Die Zahl 2 wĂŒrde man also bezĂŒglich der ersten Normalisierungsbedingung als <math>0{,}2 \cdot 10^1</math> schreiben, die Darstellung <math>2{,}0 \cdot 10^0</math> wĂ€re dann nicht erlaubt. Das Rechnen mit normalisierten Zahlen ist einfacher, weshalb in der Vergangenheit manche Implementatoren einer Gleitkommaarithmetik nur normalisierte Zahlen zuließen. Die Zahl 0 kann allerdings nicht normalisiert dargestellt werden.

Dabei unterscheidet man – in Bezug zur ĂŒblichen Basis 10 im Zahlensystem:

  • Wissenschaftliche Notation mit konsequenter Normalisierung auf <math>1 \le m < 10</math>
    Beispiel: 10000 = 1 âˆ™ 104
  • Technische Notation mit Normalisierung auf <math>1/f \le m < 1000</math>, mit f als Potenz der Anzahl der verbleibenden signifikanten Stellen der Messunsicherheit fĂŒr die Rechengenauigkeit (denormalisierte Stellen). Im Exponent erscheinen nur Vielfache von 3 – diese Darstellung lĂ€sst sich beim Rechnen mit Maßeinheiten sowohl zwanglos in die EinheitenvorsĂ€tze, als auch die Zifferngruppierung mit Tausendertrennzeichnung ĂŒberfĂŒhren, bzw. sich daraus erzeugen
    Beispiel: 10.000 m = p5031010 × 103 m = 10 km
    Signifikanz: p50310.0010,00 × 103 m = 10.000 ± 5 m (4 signifikante Stellen bezĂŒglich Messung in Kilometern mit Rundung), aber p5060.010,01 × 106 m = 10.000 ± 5000 m (2 signifikante Stellen bzgl. Messung in Mm) – wobei die prĂ€zisen Angaben ĂŒber Standard- und erweiterte Messunsicherheit DIN 1319-3 bzw. dem ISO/BIPM-Guide (GUM, ENV 13005) folgen
  • IEEE 754 (Gleitkommazahlen fĂŒr Mikroprozessoren) verwendet bei normalisierten Zahlen die Normalisierungsbedingung <math>1 \le m < 2</math> und erlaubt zwischen 0 und minpos zusĂ€tzlich denormalisierte (subnormale) Zahlen.

Darstellung des Exponentenvorzeichens mit oder ohne Bias <math>B</math>

In Gleitkommasystemen ist der Exponent eine Zahl mit Vorzeichen. Das verlangt vom Implementierer eine zusĂ€tzliche ganzzahlige Arithmetik mit Vorzeichen fĂŒr Exponentenberechnungen. Dieser zusĂ€tzliche Aufwand kann vermieden werden, wenn zum Exponenten <math>e</math> eine feste Zahl <math>B</math>, der Biaswert oder Exzess, addiert wird und statt des Exponenten <math>e</math> die Summe <math>E = e + B</math> gespeichert wird. Diese Summe ist dann eine vorzeichenfreie positive Zahl. Meistens wird die Verwendung eines Bias <math>B</math> mit der Darstellung der 0 durch <math>e = 0</math> kombiniert.

Eine heute selten anzutreffende Alternative ist die Darstellung des Exponenten im Zweierkomplement, im Einerkomplement oder als Betrags-Vorzeichenzahl.

Der Vorteil der Biased-Darstellung besteht darin, dass auf diese Weise ein GrĂ¶ĂŸenvergleich zwischen zwei positiven Gleitkommazahlen erleichtert wird. Es genĂŒgt, die Ziffernfolgen em, also jeweils Exponent e gefolgt von Mantisse m, lexikografisch miteinander zu vergleichen. Eine Gleitkomma-Subtraktion mit anschließendem Vergleich auf Null wĂ€re weitaus aufwĂ€ndiger. Der Nachteil der Biased-Darstellung gegenĂŒber der Zweierkomplement-Darstellung besteht darin, dass nach einer Addition zweier Biased-Exponenten der Bias subtrahiert werden muss, um das richtige Ergebnis zu erhalten.

IEEE verwendet die Darstellung mit B=127 bei Single und B=1023 bei Double.

Vorzeichen der Zahl

Das Vorzeichen v einer Gleitkommazahl (+ oder −; auch +1 oder −1) kann immer in einem Bit kodiert werden. Meistens wird das Bit <math>S = 0</math> fĂŒr positive Zahlen (+) und das Bit <math>S = 1</math> fĂŒr negative Zahlen (−) verwendet. Mathematisch kann man schreiben <math>v = (-1)^S</math>

Kurzdarstellung der Parameter

In den letzten Jahren hat sich die folgende Kurzdarstellung der wesentlichen Parameter <math>b</math>, <math>p</math>, <math>r</math> und <math>B</math> eines Gleitkommasystems durchgesetzt. Dabei schreibt man durch Punkte getrennt die GrĂ¶ĂŸen 1, <math>r</math>, <math>p</math>, <math>B</math> und <math>b</math> in genau dieser Reihenfolge auf. Die 1 ist dabei die Anzahl der Vorzeichenbits. Eine IEEE-754-Single-Zahl mit 1 Vorzeichenbit, 8 Exponentenbits und 23 Mantissenbits ist also eine 1.8.23.127.2 Gleitkommazahl. Geht die Basis <math>b</math> und der Bias <math>B</math> aus dem Zusammenhang hervor, kann beides weggelassen werden und man spricht von einer 1.8.23-Gleitkommazahl.

Eine zweite gÀngige Schreibweise lÀsst das Vorzeichenbit weg und gibt nur MantissenlÀnge und ExponentenlÀnge an: s23e8.

IEEE-754-Double-Zahlen sind 1.11.52.1023.2- oder kurz 1.11.52- oder s52e11-Gleitkommazahlen.

Hidden Bit

Bei der Darstellung normalisierter Mantissen im BinĂ€rsystem kann ein Bit eingespart werden. Da die erste Stelle einer normalisierten Zahl immer ungleich 0 ist, ist diese Stelle im BinĂ€rsystem immer gleich 1. Eine Ziffer mit dem festen Wert 1 muss nicht mehr explizit gespeichert werden, da sie implizit bekannt ist. Wird diese Möglichkeit genutzt, spricht man von einem hidden bit. Das erwĂ€hnte IEEE-Format fĂŒr Gleitkommazahlen macht von dieser Einsparungsmöglichkeit Gebrauch, nicht jedoch das interne 80-Bit-Format der Intel-CPUs.

Allerdings erzwingt die Verwendung eines Hidden Bit eine gesonderte Darstellung der Null, da jede Mantisse aufgrund des Hidden Bit einen Wert >0 reprÀsentiert.

Eigenschaften einer Gleitkommaarithmetik

Gleitkommazahlen warten besonders fĂŒr den mathematischen Laien mit einigen Überraschungen auf, die auch oft das Ergebnis von Taschenrechner- und Computerrechnungen beeinflussen. Am wichtigsten sind außerkraftgesetzte gelĂ€ufige mathematische Rechenregeln. Wer intensiv mit einem Rechenhilfsmittel arbeitet, muss diese Eigenschaften kennen. Sie gehen auf die begrenzte Genauigkeit zurĂŒck, mit der Mantisse und Exponent gespeichert werden. Die Konsequenz dieser Begrenzung wird klar, wenn man sich ĂŒberlegt, dass die unendlich vielen reellen Zahlen durch sehr viele, aber in jedem Fall nur noch endlich viele Werte dargestellt werden. Man kann sich Gleitkommazahlen als lange Tabelle fester Werte vorstellen. Eine Gleitkommafunktion ordnet dann jedem Wert dieser Tabelle in ihrem Definitionsbereich einen anderen Wert dieser Tabelle zu. Analoges gilt fĂŒr zwei- und mehrstellige Operationen. Im Artikel Minifloats sind diese Tabellen grafisch dargestellt.

Daraus resultiert die leichte bis absolute Ungenauigkeit der Rechnungen und die außerkraftgesetzte GĂŒltigkeit gelĂ€ufiger mathematischer Rechenregeln.

Auslöschung

Unter Auslöschung (engl. cancellation) versteht man den Effekt, dass bei der Subtraktion fast gleich großer Zahlen das Ergebnis falsch wird.

Beispiel:

Subtrahiert man <math>\pi=3{,}141592653589793\ldots</math> und die exakte Zahl 3,141 in einer vierstelligen Gleitkommaarithmetik (<math>b = 10</math>, <math>p = 4</math>) so erwartet der unbefangene Laie als korrekt gerundetes Ergebnis <math>\pi - 3{,}141 = 0{,}000592653589793\ldots \approx 5{,}927...\cdot 10^{-4}</math>.

TatsĂ€chlich erhĂ€lt man als Ergebnis <math>1{,}0000 \cdot 10^{-3}</math>: Der vierstellige gerundete Wert von <math>\pi=3{,}141592653589793\ldots</math> ist <math>\pi=3{,}142\ </math>, damit wird das Ergebnis der Rechnung zu <math> 3{,}142 - 3{,}141 = 0{,}001 = 1{,}0000 \cdot 10^{-3}</math>. Zu diesem Ergebnis kommt es, da schon die AusgangsgrĂ¶ĂŸen, insbesondere <math>\pi</math> in der Gleitkommaarithmetik dargestellt sind und eben nicht exakt vorliegen.

Zahlen verschiedener GrĂ¶ĂŸenordnung (engl. absorption)

Die Addition bzw. Subtraktion einer betragsmĂ€ĂŸig viel kleineren Zahl Ă€ndert die grĂ¶ĂŸere Zahl nicht.

Im Beispiel der vierstelligen Dezimalarithmetik (<math>b = 10</math>, <math>p = 4</math>) Ă€ndert die Addition von 1e−3 zu 1e2 am grĂ¶ĂŸeren Operanden nichts. Dasselbe gilt fĂŒr die Subtraktion.

  • 1e2 + 1e−3 = 1e2

oder

  • <math>1{,}000\cdot 10^2 + 1{,}000\cdot 10^{-3} = 1{,}000\cdot 10^2 + 0{,}000|010\ldots \cdot 10^{2} = 1{,}000\cdot 10^2 + 0{,}000\cdot 10^{2} = 1{,}000\cdot 10^2</math>

Unterlauf

Da es in der Gleitkommadarstellung eine kleinste positive Zahl gibt, unterhalb derer kein Wert mehr dargestellt werden kann, wird ein Ergebnis in diesem Bereich meistens durch 0 reprĂ€sentiert. In diesem Fall spricht man von einem Unterlauf (engl. underflow). Ist das Ergebnis ein Zwischenergebnis, so wird dabei natĂŒrlich ein Wert, der verschieden von 0 ist, durch 0 ersetzt. Im Grunde ist dadurch jede Information ĂŒber das Ergebnis verloren gegangen. In manchen FĂ€llen wird die Genauigkeit des Endergebnisses davon nicht berĂŒhrt, aber in anderen FĂ€llen kann das resultierende Endergebnis auch komplett falsch sein.

UngĂŒltigkeit des Assoziativgesetzes

  • <math> (x + y) + z \neq x + (y + z)</math> z. B.: <math>(10^8-10^8)+5 \neq 10^8+(-10^8+5)</math>
  • <math> (x \cdot y) \cdot z \neq x \cdot (y \cdot z) </math>

UngĂŒltigkeit des Distributivgesetzes

  • <math> x \cdot (y + z) \neq (x \cdot y) + (x \cdot z) </math>

Lösbarkeit von Gleichungen

In einer Gleitkommaarithmetik haben manche normalerweise unlösbare Gleichungen eine Lösung. Dieser Effekt wird sogar ausgenutzt, um ein solches Gleitkommasystem zu beschreiben.

Beispiel:

Im Bereich der reellen Zahlen hat die Gleichung <math> (1 + x) = 1 </math> fĂŒr <math> x\ne0 </math> keine Lösung.

In einer Gleitkommaarithmetik hat diese Gleichung viele Lösungen, nÀmlich alle Zahlen, die zu klein sind, um bei der Summe noch einen Effekt zu ergeben. Wieder mit dem Beispiel vierstelliger Dezimalzahlen (<math>b = 10</math>, <math>p = 4</math>) gilt (Der Strich | markiert die bei der Addition entfallenden Stellen):

  • 1 + 1e−3 = 1,000 + 0,001|000000
 = 1,000 + 0,001 = 1,001 > 1
  • 1 + 1e−4 = 1,000 + 0,000|10000
 = 1,000 + 0,000 = 1,000 = 1
  • 1 + 2,3e−5 = 1,000 + 0,000|023000
 = 1,000 + 0,000 = 1,000 = 1

Die schon oben erwĂ€hnte kleinste Zahl <math>\epsilon</math>, die zu 1 addiert werden kann und ein von 1 verschiedenes Ergebnis liefert (<math>1 + \epsilon > 1</math>; <math>\epsilon</math> minimal!) nennt man Maschinengenauigkeit.

Konversionen

Wenn die Basis verschieden von 10 ist, mĂŒssen die Zahlen zwischen dem Gleitkommasystem der Anlage und dem Dezimalsystem konvertiert werden, um eine menschenlesbare Darstellung zu erhalten. Das wird meist schnell (und oft ungenau) programmiert. Eine schon alte und wichtige Forderung an diese Konversion ist ihre bitgenaue Umkehrbarkeit. Ein im Dezimalsystem dargestelltes Ergebnis soll wieder eingelesen werden können und bitgenau dieselbe Darstellung im Gleitkommasystem reproduzieren.

Diese Forderung wird hÀufig nicht beachtet. Eine Ausnahme ist hier Java, das den folgenden Satz beachtet:

Satz: Man kann zeigen, dass es nicht ausreicht, die aufgrund der Mantissengenauigkeit berechnete Anzahl der Dezimalstellen aufzurunden und diese Dezimalstellen gerundet zu produzieren. Eine einzige weitere Stelle reicht jedoch aus (Theorem 15 [5]). Das ist der Grund, warum in der Darstellung reeller Zahlen, die von Java-Programmen produziert werden, immer eine zusĂ€tzliche und scheinbar ĂŒberflĂŒssige Stelle erscheint.

Dezimalzahlen

Schon einfache Dezimalzahlen, z. B. 0,1, können nicht mehr exakt als binĂ€re Gleitkommazahlen dargestellt werden, da viele im Dezimalsystem abbrechende Kommazahlen im BinĂ€rsystem nicht abbrechende, periodische Zahlen sind; von diesen werden nur die ersten <math>p</math> Ziffern gespeichert, wodurch Ungenauigkeit entsteht. Dezimal 0,1 ist binĂ€r 0,0001100110011
 Man kann aber zeigen, dass sich in einem binĂ€ren Gleitkommasystem dennoch exakt 10 · 0,1 = 1 ergeben muss. Allgemein gilt bei richtiger Rundung (m / 10) · 10 = m (siehe Theorem 7 [5]). In Disziplinen wie der Finanzmathematik werden oft Ergebnisse verlangt, die mit einer Handrechnung exakt ĂŒbereinstimmen. Das geht nur mit einer dezimalen Gleitkommaarithmetik[6] oder (bei einigen Problemen) mit einer Festkommaarithmetik.

PrĂŒfung auf Gleichheit

Die im Abschnitt Dezimalzahlen genannte EinschrÀnkung, dass viele Dezimalzahlen in BinÀrsystemen in Computern nicht exakt dargestellt werden können, hat beim Programmieren Auswirkungen auf Vergleiche <math>x=y</math> zwischen Gleitkommazahlen. Ein Beispiel in C soll dies verdeutlichen:

<syntaxhighlight lang="c">

  1. include "stdio.h"

int main(){

if(.362*100. != 36.2)
 printf("verschieden\n");
if(.362*100./100. != .362)
 printf("auch verschieden\n");
return 0;

}</syntaxhighlight>

Obwohl die beiden Gleichungen <math>0{,}362\cdot 100 = 36{,}2</math> und <math>0{,}362\cdot 100/100 = 0{,}362</math> mathematisch korrekt sind, werden sie wegen der ungenauen Umrechnung ins Computer-BinÀrsystem falsch. Im Beispiel-Programm werden somit beide Ungleichungen als wahr angesehen.

Vergleiche mĂŒssen deshalb durch eine Abfrage ersetzt werden, ob die zu vergleichenden Werte im Rahmen einer erreichbaren Genauigkeit <math>\varepsilon</math> (meist Toleranz genannt) als gleich angesehen werden können.

Toleriert man beim Vergleich einen absoluten Fehler, lautet eine mögliche Formulierung <math>\vert x - y\vert \le \varepsilon</math>.

Toleriert man beim Vergleich einen relativen Fehler, lautet eine mögliche Formulierung <math>\vert 1 - \tfrac yx\vert \le \varepsilon</math>. Der zweite Fall muss meist noch mit der Sonderfallabfrage <math>x \ne 0</math> verbunden werden.

Sogar Zahlen mit exakt denselben Bitmustern und somit eigentlich exakt identischen Werten werden vom Rechner mit <math>x=y</math> manchmal nicht als gleich angesehen. Das hat als Ursache die manchmal nicht identischen Formate im Speicher (Bsp.: Intel 64 Bit) und wĂ€hrend einer Rechnung in der Gleitpunkteinheit (Bsp.: Intel 80 Bit). Wenn dieselben Bitmuster, die verglichen werden sollen, einmal aus dem Speicher und somit gerundet und einmal aus der FPU und somit mit der vollen Genauigkeit kommen, fĂŒhrt ein Vergleich zum falschen Ergebnis. Die Abhilfe ist dieselbe wie schon beschrieben.

Versteckte Verwendung anderer Darstellungen

Manche Rechenanlagen verwenden beim Rechnen mehrere verschiedene Formate. Bei Intel und verwandten Prozessoren wie AMD rechnet die FPU mit einem 80-Bit-Format. Gespeichert werden die Zahlen mit einem IEEE-754 kompatiblen 64-Bit- bzw. 32-Bit-Format. Bei Verwendung von mmx/sse-Extensions werden wieder andere Rechenformate verwendet. Das fĂŒhrt zu weiteren fĂŒr Laien zunĂ€chst sehr undurchsichtigen Eigenschaften. Ein simpler Vergleich exakt identischer Bitmuster auf Gleichheit kann zum Ergebnis fĂŒhren, dass die scheinbar identischen Bitmuster doch verschieden sind. Das folgende Programm hat manchmal das paradoxe Ergebnis mit dem Aufruf x = 1; vergleiche (x, x):

<syntaxhighlight lang="c"> void vergleiche (double x, double y){

if(cos (x) != cos (y))
 printf("paradox\n");
else
 printf("wuerde jeder so erwarten\n");

}</syntaxhighlight>

Die ErklĂ€rung ist in solchen FĂ€llen, dass der Compiler in zwei Schritten die beiden cos-Werte berechnen muss, von denen er an dieser Stelle des Programms natĂŒrlich nicht weiß, dass sie wegen des Aufrufs identisch sind. Wenn die internen Register nicht ausreichen, muss einer der cos-Werte zwischengespeichert werden. Wenn das Zwischenspeichern wie bei Intel mit 64 Bit und damit einer weiteren Rundung erfolgt, die zweite cos-Berechnung wie die erste aber mit 80 Bit durchgefĂŒhrt wird, wenn dann die beiden Ergebnisse verglichen werden, dann stimmen der gerundete 64-Bit-Wert und der anders gerundete 80-Bit-Wert nicht mehr ĂŒberein.

BinÀrgleitkommazahlen in der Digitaltechnik

Oben erwĂ€hnte Beispiele sind durchwegs im Dezimalsystem angegeben, das heißt mit einer Basis b = 10. Computer verwenden stattdessen das BinĂ€rsystem mit einer Basis b = 2.

Einfache und doppelte Genauigkeit

Gleitkommazahlen werden in Computern normalerweise als Folgen von 32 Bit (einfache Genauigkeit, englisch single precision) oder 64 Bit (doppelte Genauigkeit, double precision) dargestellt.

Manche Prozessoren erlauben auch lĂ€ngere Gleitkommazahlen, so kennen die von der Intel-x86-Serie abgeleiteten Prozessoren (u. a. Intel Pentium und AMD Athlon) eine Gleitkommazahldarstellung mit 80 Bit fĂŒr Zwischenergebnisse. Manche Systeme erlauben auch Gleitkommazahlen mit 128 Bit (Vierfache Genauigkeit). Einige Ă€ltere Systeme verwendeten auch noch andere LĂ€ngen wie zum Beispiel 40 Bit.

Daneben gibt es auch Minifloats genannte Systeme mit sehr wenigen Bits (etwa 8 oder 16), die in speicherarmen Systemen (Controllern) oder limitierten Datenströmen eingesetzt werden (zum Beispiel Grafikkarten).

IEEE 754 und andere Normen

Das heute hĂ€ufigste und bekannteste Gleitkommasystem wurde 1985 von IEEE konzipiert, in der IEEE 754 niedergelegt, und ist in den meisten Computern als Hardware- oder Softwarearithmetik vorhanden. IEEE 854 ist eine Norm fĂŒr Gleitkomma-Dezimalzahlen. Beide Normen werden in der Revision IEEE 754r zusammengefĂŒhrt und erweitert.

Die IEEE hat die Darstellung von Gleitkommazahlen in ihrem Standard IEEE 754 seit 1985 reglementiert; beinahe alle modernen Prozessoren folgen diesem Standard. Gegenbeispiele, die die Spezifikationen der Norm IEEE 754 nicht erfĂŒllen, sind einige IBM-Großrechnersysteme (Hexfloat-Format), die VAX-Architektur und einige Supercomputer wie die von Cray. Die Sprache Java lehnt sich eng an IEEE 754 an, erfĂŒllt die Norm aber nicht komplett.

Die Definition des Hexfloat-Formates von IBM findet sich im Buch „Principles of Operation“ der z-Architektur.[7]

Der Power6 von IBM ist einer der ersten Prozessoren, welche dezimale Gleitkommaarithmetik hardwaremĂ€ĂŸig implementiert haben; die Basis ist also 10. Im Folgenden wird aber nur die Basis 2 behandelt.

Strenggenommen sind nur die normalisierten Zahlen aus IEEE 754 Gleitkommazahlen. Die denormalisierten Zahlen sind eigentlich Festkommazahlen; diese SonderfĂ€lle wurden fĂŒr spezielle numerische Zwecke geschaffen.

Interne Darstellung

Die tatsĂ€chliche Darstellung im Computer besteht also aus einem Vorzeichen-Bit, einigen Mantissen-Bits und einigen Exponenten-Bits. Wobei die Mantisse meistens normiert ist und Zahlen im Intervall [1; 2[ darstellt. (Da in diesem Intervall das erste Bit mit der Wertigkeit Eins stets gesetzt ist, wird es meistens implizit angenommen und nicht gespeichert, siehe Hidden Bit). Der Exponent wird meistens im Biased-Format, oder auch im Zweierkomplement dargestellt. Des Weiteren werden zur Darstellung besonderer Werte (Null, Unendlich, Keine Zahl) meistens einige Exponentenwerte, zum Beispiel der grĂ¶ĂŸtmögliche und der kleinstmögliche Exponent, reserviert.

Eine Zahl f wird demzufolge als f = s · m · 2e dargestellt, wobei s 1 oder −1 ist.

IEEE 754 S/390
Mantisse (in Bit) Exponent (in Bit) Mantisse (in Bit) Exponent (in Bit)
Single 23 8 24 7
Double 52 11 56 7
Extended nicht exakt definiert 112 7

EinschrÀnkungen und deren mathematische Grundlagen

Durch die unterschiedliche binĂ€re Darstellung der Zahlen kann es in beiden Systemen zu Artefakten kommen. Das heißt: (rationale) Zahlen, die im Dezimalsystem „rund“ erscheinen, zum Beispiel <math>\textstyle \frac{249}{20} = 12{,}45</math>, können im BinĂ€rsystem nicht exakt dargestellt werden (der Wert ist <math>1100{,}01\overline{1100}_2</math>). Statt dessen wird ihre BinĂ€rdarstellung im Rahmen der jeweiligen Rechengenauigkeit gerundet, so dass man bei der RĂŒckumwandlung ins Dezimalsystem z. B. den Wert 12,44999999900468785 erhĂ€lt. Dieses kann in nachfolgenden Berechnungen zu unvorhergesehenen Ab- oder Aufrundungsfehlern fĂŒhren.

Die oben erwĂ€hnten Artefakte sind im BinĂ€rsystem unvermeidlich, da viele Zahlen, die im Dezimalsystem exakt dargestellt werden können, im BinĂ€rsystem periodische Zahlen mit unendlich vielen Nachkommastellen sind. Sie könnten nur durch die Verwendung von Codierungen mit der Basis 10 (oder anderer Basen der Form <math>10 \cdot n</math> mit beliebigem <math>n \in \mathbb N</math>) vermieden werden, siehe auch BCD-Code. BinĂ€re Gleitkommazahlen werden jedoch nach wie vor aus verschiedenen GrĂŒnden eingesetzt.

Es gibt allerdings fĂŒr jede Basis d unendlich viele rationale Zahlen, die zu anderen Basen eine endliche Darstellung (0-Periode) haben und zur Basis d eine unendliche Darstellung (d. h. eine echte Periode). Das Dezimalsystem ist hier nur dadurch ausgezeichnet, dass Menschen daran gewöhnt sind, und daher fĂŒr Eingabe- und Ausgabeformat der Rechnungen oft das Dezimalsystem bevorzugt wird.

In der Mathematik ist ein Gleitkommazahlensystem ein Tupel <math>\left(d, [e_{\rm min}, e_{\rm max}], l \right)</math>, wobei <math>d</math> die Basis, <math>\left[ e_{\rm min}, e_{\rm max} \right]</math> den Bereich des Exponenten und <math>l</math> die LĂ€nge der Mantisse darstellt.

Damit ist eine reelle Zahl x ≠ 0 darstellbar durch ein a und ein e, so dass: <math>a = \sum_{i=1}^l a_i \cdot d^{-i}</math> und <math>x = a d^e</math> mit <math>e\in \left[e_{\rm min}, e_{\rm max} \right]</math>.

Hiermit ist eine mathematische Betrachtung des Rundungsfehlers möglich. Die obige Darstellung realisiert eine Projektion

<math>fl\colon\mathbb{R}\to \{x \in \mathbb{R}\mid\exists a, e\colon x = a d^e\}</math>

und damit ist der Rundungsfehler definiert als

<math>\frac{|x - fl(x)|}{|x|} \le \varepsilon := \frac{1}{2} d^{1-l}.</math>

Bei double-Werten entspricht <math>\varepsilon</math> gerade <math>2^{-53}</math> (ungefÀhr <math>1{,}1 \cdot 10^{-16}</math>).

Beispiel: Berechnung Gleitkommazahl

18,410 soll in eine Gleitkommazahl umgewandelt werden, dabei nutzen wir den Single IEEE-Standard (IEEE 754, binary32)

1. Berechnung des Exzesses

(Der Exzess oder auch Bias ist eine zum Zahlenstandard gehörende Konstante. HierfĂŒr zĂ€hlen die Bits, die in der Zahlendarstellung fĂŒr den Exponenten reserviert sind, bei der Norm IEEE 754 also 8 Stellen.)

Exzess = 2(n-1)-1 (n Bits des Exponenten in der Zahlendarstellung)
   = 2(8-1)-1
   = (27)-1
   = 128-1
   = 127

2. Umwandlung der Dezimalzahl in eine duale Festkommazahl ohne Vorzeichen

Gleitkommazahl = 18,4
Vorkommaanteil = 18
 18 / 2 = 9 Rest 0 (Least-Significant Bit)
 9 / 2 = 4 Rest 1
 4 / 2 = 2 Rest 0
 2 / 2 = 1 Rest 0
 1 / 2 = 0 Rest 1 (Most-Significant-Bit)
    = 10010
Nachkommaanteil = 0.4
0,4 * 2 = 0,8 → 0 (Most-Significant-Bit)
0,8 * 2 = 1,6 → 1
0,6 * 2 = 1,2 → 1
0,2 * 2 = 0,4 → 0
0,4 * 2 = 0,8 → 0
0,8 * 2 = 1,6 → 1 (Least-Significant-Bit)
    ‱
    ‱
    ‱
    = 0,0110011001100110011...
18,4 = 10010,011001100110011...

3. Normieren

10010,01100110011... * 2^0 = 1,001001100110011... * 2^4

4. Berechnung des dualen Exponenten

da 2^4 → Exponent=4
Exponent+Exzess
    4+127 = 131
131/2 = 65 Rest 1 (Least-Significant-Bit)
 65/2 = 32 Rest 1
 32/2 = 16 Rest 0
 16/2 = 8 Rest 0
 8/2 = 4 Rest 0
 4/2 = 2 Rest 0
 2/2 = 1 Rest 0
 1/2 = 0 Rest 1 (Most-Significant-Bit)
   = 10000011

5. Vorzeichen-Bit bestimmen

Das Vorzeichen errechnet sich aus der Formel (-1)^s:
positiv → 0
negativ → 1
   = 0

6. Die Gleitkommazahl bilden

1 Bit Vorzeichen + 8 Bit Exponent + 23 Bit Mantisse
0 10000011 00100110011001100110011 → die Vorkomma-Eins wird als Hidden Bit weggelassen, da 
                   dort immer eine 1 steht braucht man diese nicht speichern

Berechnung einer IEEE single precision Gleitkommazahl (32-Bit-Gleitkommazahl)

Hier werden die genauen Rechenschritte vorgestellt, um eine Dezimalzahl in eine binĂ€re Gleitkommazahl vom Typ Single nach IEEE 754 umzuwandeln. Dazu mĂŒssen nacheinander die drei Werte (Vorzeichen <math>v</math> (1 bit), Mantisse <math>m</math> und Exponent <math>e</math>) berechnet werden, aus denen sich die Zahl <math>x</math> zusammensetzt:

<math> x = (-1)^v \cdot m \cdot 2^e </math>

Vorzeichen

Je nachdem, ob die Zahl positiv oder negativ ist, ist <math>v</math> 0 oder 1: <math>(-1)^0 = 1</math> oder <math>(-1)^1 = -1</math>

Alle weiteren Berechnungen erfolgen mit dem Betrag der Zahl.

Exponent

Als nĂ€chstes wird der Exponent gespeichert. Beim IEEE single-Datentyp sind dafĂŒr 8 Bit vorgesehen. Der Exponent muss so gewĂ€hlt werden, dass die Mantisse einen Wert zwischen 1 und 2 erhĂ€lt:

<math>e = \left \lfloor \log_2(|x|) \right \rfloor</math>

Wenn hierbei ein Wert fĂŒr den Exponenten heraus kommt, der kleiner −126 oder grĂ¶ĂŸer 127 ist, kann die Zahl mit diesem Datentyp nicht gespeichert werden. Statt dessen wird die Zahl als 0 (Null) oder als „unendlich“ abgespeichert.

Der Wert fĂŒr den Exponenten wird jedoch nicht direkt gespeichert, sondern um einen Bias-Wert erhöht, um negative Werte zu vermeiden. Bei IEEE single ist der Bias-Wert 127. Somit werden die Exponentenwerte −126
+127 als so genannte „Charakteristik“ zwischen 1
254 gespeichert. Die Werte 0 und 255 als Charakteristik sind reserviert fĂŒr die speziellen Zahlenwerte „Null“, „Unendlich“ und „NaN“.

Mantisse

Die Mantisse wird nun in den verbleibenden 23 Bit abgespeichert:

<math>m = \left( \frac{|x|}{2^e} - 1 \right) \cdot 2^{23}</math>

Zahlenbeispiel mit der Zahl 11,25

Zahl = +11,25

Vorzeichen = + → 0binĂ€r

<math>\mathrm{Exponent} = \left \lfloor \log_2(11{,}25) \right \rfloor = \left \lfloor 3{,}49 \right \rfloor = 3</math> → 3 + 127 = 130 → 10000010binĂ€r

<math>\mathrm{Mantisse} = \left( \frac{11{,}25}{2^3} - 1 \right) \cdot 2^{23} = (1{,}40625 - 1) \cdot 2^{23} = 3407872</math> → 01101000000000000000000binĂ€r

Damit ergibt sich folgende Gleitkommazahl einfacher Genauigkeit:

0 10000010 01101000000000000000000

Umkehrung

Will man aus einer Gleitkommazahl im Maschinenwort (32 Bit) eine Dezimalzahl errechnen, so kann man dies mit folgender Formel recht schnell erledigen:

<math>Z=(-1)^{VZ}\cdot(1{,}0+M/2^{23})\cdot 2^{E - 127}</math>

Berechnung einer IEEE double precision Gleitkommazahl (64-Bit-Gleitkommazahl)

Umkehrung

Will man aus einer Gleitkommazahl im Maschinenwort (64 Bit) eine Dezimalzahl errechnen, so kann man dies mit folgender Formel recht schnell erledigen:

<math>Z=(-1)^{VZ}\cdot(1{,}0+M/2^{52})\cdot 2^{E - 1023}</math>

Beispiel:

Folgende BinÀrzahl mit 64-Bit soll als Gleitkommazahl interpretiert werden:

0 10001110100 0000101001000111101011101111111011000101001101001001

(das Bit ganz links ist Bit 63 und das Bit ganz rechts ist Bit 0)

Bit 63 reprÀsentiert das Vorzeichen (1 Bit), also

  VZ = 0binÀr = 0

Bit 62 bis 52 reprÀsentieren den Exponenten (11 Bit), also:

 E = 10001110100binÀr = 1140

Bit 51 bis 0 reprÀsentieren die Mantisse (52 Bit), also:

  M = 0000101001000111101011101111111011000101001101001001binÀr = <math>1{,}80848 \cdot 10^{14}</math>

Eingesetzt in die Formel ergibt sich als Ergebnis (Rundungswerte):

 <math>Z=(-1)^{0}\cdot(1{,}0+1{,}80848 \cdot 10^{14}/2^{52})\cdot 2^{1140 - 1023}=1\cdot(1{,}040156305)\cdot 2^{117}=1{,}72826 \cdot 10^{35}</math>

Siehe auch

Weblinks

Wiktionary Wiktionary: Gleitkommazahl â€“ BedeutungserklĂ€rungen, Wortherkunft, Synonyme, Übersetzungen

Einzelnachweise

  1. ↑ Otto Neugebauer: The exact sciences in antiquity. Princeton University Press, 1952
  2. ↑ Bartel Leendert van der Waerden: Science awakening. P. Noordhoff, Groningen, 1954
  3. ↑ Donald E. Knuth: Ancient Babylonian algorithms. Commun. ACM 15 (1972), S. 671–677, Korr. in Commun. ACM 19 (1976), S. 108
  4. ↑ Donald E. Knuth: The Art of Computer Programming – Vol. 2., Seminumerical Algorithms. 3. Auflage, Addison-Wesley 1997, S. 196
  5. ↑ a b David Goldberg: What Every Computer Scientist Should Know About Floating-Point Arithmetic. In: ACM Computing Surveys. 23, 1991, S. 5–48. doi:10.1145/103162.103163. Abgerufen am 2. September 2010.
  6. ↑ IBM Corporation: General Decimal Arithmetic
  7. ↑ IBM Corporation: Principles of Operation, 2. Auflage, 2001, Kapitel 19-4 (pdf-Datei)
Impressum AGB Datenschutz KundenserviceMediadatenfreenet AGJobsSitemap
gekennzeichnet mit
JUSPROG e.V. - Jugendschutz
freenet ist Mitglied im JUSPROG e.V.