Gleitkommazahl
Gleitkommazahl (englisch floating-point number) bezeichnet eine Zahldarstellung, die sich gleichermaßen für sehr große wie für sehr kleine Zahlen eignet. Sie besteht aus zwei Teilen, einem Exponent (Hochzahl), der die Größenordnung angibt, gleichbedeutend mit der Position des Kommas, sowie einer Mantisse, die den Wert genauer spezifiziert. Das unterscheidet sie von Festkommazahlen, zu denen auch die Ganzzahlen gehören, die aus nur einer Ziffernfolge mit einer festgelegten Position des Kommas bestehen.
Üblicherweise werden Gleitkommazahlen im für Menschen gewohnten Zehnersystem verwendet, sowie im Zweiersystem auf Computern, beispielsweise
- für die praktischere Schreibweise sehr großer und sehr kleiner Zahlen in wissenschaftlicher Notation, Gleitkomma- bzw. Exponentialschreibweise, sowie
- für die Repräsentation von Zahlen in wissenschaftlichen Taschenrechnern und in Computern.
Beide Verwendungen sind miteinander verwandt, weisen aber signifikante Unterschiede auf. Während erstere eine alternative Schreibweise für Zahlen ist (wie auch die Darstellung in anderen Basen) und keinen Einfluss auf die Zahl selbst hat, stellt zweiteres ein Speicherformat für rationale Zahlen in der Datenverarbeitung dar und ermöglicht Zahlenformate mit großem Wertebereich und gleichmäßiger relativer Genauigkeit über den Wertebereich.
Gleitkommazahlen bestehen aus einer festen Anzahl von Ziffern, die gemäß dem Stellenwertsystem den Wert der Zahl angeben, sowie der Angabe, um wie viele Stellen das Komma nach links oder rechts verschoben werden muss, um die Zahl in der Dezimalschreibweise zu erhalten. So beschreibt zum Beispiel die Angabe „12345 und das Komma 2 Stellen nach links“ die Zahl 123,45. Diese Zahlendarstellung deckt durch das bewegliche Komma einen großen Zahlenraum ab und bietet durch die feste Anzahl von ausgeschriebenen Ziffern eine gute Genauigkeit.
Ob eine gegebene rationale Zahl eine Gleitkommazahl ist, hängt nicht von der Zahl selbst ab, sondern von dem gewählten Darstellungsformat. Die Computer der 1930er bis 1960er Jahre nutzten eine Vielzahl unterschiedlicher Darstellungsformate. Der 1985 erschienene Standard IEEE 754 etablierte zwei Darstellungsformate, die sich seitdem durchgesetzt haben.
Geschichtliche Entwicklung
[Bearbeiten | Quelltext bearbeiten]Die erste dokumentierte Verwendung der Gleitkommaschreibweise fand im Jahr 1750 v. Chr. statt: Im Zweistromland (Mesopotamien) wurden wissenschaftliche Rechnungen mit der Basis durchgeführt und der Exponent (eine meistens kleine ganze Zahl) im Kopf mitgeführt.[1][2][3][4] Dasselbe Vorgehen war bei Berechnungen mit einem Rechenschieber üblich.
Im Jahr 1913 schrieb der spanische Ingenieur Leonardo Torres Quevedo seine Essays on Automatics und führte darin erstmals die Idee der Gleitkomma-Arithmetik in Computer ein.[5]
Erstmalig in Computern verwendet wurde eine Gleitkommadarstellung 1937 von Konrad Zuse in seinen Computern Z1 und Z3.[6]
Das heute häufigste und bekannteste Gleitkommasystem wurde 1985 in der Norm IEEE 754 definiert und ist in den meisten CPUs in Hardware implementiert. IEEE 854 ist eine Norm für Gleitkomma-Dezimalzahlen, also Basis 10 statt Basis 2. Beide Normen wurden in der überarbeiteten Fassung IEEE 754-2008 zusammengeführt und erweitert.
Schreibweisen
[Bearbeiten | Quelltext bearbeiten]Festkommaschreibweise
[Bearbeiten | Quelltext bearbeiten]Das Rechenwerk von mechanischen und elektronischen Rechenmaschinen arbeitet mit Zahlen fester Länge. Beispiele dafür sind mechanische Registrierkassen, bei denen im Anzeigebereich eine feste Anzahl von Ziffern verbaut ist. Registrierkassen werden eingesetzt, um Geldbeträge zu addieren. In den meisten Währungen werden Geldbeträge mit zwei Nachkommastellen angegeben, und die Beträge haben insbesondere im Einzelhandel eine praktische Obergrenze, daher reicht für diesen Anwendungsfall ein Zahlenraum aus, der 3 oder 4 Stellen vor dem Komma und 2 Nachkommastellen hat. Bei allen Zahlen, die die Registrierkasse anzeigen kann, hat das Komma dieselbe Position, daher heißt die Menge der so darstellbaren Zahlen Festkommazahlen, im Beispiel der abgebildeten Registrierkasse „Festkommazahlen im Dezimalsystem ohne Vorzeichen mit 3 Stellen vor und 2 Stellen nach dem Komma“.
Mit dieser Schreibweise kann Exaktheit beabsichtigt und erreicht werden, und die Genauigkeit ist eine absolute.
Exponentialschreibweise
[Bearbeiten | Quelltext bearbeiten]Im naturwissenschaftlichen Bereich ist der Zahlenraum deutlich größer, bei Längenangaben reicht er vom Atomradius von Wasserstoff (etwa 0,000 000 000 032 Meter bzw. 32 Pikometer) bis zum Lichtjahr (etwa 9 460 000 000 000 000 Meter bzw. 9,46 Billionen Kilometer) und darüber hinaus. Bei so großen oder kleinen Zahlen ist die Schreibweise durch die vielen Nullen unübersichtlich, daher hat sich dort eine andere Schreibweise etabliert, bei der die Zahl in ihre signifikanten Ziffern und eine Kommaverschiebung zerlegt wird. In dieser Schreibweise sind die Zahlen 32 · 10−12 und 9,46 · 1015 deutlich kürzer und dadurch einfacher zu erkennen. Die hinter der Basis 10 hochgestellte −12 bzw. 15 in dieser Exponentialschreibweise gibt an, um wie viele Stellen das Komma nach links bzw. nach rechts verschoben werden muss. Das Komma hat keine feste Position, sondern die Position ist beweglich, daher der Begriff Gleitkommazahl.
Mit dieser Schreibweise ist absolute Exaktheit normalerweise nicht beabsichtigt, und die relative Genauigkeit hängt eng mit der Anzahl der vorgesehenen signifikanten Stellen zusammen.
Schreibweisen für Gleitkommazahlen
[Bearbeiten | Quelltext bearbeiten]- Wissenschaftliche Notation mit konsequenter Normalisierung auf
- Beispiel: 10000 = 1e4
- Technische Notation mit Normalisierung auf , 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 = 10e3 m = 10 km
- Signifikanz: 10.00e3 m = 10.000 ± 5 m (4 signifikante Stellen bezüglich Messung in Kilometern mit Rundung), aber 0.01e6 m = 10.000 ± 5000 m (2 signifikante Stellen bezüglich 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
In Programmiersprachen wird für die Notation von Gleitkommazahlen im Quelltext und für ihre Ein- und Ausgabe eine kompakte Variante der Exponentialschreibweise verwendet, z. B. 2.99792458e8
(= 2,997.924.58 · 108). Das e
steht für „mal 10 hoch“. In der Sprache Algol 60 war dafür ein eigenes Zeichen ⏨
(Basiszehn) vorgesehen, das zwar auf manchen Ein- und Ausgabegeräten damaliger Rechner vorhanden war, aber erst 2002, also nach der Verwendungszeit von Algol 60, als Unicode-Zeichen U+23E8 in einen genormten Zeichencode aufgenommen wurde.
Wertemengen
[Bearbeiten | Quelltext bearbeiten]Es gibt zahlreiche unterschiedliche Darstellungsformate für Gleitkommazahlen. Jedes Darstellungsformat definiert, welche Zahlen sich darin darstellen lassen und welche nicht. Die Unterschiede liegen in der Genauigkeit der Zahlen, dem Umfang des Zahlenraums, dem Speicherbedarf für eine einzelne Zahl und besonderen Darstellungsformen für betragsmäßig kleine Zahlen, unendlich und (aus praktischen Gründen) Elemente, die keine Zahlen sind, zum Beispiel, um fehlerhafte Rechenergebnisse zu markieren.
Ein Darstellungsformat für Gleitkommazahlen definiert anhand mehrerer Parameter, welche Zahlen in dem Format darstellbar sind:
- Die Basis des Stellenwertsystems legt fest, wie viele unterschiedliche Ziffern verwendet werden, um die Zahlen zu schreiben.
- Die Basis 10 mit den Ziffern 0 bis 9 sorgt für menschenfreundliche Darstellungen, zum Beispiel auf wissenschaftlichen Taschenrechnern.
- Die Basis 2 mit den Ziffern 0 und 1 ist für elektronische Schaltungen, insbesondere Computer, ideal.
- Alle weiteren Basen sind exotisch.
- Die Anzahl der signifikanten Ziffern legt fest, mit welcher Genauigkeit die darstellbaren Zahlen angegeben werden können. Die Ziffern selbst heißen Mantisse.
- Taschenrechner zeigen üblicherweise 8 bis 10 Dezimalstellen an (rechnen aber intern häufig mit mehr Stellen).
- Die seit 1985 üblichen Darstellungsformate für Computer haben eine Genauigkeit von 24 bzw. 53 Binärstellen, das sind umgerechnet etwa 7 bzw. 15 Dezimalstellen.
- Die feste Position des Kommas in der Mantisse.
- Das Komma steht üblicherweise zwischen der ersten und der zweiten Stelle, die Mantisse hat also die Form .
- Der minimale Exponent legt fest, um wie viele Stellen das Komma maximal nach links verschoben werden kann.
- Der maximale Exponent legt fest, um wie viele Stellen das Komma maximal nach rechts verschoben werden kann.
Der Wert einer Zahl ergibt sich nach der Formel:
- .
Hierbei ist:
- das Vorzeichen der Zahl (entweder oder ),
- die Mantisse der Zahl,
- die Basis des Darstellungsformats und
- der Exponent der Zahl.
Die obigen Parameter lassen noch Zahlen zu, die mehrere gleichwertige Darstellungen haben. Um das zu umgehen, wird die Mantisse normalisiert, so dass die Ziffer vor dem Komma keine 0 ist. Durch diese Einschränkung gibt es zu jeder darstellbaren Zahl nur noch eine mögliche Schreibweise. Eine Nebenwirkung dieser Einschränkung ist jedoch, dass die Zahl 0 nicht mehr darstellbar ist, da ihre Darstellung ausschließlich aus Nullen besteht. Daher muss eine weitere Regel eingeführt werden, um die Zahl 0 darzustellen. Eine Möglichkeit ist, auf die Normalisierung zu verzichten, wenn der Exponent der Zahl gleich dem des Darstellungsformats ist. Dadurch bleibt die Eindeutigkeit bestehen, so dass es zu jeder darstellbaren Zahl genau eine mögliche Schreibweise gibt.
Beispiel
[Bearbeiten | Quelltext bearbeiten]Ein häufiges Darstellungsformat für die Anzeige von Zahlen auf wissenschaftlichen Taschenrechnern ist:
- Basis 10, mit den Ziffern 0 bis 9
- 10 Stellen Genauigkeit für die Mantisse
- normalisierte Mantisse mit 1 Stelle vor dem Komma
- Exponenten von bis
Die Zahl mit der Darstellung hat damit den Wert oder als ganze Zahl geschrieben .
Die betragsmäßig kleinste darstellbare Zahl in diesem Darstellungsformat ist , also 0, die größte darstellbare Zahl ist , das ist eine 100-stellige Zahl.
Speicherformate
[Bearbeiten | Quelltext bearbeiten]Bei der Verarbeitung in Computern werden Gleitkommazahlen in einem Speicherbereich fester Größe abgelegt. Die Größe wird oft mit dem Begriff Genauigkeit klassifiziert, es gibt dabei
Die dabei verwendeten Speicherformate unterscheiden sich von der abstrakt-mathematischen Darstellung der Gleitkommazahl, zum Beispiel werden redundante Informationen weggelassen. Ein konkretes Speicherformat ist eine Abwägung: Einerseits sollen die Zahlen möglichst exakt gespeichert werden und dabei einen großen Zahlenraum abdecken, andererseits soll der Speicherbedarf möglichst gering sein.
Der minimale Speicherbedarf ergibt sich aus den Parametern des Darstellungsformats. Um eine Gleitkommazahl aus dem Darstellungsformat mit der Basis , der Genauigkeit von Binärstellen und einem Exponenten im Bereich von bis zu speichern, benötigt man:
- für das Vorzeichen 1 Bit, da es 2 mögliche Werte hat,
- für die Mantisse Bit, da jede Stelle der Mantisse wegen der Basis 2 genau 1 Bit Speicherplatz benötigt
- für den Exponenten so viele Bits, dass jede ganze Zahl von bis gespeichert werden kann, also .
Bei Gleitkommazahlen mit der Basis 2 ist es möglich, beim Speichern 1 Bit einzusparen. Dazu wird festgelegt, dass die Zahlen stets in ihrer normalisierten Form gespeichert werden. Das bedeutet im allgemeinen Fall, dass die erste Ziffer der Mantisse nicht 0 sein kann, denn sonst wäre die Zahl nicht normalisiert. Da es im Binärsystem nur die Ziffern 0 und 1 gibt, muss die erste Ziffer also 1 sein. Diese Ziffer ist also bereits bekannt und muss daher nicht für jede Zahl abgespeichert werden. Dadurch ergibt sich eine Ersparnis von 1 Bit, so dass für die Mantisse nur Bit benötigt werden. Wird diese Möglichkeit genutzt, wird von einem hidden bit (engl. wörtlich verstecktes Bit) gesprochen.
Das Speicherformat definiert nicht nur, wie viele Bits zum Speichern einer Gleitkommazahl nötig sind, sondern auch, welche Teile der Zahl in welchem Bit gespeichert werden. Zusätzlich zu den Zahlen mit normalisierter Mantisse kann das Speicherformat auch definieren, wie unnormalisierte Zahlen gespeichert werden und ob es weitere Sonderfälle wie unendlich und NaN (engl. not a number) für ungültige Rechenergebnisse gibt.
Jahr | Speicherformat | Bits für | Anmerkungen | ||
---|---|---|---|---|---|
Mantisse | Exponent | gesamt | |||
2008 | IEEE 754 binary16 | 10 | 5 | 16 | Die Mantisse ist normalisiert, siehe Minifloat. |
1937 | Zuse Z1 (1937) | 16 | 7 | 24 | Die Mantisse ist normalisiert, Rechnen mit 0 ist nicht möglich.[6] |
1985 | IEEE 754 binary32 | 23 | 8 | 32 | Die Mantisse ist normalisiert. |
1990 | IBM S/390 single | 24 | 7 | 32 | |
1954 | IBM 704 binär | 27 | 8 | 36 | Die Mantisse ist nicht normalisiert. |
1954 | IBM 704 dezimal | ? | ? | 36 | Basis 10 statt 2 (weitere Details stehen nicht im Handbuch) |
1966 | DEC PDP-10 | 27 | 8 | 36 | |
1956 | Telefunken TR 4 | 38 | 8 | 47+3 | Basis b = 16 |
1969 | Telefunken TR 440 | ||||
1956 | PERM | 40 | 9 | 50+1 | Es gibt drei verschiedene Gleitkomma-Arithmetiken. |
1964 | CDC 6600 | 47 | 12 | 60 | |
1985 | IEEE 754 binary64 | 52 | 11 | 64 | Die Mantisse ist normalisiert. |
1990 | IBM S/390 double | 56 | 7 | 64 | |
1980 | Intel 8087 Temporary Real |
64 | 15 | 80 | Die Mantisse ist nicht normalisiert. Internes temporäres Datenformat, erweiterter Bereich und Präzision tragen dazu bei, für alle externen Formate stets stabile, erwartete Ergebnisse zu liefern.[7] |
2008 | IEEE 754 binary128 | 112 | 15 | 128 | Die Mantisse ist normalisiert. |
Die Gesamtanzahl der pro Gleitkommazahl zu speichernden Bits ergibt sich in der Regel aus einem Vorzeichenbit sowie den Mantissenbits und Exponentenbits.
Eine Angabe der Gestalt für die Gesamtlänge bedeutet, dass die Zahl im Speicher in Einheiten von Bit gespeichert wird, von denen aber nur Bit für den Zahlenwert relevant sind und weitere für andere Zwecke genutzt werden können. Darüber hinaus können weitere Bits zu Hardware-Prüfzwecken mitgespeichert werden, diese stehen aber dem Programmierer beziehungsweise der Anwendung nicht für den zu speichernden Zahlenwert an sich zur Verfügung.
Rechenbeispiel für benötigten Speicherplatz
[Bearbeiten | Quelltext bearbeiten]Im Format IEEE 754 binary32 ist , , und , der benötigte Speicherplatz ist daher:
- für das Vorzeichen Bit
- für die normalisierte Mantisse Bit
- für den Exponenten Bit
Für jede Gleitkommazahl werden bei diesem Speicherformat somit 32 Bit beziehungsweise 4 Byte benötigt.
Gleitkommaarithmetik
[Bearbeiten | Quelltext bearbeiten]Beim Rechnen mit allgemeinen rationalen Zahlen (Bruchrechnung) ist das Ergebnis einer Addition, Subtraktion, Multiplikation und Division stets wieder eine rationale Zahl, mit einer einzigen Ausnahme, der Division durch 0. Diese Eigenschaft der Abgeschlossenheit fällt beim Rechnen mit Gleitkommazahlen weg, da die Menge der darstellbaren Zahlen begrenzt ist. Die Zwischenergebnisse müssen daher nach jedem Schritt gerundet werden, damit sie in das Darstellungsformat passen.
Durch dieses Runden entstehen beim Rechnen mit Gleitkommazahlen überraschende Ergebnisse. Insbesondere gelten die aus der Bruchrechnung bekannten Rechenregeln nicht mehr. In Berechnungen, bei denen keine Rundung nötig ist, garantiert IEEE 754 ein exaktes Ergebnis. In vielen anderen Fällen beziehen sich die Rundungsfehler nur auf die letzten Stellen der Mantisse und fallen daher nicht auf, insbesondere wenn das Endergebnis erneut gerundet wird, um besser lesbar zu sein. Es gibt aber auch Fälle, in denen Rundungsfehler zu komplett anderen Ergebnissen führen.
Für Computer ist das Rechnen mit Gleitkommazahlen aufwändiger als mit Ganzzahlen, da die Zahlen vor jedem Rechenschritt aneinander angeglichen werden müssen und die Zwischenergebnisse vor dem Runden viele Ziffern enthalten können. Die PCs in den 1980er Jahren hatten standardmäßig keinen Gleitkommaprozessor. Für wissenschaftliche Berechnungen gab es stattdessen Höchstleistungsrechner (number cruncher) mit speziellen Prozessoren für Gleitkommaberechnungen.
Auslöschung
[Bearbeiten | Quelltext bearbeiten]Unter Auslöschung versteht man den Effekt, dass bei der Subtraktion fast gleich großer Zahlen das Ergebnis falsch wird.
Zahlen verschiedener Größenordnung (Absorption)
[Bearbeiten | Quelltext bearbeiten]Die Addition bzw. Subtraktion einer betragsmäßig viel kleineren Zahl ändert die größere Zahl nicht.
Im Beispiel der vierstelligen Dezimalarithmetik (, ) ändert die Addition von 0,001 zu 100 am größeren Operanden nichts. Dasselbe gilt für die Subtraktion:
Term | Anmerkungen |
---|---|
Die Ausgangsrechnung in mathematischer Schreibweise | |
Die gleiche Rechnung in Gleitkommaschreibweise, kein Runden nötig | |
Die Addition beginnt, ab hier wird intern mit beliebiger Genauigkeit gerechnet | |
Beide Operanden haben jetzt den gleichen Exponenten und die gleiche Mantissenlänge | |
Die Operanden werden ziffernweise addiert | |
Das Ergebnis der Addition wird so gerundet, dass es ins Darstellungsformat passt | |
Die Addition endet, ab hier wird nicht mehr mit beliebiger Genauigkeit gerechnet | |
Das Ergebnis in Dezimalschreibweise; die Addition hat nichts an der 100 geändert |
Unterlauf
[Bearbeiten | Quelltext bearbeiten]Liegt das Ergebnis eines Rechenschritts zwischen der kleinsten darstellbaren positiven Zahl und der 0, kann es zur 0 abgerundet werden. Dieses Abrunden wird Unterlauf (engl. underflow) genannt.
Ungültigkeit der Assoziativ- und Distributivgesetze
[Bearbeiten | Quelltext bearbeiten]Die Addition und die Multiplikation von Gleitkommazahlen sind nicht assoziativ, das heißt die Ausdrücke und sowie und sind nicht äquivalent.
Die Addition und Multiplikation von Gleitkommazahlen sind nicht distributiv, das heißt die Ausdrücke und sowie und sind nicht äquivalent.
Lösbarkeit von Gleichungen
[Bearbeiten | Quelltext bearbeiten]Bei Verwendung von Gleitkommaarithmetik haben viele Gleichungen andere Lösungsmengen als im Bereich der rationalen oder reellen Zahlen.
- Beispiele (unter Verwendung einer vierstelligen Dezimal-Gleitkomma-Arithmetik)
Die Gleichung hat im Bereich der rationalen Zahlen genau eine Lösung, nämlich .
Bei Verwendung von Gleitkomma-Arithmetik hat diese Gleichung viele Lösungen, nämlich alle Zahlen, die zu klein sind, um bei der Addition mit der Zahl das Ergebnis zu verändern. Je nach Rundungsregeln und Ausführung der Arithmetik sind das mindestens alle Zahlen mit , maximal alle Zahlen .
Die Gleichung hat im Bereich der reellen Zahlen genau 2 Lösungen, nämlich , im Bereich der rationalen Zahlen keine Lösung.
Bei Verwendung von Gleitkomma-Arithmetik hat diese Gleichung keine Lösung, da
Konversionen
[Bearbeiten | Quelltext bearbeiten]Wenn die Basis verschieden von 10 ist, müssen die Zahlen zwischen dem vorliegenden Gleitkommasystem und dem Dezimalsystem konvertiert werden, um eine menschenlesbare Darstellung zu erhalten. Eine schon alte und wichtige Forderung an diese Konversion ist ihre bitgenaue Umkehrbarkeit: Eine Zahl, die im Gleitkommaformat vorliegt und dann im Dezimalsystem dargestellt wird, soll wieder eingelesen werden können und bitgenau dieselbe Darstellung im Gleitkommasystem reproduzieren.
In vielen Programmiersprachen (C, C++, Python) wird diese Forderung nicht beachtet, dort gibt es in der Standardbibliothek keine Routinen, die eine exakte Umwandlung garantieren. Einige andere Programmiersprachen (Java, Scheme) liefern diese Umwandlungsroutinen bereits mit.
Dezimalbrüche
[Bearbeiten | Quelltext bearbeiten]Schon einfache Dezimalbrüche wie 0,1 können nicht exakt als binäre Gleitkommazahlen dargestellt werden, da jede rationale Zahl, deren gekürzter Nenner keine Zweierpotenz ist, im Binärsystem zu einer nicht abbrechenden, periodischen Darstellung führt. Von dieser werden nur die ersten Ziffern gespeichert, wodurch Ungenauigkeit entsteht. Dezimal 0,1 ist binär 0,0001100110011… Allerdings wurde für binäre Gleitkommasysteme mit entsprechenden Rundungsregeln bewiesen, dass die Darstellung von 0,1 multipliziert mit 10 wieder exakt 1 ergibt. Allgemein gilt bei richtiger Rundung (m / 10) · 10 = m (Goldbergs Theorem 7[8] für den konkreten Fall n = 21 + 23 = 10).
In Disziplinen wie der Finanzmathematik werden oft Ergebnisse verlangt, die mit einer dezimalen Handrechnung exakt übereinstimmen. Für diesen Anwendungsbereich sind Gleitkommazahlen ungeeignet, stattdessen wird dort dezimale Festkommaarithmetik eingesetzt.
Prüfung auf Gleichheit
[Bearbeiten | Quelltext bearbeiten]Die im Abschnitt Dezimalbrüche genannte Einschränkung, dass viele dieser Dezimalzahlen im Binärsystem eines Computers nicht exakt dargestellt werden können, hat beim Programmieren Auswirkungen auf Vergleiche zwischen Gleitkommazahlen.
Zum Beispiel gilt mathematisch: und . Beim Rechnen im Darstellungsformat „IEEE 754 double“ treten jedoch die folgenden Rundungsfehler auf, so dass diese Gleichungen dort nicht gelten.
Dezimalzahl | Gleitkommazahl IEEE 754 double | Anmerkung |
---|---|---|
abgerundet | ||
nach dem Multiplizieren wird erneut abgerundet | ||
aufgerundet | ||
nach dem Dividieren wird erneut abgerundet | ||
abgerundet |
Vergleiche auf exakte Gleichheit müssen deshalb durch eine Abfrage ersetzt werden, ob die zu vergleichenden Werte im Rahmen einer erreichbaren Genauigkeit (meist Toleranz genannt) als gleich angesehen werden können.
Toleriert man beim Vergleich einen absoluten Fehler, lautet eine mögliche Formulierung .
Toleriert man beim Vergleich einen relativen Fehler, lautet eine mögliche Formulierung . Der zweite Fall muss meist noch mit der Sonderfallabfrage verbunden werden.
Versteckte Verwendung anderer Darstellungen
[Bearbeiten | Quelltext bearbeiten]CPUs, Compiler und Bibliotheken stellen so gut wie immer verschiedene Gleitkommaformate zur Verfügung. Welche das sind, hängt von dem Zusammenspiel aus verwendeten CPU/FPU/GPU, dem verwendeten Compiler/Sprache und den verwendeten Optionen und den verwendeten Bibliotheken ab. Die Gleitkommaeinheiten des Intel 8087 und des Motorola 68881 unterstützen zum Beispiel ein Darstellungsformat mit 64 Bit unnormalisierter Mantisse, das genauer als das Darstellungsformat IEEE 754 binary64 mit seinen 53 Bit normalisierter Mantisse ist. Wird eine Zahl vom größeren Darstellungsformat in das kleinere Darstellungsformat umgewandelt, wird es entsprechend gerundet und verliert dadurch die letzten Stellen der Mantisse. Je nachdem, ob die Zwischenergebnisse von Rechnungen im internen Darstellungsformat oder im externen Darstellungsformat gespeichert werden, können selbst identische Ausdrücke wie etwa zu unterschiedlichen Ergebnissen führen.
Weblinks
[Bearbeiten | Quelltext bearbeiten]- Robert Munafo: Survey of Floating-Point Formats – Übersicht über historische Gleitkommaformate (englisch)
- David Goldberg: What Every Computer Scientist Should Know About Floating-Point Arithmetic. (englisch)
- David Monniaux: The pitfalls of verifying floating-point computations (englisch)
Einzelnachweise
[Bearbeiten | Quelltext bearbeiten]- ↑ Otto Neugebauer: The exact sciences in antiquity. Princeton University Press, 1952.
- ↑ Bartel Leendert van der Waerden: Science awakening. P. Noordhoff, Groningen, 1954.
- ↑ Donald E. Knuth: Ancient Babylonian algorithms. In: Commun. ACM. 15, 1972, S. 671–677, Korr. in Commun. ACM. 19, 1976, S. 108.
- ↑ Donald E. Knuth: The Art of Computer Programming. Vol. 2: Seminumerical Algorithms. 3. Auflage. Addison-Wesley, 1997, S. 196.
- ↑ Brian Randell: From Analytical Engine to Electronic Digital Computer: The Contributions of Ludgate, Torres, and Bush. Archiviert vom am 21. September 2013; abgerufen am 9. September 2013 (englisch).
- ↑ a b Rojas, R., Röder, J., Nguyen, H.: Die Prozessorarchitektur der Rechenmaschine Z1. In: Informatik Spektrum. Band 37, 2014, S. 341–347, doi:10.1007/s00287-013-0749-1.
- ↑ intel :: dataBooks :: 1981 iAPX 86 88 Users Manual. (archive.org [abgerufen am 30. Dezember 2023]).
- ↑ David Goldberg: What Every Computer Scientist Should Know About Floating-Point Arithmetic. In: ACM Computing Surveys. Band 23, 1991, S. 5–48, doi:10.1145/103162.103163 (sun.com [abgerufen am 2. September 2010]).