:: wikimiki.org ::
| IEEE 754 |
IEEE 754
Die Norm IEEE 754 (ANSI/IEEE Std 754-1985; IEC-60559 - International version) definiert Standarddarstellungen für binäre Gleitkommazahlen in Computern und legt genaue Verfahren für die Durchführung mathematischer Operationen, insbesondere für Rundungen, fest.
Überblick
In der Norm IEEE 754 werden zwei Grunddatenformate für binäre Gleitkommazahlen mit 32 Bit ("single precision") bzw. 64 Bit ("double precision") Speicherbedarf und zwei erweiterte Formate definiert. In der verwandten Norm IEEE 854 werden nichtbinäre Gleitpunktzahlen definiert. In Entwurf für eine Neufassung von IEEE 754 (IEEE 754r) werden weitere binäre (16, 32, 64, 128 Bit) und dezimale (32, 64, 128 Bit) Formate für Gleitpunktzahlen vorgeschlagen. IEEE 754 und IEEE 854 werden in Zukunft also zusammengeführt.
Schließlich gibt es Vorschläge und Implementierungen von weiteren Zahlenformaten, die nach den Prinzipien der IEEE 754 Norm gestaltet sind und deshalb oft als IEEE-Zahlen bezeichnet werden, obwohl das streng genommen falsch ist. Dazu gehören die Minifloats, die für die Ausbildung gedacht sind. Minifloats mit 16 Bit werden aber gelegentlich in der Graphikprogrammierung verwendet. Dazu gehören auch mehrere nicht von IEEE definierte Zahlenformate mit mehr als 64 Bit.
Allgemeines
Die Darstellung einer Gleitkommazahl besteht aus:
- Vorzeichen s (fast ausnahmslos 1 Bit)
- Exponent e (r Bit)
- Mantisse m (p Bit)
Bei normalisierten Gleitkommazahlen (NZ) nach IEEE 754 ist die Basis b = 2. Das Vorzeichen wird in einem Bit S gespeichert, so dass S = 0 positive Zahlen und S = 1 negative Zahlen markiert. Der Exponent e ergibt sich aus der in den Exponentenbits gespeicherten nichtnegativen Binärzahl E durch Subtraktion eines festen Biaswertes B: . Schließlich ist die Mantisse ein Wert, der sich aus den p Mantissenbits M berechnet als . Einfacher ausgedrückt, denkt man sich an das Mantissenbitmuster M links 1. angehängt: m = 1.M.
-
-
-
Dieses Verfahren ist möglich, weil durch Normalisierung (s.u.) die Bedingung für alle (darstellbaren) Zahlen immer eingehalten werden kann. Da dann die Mantisse immer links mit 1. beginnt, braucht dieses Bit nicht mehr gespeichert zu werden. Damit gewinnt man ein zusätzliches Bit Genauigkeit.
Neben normalisierten Zahlen gibt es in IEEE 754 auch nichtnormalisierte Zahlen (denormalized numbers).
Schließlich gibt es spezielle Werte, die Sonderfälle kennzeichnen. Dazu gehört die Zahl 0 in zwei Darstellungen +0 und -0. Dazu gehören zwei Darstellungen für , nämlich und . Und dazu gehören spezielle Darstellungen für Nichtzahlen, bezeichnet als NaN (not a number), mit denen explizit Ergebnisse verbotener Operationen markiert werden können. NaNs werden in Signal-NaNs (signaling NaN) für Ausnahmebedingungen und stille NaNs (quiet NaN) unterteilt.
Details
IEEE 754 unterscheidet vier Darstellungen: einfach genaue (single), erweiterte einfach genaue (single extended), doppelt genaue (double) und erweiterte doppelt genaue (double extended) Zahlenformate. Bei den erweiterten Formaten ist nur jeweils eine Mindestbitzahl vorgeschrieben. Die Grundformate sind vollständig definiert.
Die Anzahl der Exponentenbits legt den Wertebereich der darstellbaren Zahlen fest (s.u.). Die Anzahl der Mantissenbits legt die Genauigkeit dieser Zahlen fest.
Die Anordnung der Bits einer single in einer FPU (floating point unit) zeigt die nachfolgende Abbildung. Die bei einer Rechenanlage konkrete Anordnung der Bits im Speicher kann von diesem Bild abweichen und hängt von der jeweiligen Bytereihenfolge (litte/big endian) und weiteren Rechnereigenheiten ab.
Bild:IEEE-754-single1.png
Die Anordnung mit Vorzeichen – Exponent – Mantisse in genau dieser Reihenfolge bringt die dargestellten Gleitkommawerte in dieselbe Reihenfolge wie die durch dasselbe Bitmuster darstellbaren Signed-Integer-Werte. Damit können für die Vergleiche von Gleitkommazahlen dieselben Operationen verwendet werden, wie für die Vergleiche von Signed-Integers. Kurz: die Gleitkommazahlen können lexikalisch sortiert werden.
Neben diesen beiden Formaten werden "erweiterte Formate" definiert. Es wird aber nicht definiert, wie groß die Genauigkeit dieser Formate ist.
Auch wenn in diesem Artikel hauptsächlich das Zahlenformat erörtert wird, liegt die Bedeutung der IEEE 754 Norm auch darin, dass für Gleitkommazahlen genaue Vorschriften für
- Rundung
- arithmetische Operationen
- Wurzelberechnung
- Konversionen
- Ausnahmebehandlung (Exception handling)
festgelegt werden
Darstellbare Werte
Sind im Exponent einer Zahl alle Bits gesetzt (= 1) oder alle gelöscht (=0), so hat diese Fließkommazahl eine gesonderte Bedeutung:
;"Unendlich" : Repräsentiert Zahlen, deren Betrag zu groß sind, um dargestellt zu werden. Es wird zwischen +"Unendlich" und –"Unendlich" unterschieden. Die Berechnung von 1.0/0.0 ergibt per Definition ebenfalls +"Unendlich".
;"Keine Zahl" (NaN) : Damit werden ungültige (oder nicht definierte) Ergebnisse dargestellt, z. B. wenn versucht wurde, die Quadratwurzel aus einer negativen Zahl zu berechnen. Einige "unbestimmte Ausdrücke" haben als Ergebnis "keine Zahl", zum Beispiel 0.0/0.0 oder "Unendlich" – "Unendlich". Außerdem werden NaNs in verschiedenen Anwendungsbereichen benutzt, um "Kein Wert" oder "Unbekannter Wert" darzustellen. Insbesondere der Wert mit dem Bitmuster 111...111 wird oft für eine "nicht initialisierte Fließkommazahl" benutzt.
; Null : Null repräsentiert die absolute Null. Auch Zahlen, die zu klein sind, um dargestellt zu werden (Unterlauf) werden auf Null gerundet. Ihr Vorzeichen bleibt dabei erhalten. Negative kleine Zahlen werden so zu –0.0 gerundet, positive Zahlen zu +0.0. Beim direkten Vergleich werden jedoch +0.0 und –0.0 als gleich angesehen.
; Denormalisierte Zahl : Ist eine Zahl zu klein, um in normalisierter Form mit dem kleinsten, von Null verschiedenen Exponenten gespeichert zu werden, so werden sie als "Denormalisierte Zahl" gespeichert. Ihre Interpretation ist nicht mehr sondern . ist dabei der Wert des kleinsten "normalen" Exponenten. Damit lässt sich die Lücke zwischen der kleinsten normalisierten Zahl und Null verkleinern. Denormalisierte Zahlen haben jedoch eine geringere Genauigkeit als normalisierte Zahlen, die Anzahl der signifikanten Stellen in der Mantisse nimmt zur Null hin ab.
:Ist das Ergebnis (oder Zwischenergebnis) einer Rechnung kleiner als die kleinste darstellbare Zahl der verwendeten endlichen Arithmetik, so wird es i.A. auf Null gerundet; das nennt man Unterlauf der Gleitkommaarithmetik, englisch Underflow. Da dabei Information verloren geht, versucht man, Unterlauf nach Möglichkeit zu vermeiden. Die denormalisierten Zahlen in IEEE 754 bewirken einen allmählichen Unterlauf, indem "um die 0 herum" (für 'single') bzw. (für 'double') Werte eingefügt werden, die alle denselben absoluten Abstand voneinander haben und ohne diese denormalisierten Werte nicht darstellbar wären, sondern zu Unterlauf führen müssten.
; Normalisierte Zahl : In allen anderen Fällen berechnet sich der Wert v der Zahl als . Hierbei ist s das Vorzeichenbit, sind die Bits der Mantisse und die Bits des Exponenten. Der Wert a ist die Abweichung (engl.: bias), die aus der Tabelle oben entnommen werden kann.
:Die Mantisse ist im wesentlichen die ersten n wesentlichen Ziffern der Binärdarstellung der normalisierten Zahl. Die erste wesentliche Ziffer ist die höchstwertige (d.h. am weitesten links stehende) Ziffer, die von 0 verschieden ist. Da eine von 0 verschiedene Ziffer im Binärsystem nur eine 1 sein kann, muss diese erste 1 nicht explizit abgespeichert werden; gemäss der Norm IEEE 754 werden nur die folgenden Ziffern gespeichert, die erste Ziffer ist eine implizite Ziffer oder ein implizites Bit. Dadurch wird gewissermassen 1 Bit Speicherplatz 'gespart'.
Als darstellbarer Zahlenbereich ergibt sich:
- single: ±1,18·10-38 ... ±3,40·10+38
- double: ±2,23·10-308 ... ±1,80·10+308
Umwandlung
Für die Umwandlung einer Dezimalzahl in die IEEE 754-Maschinendarstellung geht man folgendermaßen vor. Als Beispiel soll 166,125 umgewandelt werden.
# 166,125dezimal = 10100110,001binär
# Nach Verschiebung des Kommas 10100110,001binär = 1,0100110001binär - 27 Die Bits nach dem Komma (nach der Normalisierung) werden oft auch Fraction Bits genannt.
# Die Mantisse erhält man, indem man die 1 und das Komma weglässt: 0100110001. Um auf 23 Bit zu kommen wird (falls nötig) das Ende mit Nullen aufgefüllt 0100110 00100000 00000000 oder korrekt gerundet. Bei der Rundung wird zur nächstgelegenen IEEE-Zahl gerundet, im Zweifelsfall zur nächstgelegenen geraden Darstellung (Bit rechts 0).
# Vorzeichen: Hier "0", da es sich um eine positive Zahl handelt.
# Charakteristik: 7 (Exponent = Anzahl Stellen, um die das Komma unter 2. nach links verschoben wurde) + 127 (Bias-Wert, da Darstellungsgenauigkeit vom Typ "Single") = 134dezimal = 10000110binär
# Ergebnis als Maschinenzahl: 0 10000110 0100110 00100000 00000000binär = 43 26 20 00hex
Wichtig ist es zu beachten, dass Fließkommazahlen nur begrenzte Genauigkeit bieten und es zwangsweise zu Rundungsfehlern kommt. Dies kommt vor allen dann zum Tragen, wenn man viele einzelne Fließkommazahlen aufsummiert. Oft addieren sich hier die Rundungsfehler.
Die Zahl 0,1dezimal z.B. ist 0,000110011001100110011...binär, also eine Zahl mit periodischen, und somit unendlich langen Nachkommastellen.
Viele Programmiersprachen bieten daher Alternative Datentypen für Kaufmännische Anwendungen an, die intern in dezimaler Schreibweise arbeiten, z.B. in Java java.math.BigDecimal.
Auch gibt es Programmiersprachen, die für numerische Berechnungen optimiert sind, z.B. Fortran.
Null
Die Zahl ist Null, wenn sowohl Exponent und auch Mantisse gleich Null sind. Das Vorzeichen spielt in diesem Fall keine Rolle.
Unendlich
Nichtzahlen - NaN
IEEE 754 fordert zwei Nichtzahlen: stille NaN (NaNq - quiet) und Signal-NaN (NaNs - signal). Beide stellen explizit keine Zahlen dar. Eine Signal-NaN löst im Gegensatz zu einer stillen NaN eine Ausnahme (Exception) aus, wenn sie als Operand einer arithmetischen Operation auftritt.
IEEE 754 ermöglicht dem Anwender das Einstellen von Traps bei Ausnahmebedingungen. Nutzt der Anwender diese Möglichkeit nicht, so wird im allgemeinen statt einer Signal-NaN eine stille NaN erzeugt.
Signal-NaN können je nach Rechenanlage uninitialisierten Rechnerspeicher füllen, so dass jedes Verwenden einer uninitialisierten Variable automatisch eine Ausnahme auslöst.
Stille NaN ermöglichen den Umgang mit Rechnungen, die kein Ergebnis erzeugen können, wie die Division 0/0.
NaN erlauben auch das Abspeichern zusätzlicher Hilfsinformation, z.B. über die Ursache der NaN. Damit wird die Diagnose der Fehlerursache während der Ausnahmebehandlung ermöglicht.
Rundungen
IEEE 754 unterscheidet zunächst zwischen binären Rundungen und binär-dezimalen Rundungen, bei denen geringere Qualitätsforderungen gelten.
Bei binären Rundungen muss zur nächstgelegenen darstellbaren Zahl gerundet werden. Wenn diese nicht eindeutig definiert ist (genau in der Mitte zwischen zwei darstellbaren Zahlen) muss in Richtung zur nächstgelegenen geraden Zahl gerundet werden. Damit wird der von Knuth beschriebene statistische Drift in längeren Rechnungen vermieden.
Eine zu IEEE 754 konforme Implementierung muss drei vom Programmierer einstellbare Rundungen bereitstellen: Rundung gegen +Unendlich (immer aufrunden), Rundung gegen -Unendlich (immer abrunden) und Rundung gegen 0 (Ergebnis immer betragsmäßig verkleinern).
Operationen
Zu IEEE 754 konforme Implementierungen müssen Operationen für Arithmetik, Berechnung der Quadratwurzel, Konversionen und Vergleiche bereitstellen. Eine weitere Gruppe von Operationen wird im Anhang empfohlen, jedoch nicht verbindlich vorgeschrieben.
Arithmetik und Quadratwurzel
IEEE 754 verlangt von einer (Hardware- oder Software-)Implementierung exakt gerundete Ergebnisse für die Operationen Addition, Subtraktion, Multiplikation und Division zweier Operanden sowie der Operation Quadratwurzel eines Operanden. Das heißt, das ermittelte Ergebnis muss gleich demjenigen sein, das bei einer exakten Ausführung der entsprechenden Operation mit anschließender Rundung entsteht. Vor allem für die Subtraktion ist das keine trivial erfüllbare Forderung (siehe Goldberg).
Weiter ist die Berechnung des Restes nach einer Division mit ganzzahligem Ergebnis gefordert. Diese Restberechnung ist definiert durch r = x - y - n, n ganzzahlig, abs (n-x/y) < 1/2 oder abs (n-x/y) = 1/2 und n gerade. Dieser Rest muss ohne Rundung exakt ermittelt werden.
Konversionen
Konversionen werden zwischen allen unterstützten Gleitkommaformaten gefordert. Bei einer Konversion in ein Gleitkommaformat mit kleinerer Genauigkeit muss wie schon unter Arithmetik beschrieben exakt gerundet werden.
Zu IEEE 754 konforme Implementierungen müssen Konversionen zwischen allen unterstützten Gleitkommaformaten und allen unterstützen ganzzahligen Formaten bereitstellen. Die ganzzahligen Formate werden in IEEE 754 jedoch nicht genauer definiert.
Bei jedem unterstützten Gleitkommaformat muss eine Operation existieren, die diese Gleitkommazahl in die exakt gerundete ganze Zahl im selben Gleitkommaformat konvertiert.
Schließlich müssen Konversionen zwischen dem binären Gleitkommaformat und einem Dezimalformat existieren, die genau beschriebenen Mindestqualitätsforderungen genügt.
Vergleiche
Gleitkommazahlen nach IEEE 754 müssen verglichen werden können. Die Norm definiert die notwendigen Vergleichsoperationen und für alle möglichen Sonderfälle (vor allem NaN, Unendlich und 0) die geforderten Ergebnisse. Gegenüber den "schulmathematischen" Vergleichen (kleiner, gleich oder größer) kommt als mögliches Ergebnis nach IEEE 754 vor allem unordered (nicht anordbar) hinzu, wenn einer der Vergleichsoperanden NaN ist. Zwei NaN sind prinzipiell verschieden, auch wenn ihre Bitmuster übereinstimmen.
Empfohlene Operationen
Im Anhang der Norm werden zehn weitere Operationen empfohlen. Da sie in einer Implementierung im Grunde sowieso benötigt werden, läuft diese Empfehlung letztlich darauf hinaus, die Operationen an den Programmierer weiterzugeben. Diese Operationen sind (in C-Schreibweise):
Copysign (x, y), Invertsign (x), Scalb (y, N), Logb (x), Nextafter (x, y), Finite (x), Isnan (x), x ≠ y, Unordered (x, y), Class (x). Die Details der Implementierung vor allem wieder bei den Sonderfällen NaN usw. sind ebenfalls vorgeschlagen.
Exceptions, Flags und Traps
Anhang
In einem Anhang werden zehn weitere Operationen (siehe dort) nicht verbindlich empfohlen.
Geschichtliches
In der 1960er und frühen 70er Jahren hatte jeder Prozessor sein eigenes Format für Gleitkommazahlen und seine eigene FPU oder Gleitkommasoftware, mit der das jeweilige Format verarbeitet wurde. Dasselbe Programm konnte auf verschiedenen Rechnern unterschiedliche Resultate liefern. Die Qualität der verschiedenen Gleitkommaarithmetiken war logischerweise ebenfalls sehr unterschiedlich.
Intel plante um 1976 für seine Mikroprozessoren eine eigene FPU und wollte die bestmögliche Lösung für die zu implementierende Arithmetik. Unter der Federführung der IEEE begannen 1977 Treffen, um FPUs für Gleitkommaarithmetik für Mikroprozessoren zu normieren. Das zweite Treffen fand im November 1977 unter dem Vorsitz von Richard Delp in San Francisco statt. Einer der Teilnehmer war Prof. Kahan.
Um 1980 wurde die Anzahl der Vorschläge für die Norm auf zwei reduziert: Der K-C-S Vorschlag (nach seinen Autoren Kahan, Coonen und Stone, 1977) setzte sich letztlich gegen die Alternative von DEC (F-Format, D-Format und G-Format) durch.
Ein bedeutender Meilenstein auf dem Weg zur Norm war die Diskussion über die Behandlung des Unterlaufs, der bis dahin von den meisten Programmierern vernachlässigt worden war.
Intel implementierte gleichzeitig mit der Entwicklung der Norm die Normvorschläge weitgehend in der Intel FPU 8087, die als Gleitkomma-Coprozessor zum 8088 Verwendung fand.
Die endgültige Norm wurde 1985 verabschiedet.
Literatur
IEEE 754: reprinted in SIGPLAN Notices Vol. 22, Nr. 2, Feb. 1987
Siehe auch Weblinks
- [http://754r.ucbtest.org/standards/754.txt IEEE 754]
- [http://www.h-schmidt.net/FloatApplet/IEEE754de.html Java-Applet zur Umrechnung zwischen Binär- und Dezimaldarstellung von IEEE 754-Fließkommazahlen]
- [http://www.cs.berkeley.edu/~wkahan/ieee754status/754story.html Zur Geschichte: An Interview with the Old Man of Floating-Point (Reminiscences elicited from William Kahan by Charles Severance)]
- William Kahan: [http://www.cs.berkeley.edu/~wkahan/ieee754status/ieee754.ps IEEE Standard 754 for Binary Floating-Point-Arithmetic], 1996
- David Goldberg: [http://cch.loria.fr/documentation/IEEE754/ACM/goldberg.pdf What Every Computer Scientist Should Know About Floating Point Arithmetic], 1991
Kategorie:Computer
Kategorie:Normung
Kategorie:Numerische Mathematik
ja:IEEE754
ko:IEEE 754
Gleitkommazahl
Eine Gleitkommazahl (auch Gleitpunktzahl, fälschlich Fließkommazahl; engl. floating point number) ist eine exakte oder approximative Darstellung einer rationalen Zahl in einem bestimmten Format. Die Menge der Gleitkommazahlen ist eine endliche Teilmenge der rationalen Zahlen, meist erweitert um einige Spezialelemente (+Unendlich, –Unendlich, NaN (=„Not A Number“), –0, usw. siehe unten). Zusammen mit den auf ihnen definierten Operationen bilden die Gleitkommazahlen eine endliche Arithmetik, die vor allem im Hinblick auf numerische Berechnungen mit Computern entwickelt wurde. Dort dienen die Gleitkommazahlen meist als rationale Näherungen für reelle Zahlen.
Idee
Bei Gleitkommazahlen ist nicht die absolute Anzahl von Stellen konstant, sondern die Anzahl wesentlicher oder signifikanter Stellen. Gleitkommaarithmetik wird auch als „linksbündige“, Festkommaarithmetik dagegen als „rechtsbündige“ Arithmetik bezeichnet wegen des unterschiedlichen Umgangs mit großen Resultaten bzw. Zwischenresultaten von Berechnungen.
Die Gleitkommadarstellung wurde von Konrad Zuse für seine Computer Z1 und Z3 erfunden. Im Gegensatz zur Festkommadarstellung wird bei der Gleitkommadarstellung die Zahl geteilt in eine Mantisse und einen Exponenten zu einer bestimmten, festen Basis, wodurch bei gleichem Speicherplatzbedarf ein größerer Wertebereich als bei Festkommadarstellung abgedeckt werden kann.
Das heißt, dass man eine Zahl a ≠ 0 durch zwei Zahlen m und e solcherart darstellen kann, dass a = m · be gilt. Zur Darstellung von Gleitkommazahlen wählt man eine beliebige natürliche Zahl b>1 als Basis (auch: Radix) und eine Präzision p, die angibt, wieviele Ziffern gespeichert werden sollen.
Die Zahl m wird Mantisse genannt und ist eine Zahl mit p Stellen der Form ±z,zzz...zzz . Hierbei steht z stellvertretend für eine Ziffer zwischen 0 und b – 1. Eine Mantisse m heißt normalisiert, wenn ihre erste Ziffer ungleich Null ist. Die Normalisierung wird meist so definiert, dass entweder (d.h. ) oder (d.h. ) ist, d.h. dass die erste wesentliche, d.h. von 0 verschiedene Ziffer unmittelbar links bzw. unmittelbar rechts vom Komma stehen muss. Dies wird durch Anpassung des (ganzzahligen) Exponenten e erreicht. Bei Darstellungen von Gleitkommazahlen, die ein Vorzeichenbit verwenden, wird außerdem verlangt, dass die Mantisse positiv ist. e ist eine ganze Zahl und wird Exponent genannt. (Siehe auch: Logarithmus)
Beispiel:
Eine Gleitkommazahl mit vier dezimalen Stellen (b = 10, p = 4) kann dazu verwendet werden, 4,321 oder 0,00004321 darzustellen. Es wird allerdings in Kauf genommen, dass bei einer derartigen Darstellung Zahlen gerundet werden. So wird etwa aus 432,123 der Wert 432,1, und aus 43.212,3 der Wert 43.210.
Darstellung
Bild:IEEE-754-single1.png Bitdarstellung des IEEE 754 „Single“ Datentyps
Binäre Gleitkommazahlen werden analog zur wissenschaftlichen Schreibweise von Dezimalzahlen dargestellt. In der wissenschaftlichen Schreibweise wird die Zahl 0,00001234 als 1,234·10-5 geschrieben, oder die Zahl 123.400 als 1,234·105. Dabei ist die wissenschaftliche Schreibweise normalisiert: in der Mantisse wird die erste wesentliche Ziffer links vom Dezimal-Komma geschrieben, alle anderen Ziffern rechts davon.
Für die Darstellung als Gleitkommazahl wird eine Zahl in drei Teile aufgespalten. Ein Vorzeichenbit zeigt dabei negative Werte der Mantisse an. Für die Mantisse wird eine gewisse Anzahl von Bits festgelegt, sie wird im Binärsystem gespeichert. Ebenso wird der Exponent als gewisse Anzahl von Bits gespeichert.
Das gebräuchliche IEEE-Format für Gleitkommazahlen verwendet eine normalisierte Darstellung der Mantisse. Dadurch ist die Position des Kommas implizit bekannt. Ebenso ist die Basis b = 2 implizit durch die binäre Codierung aller Zahlen bekannt.
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. Das heißt, dass diese erste Eins nicht explizit gespeichert werden muss, da dies implizit bekannt ist. Das erwähnte IEEE-Format für Gleitkommazahlen macht von dieser Einsparungsmöglichkeit Gebrauch.
Allerdings bedeutet die Verwendung eines derartigen Hidden Bit, dass die Null nicht mehr direkt als Gleitkommazahl gespeichert werden kann. Für die Darstellung der Null wird deshalb eine bestimmte Bitfolge reserviert.
Darstellung negativer Exponenten
Exponenten können ebenso wie die Mantisse negativ sein. Meist werden negative Exponenten jedoch nicht im Zweierkomplement dargestellt, sondern in der so genannten Biased-Darstellung. Dabei wird zum eigentlichen Exponenten eine festgelegte Zahl, der Bias (engl. für Ausrichtung oder Vorspannung), addiert.
Bei einem Bias von 127 wird aus einem Exponenten e = –1 etwa 126, aus e = –127 wird 0 und aus e = 7 wird 134. Die negativen Werte werden also durch Addition des Bias in den positiven Bereich verschoben.
Der Vorteil der Biased-Darstellung besteht darin, dass auf diese Weise ein Größer/Kleiner-Vergleich zwischen zwei Gleitkommazahlen erleichert 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.
Gleitkommazahlen in der Digitaltechnik
Die oben erwähnten Beispiele sind im Dezimalsystem angegeben, das heißt mit einer Basis b = 10. Computer verwenden stattdessen das Binärsystem mit einer Basis b = 2. Gleitkommazahlen werden in Computern normalerweise als Folgen von 32 Bit („einfache Genauigkeit“) oder 64 Bit („doppelte Genauigkeit“) 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. Einige ältere Systeme verwendeten auch noch andere Längen wie z.B. 40 Bit.
Die IEEE hat die Darstellung von Gleitkommazahlen in ihrem Standard IEEE 754 reglementiert; beinahe alle modernen Prozessoren folgen diesem Standard. Ausnahmen sind einige IBM-Großrechnersysteme, die VAX-Architektur und einige Supercomputer, etwa von Cray sowie die Java Virtual Machine mit den Java-Typen float und double sowie den zugehörigen Wrapper-Klassen Float und Double. (vgl. hierzu z.B. die Darstellung von William Kahan unter [http://www.cs.berkeley.edu/~wkahan/JAVAhurt.pdf http://www.cs.berkeley.edu/~wkahan/JAVAhurt.pdf].)
Die tatsächliche Darstellung im Computer besteht also aus einem Vorzeichen-Bit, einigen Mantissen-Bits und einigen Exponenten-Bits. Wobei die Mantisse meist 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 meist implizit angenommen und nicht gespeichert.) Der Exponent wird meist im Biased-Format, oder auch im Zweierkomplement dargestellt. Des weiteren werden zur Darstellung besonderer Werte (Null, Unendlich, Keine Zahl) meist einige Exponentenwerte, z.B. der größtmögliche und der kleinstmögliche Exponent, reserviert.
Eine Zahl f wird demzufolge als f = s · m · 2e dargestellt, wobei s Element von ist.
Durch die unterschiedliche binäre Darstellung der Zahlen kann es in beiden Systemen zu Artefakten kommen, das heißt, Zahlen die unmittelbar „rund“ erscheinen, z. B. als 12.45 ausgegeben werden, haben in Wirklichkeit bei der Berechnung nur einen bitmäßig dargestellten Wert von 12.44999999900468785. Dies 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 BCD-kodierten Festkommazahlen vermieden werden. Binäre Gleitkommazahlen werden jedoch nach wie vor aus verschiedenen Gründen eingesetzt.
Gleitkommazahlen in der Mathematik
In der Mathematik ist eine Gleitkommazahl ein Tupel , wobei die Basis, den Bereich des Exponenten und
die Länge der Mantisse darstellt.
Damit ist eine reelle Zahl x ≠ 0 darstellbar durch ein a und ein e, so dass: und mit .
Hiermit ist eine mathematische Betrachtung des Rundungsfehlers möglich. Die obige Darstellung realisiert eine Projektion und damit ist der Rundungsfehler definiert als .
Bei double-Werten entspricht gerade (ungefähr ).
Berechnung einer IEEE single 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 (1bit), Mantisse und Exponent ) berechnet werden, aus denen sich die Zahl zusammensetzt:
Vorzeichen
Je nachdem, ob die Zahl positiv oder negativ ist, ist das Vorzeichen +1 oder -1. Ein positives Vorzeichen wird mit einem Vorzeichenbit 0 gespeichert, negative Zahlen werden durch eine 1 im Vorzeichenbit gekennzeichnet.
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:
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:
Zahlenbeispiel mit der Zahl 11,25
Zahl = +11,25
Vorzeichen = positiv -> 0binär
--> 3 + 127 = 130 -> 10000010binär
-> 01101000000000000000000binär
Damit ergibt sich folgende single Variable:
0 10000010 01101000000000000000000
Umkehrung
Will man aus einer Gleitkommazahl im Maschinenwort eine Dezimalzahl errechnen so kann man dies mit folgender Formel recht schnell erledigen:
Der Exponent E errechnet sich wie folgt:
Wobei B hier für die Basis (Digitalrechner: B=2), VZ für das Vorzeichen, C für die Charakteristik, E für den Exponenten, e für den Exponenten reservierte Bitstellen und M für die Mantisse steht.
Siehe auch
- Minifloats
- einfache Genauigkeit
- doppelte Genauigkeit
- vierfache Genauigkeit
- Integer (Datentyp)
Kategorie:Numerische Mathematik
ja:浮動小数点数
ko:부동소수점
IEEE 854Die Norm IEEE 854 (ANSI/IEEE Std 854-1987) definiert Standarddarstellungen für basis-unabhängige Gleitkommazahlen in Computern und legt genaue Verfahren für die Durchführung mathematischer Operationen, insbesondere für Rundungen, fest. Als Basis ist nur einer der beiden Werte 2 oder 10 erlaubt. IEEE 854 ist eine Verallgemeinerung von IEEE 754
Kategorie:Computer
Weblinks
- [http://754r.ucbtest.org/standards/854.txt IEEE 854]
Kategorie:Normung
Kategorie:Numerische Mathematik
MinifloatAls Minifloats bezeichnet man Zahlen in einem Gleitkommaformat mit nur wenigen Bits. Minifloats sind für numerische Rechnungen nicht geeignet, werden jedoch gelegentlich für Spezialzwecke oder in der Ausbildung eingesetzt.
Minifloats mit 16 Bit werden auch als halbgenaue Zahlen (als Gegensatz zu einfach und doppelt genauen Zahlen) bezeichnet. Es gibt auch Minifloats mit 8 Bit und weniger.
Viele Minifloats werden nach den Prinzipien der IEEE 754-Norm definiert und enthalten spezielle Werte für NaN und unendlich. Normalisierte Zahlen sind dann mit einem Exzess-Exponenten gespeichert. In der geplanten Revision von IEEE 754 (IEEE754r) sind Minifloats mit 16 Bit vorgesehen.
Minifloats werden manchmal zur Darstellung ganzer Zahlen verwendet. Werden gleichzeitig die IEEE 754-Prinzipien zugrundegelegt, so muss die kleinste denormalisierte Zahl gleich eins sein. Daraus ergibt sich der zu verwendende Exzess-Wert (Bias).
Beispiel
Ein Minifloat in einem Byte (8 Bit) mit 1 Vorzeichenbit, 4 Exponentenbits und 3 Mantissenbits soll zur Darstellung ganzer Zahlen nach IEEE 754-Prinzipien konstruiert werden. Dazu muss im wesentlichen der Biaswert sinnvoll festgelegt werden. Der (noch) unbekannte Exponent (gespeicherter Wert e - Biaswert b) wird vorläufig mit x bezeichnet. Zahlen in anderen Systemen werden mit ...() gekennzeichnet: 5 = 101(2) = 10(5). Das Bitmuster wird nur durch Leerezeichen in seine Bestandteile gegliedert.
Darstellung der Null
0 0000 000 = 0
Denormalisierte Zahlen
Die Mantisse wird mit 0. ergänzt:
0 0000 001 = 0.001(2) - 2^x = 0.125 - 2^x = 1 (kleinste denormalisierte Zahl)
...
0 0000 111 = 0.111(2) - 2^x = 0.875 - 2^x = 7 (größte denormalisierte Zahl)
Normalisierte Zahlen
Die Mantisse wird mit 1. ergänzt:
0 0001 000 = 1.000(2) - 2^x = 1 - 2^x = 8 (kleinste normalisierte Zahl)
0 0001 001 = 1.001(2) - 2^x = 1.125 - 2^x = 9
...
0 0010 000 = 1.000(2) - 2^(x+1) = 1 - 2^(x+1) = 16 = 1.6e1
0 0010 001 = 1.001(2) - 2^(x+1) = 1.125 - 2^(x+1) = 18 = 1.8e1
...
0 1110 000 = 1.000(2) - 2^(x+13) = 1.000 - 2^(x+13) = 65536 = 6.5e4
0 1110 001 = 1.001(2) - 2^(x+13) = 1.125 - 2^(x+13) = 73728 = 7.3e4
...
0 1110 110 = 1.110(2) - 2^(x+13) = 1.750 - 2^(x+13) = 114688 = 1.1e5
0 1110 111 = 1.111(2) - 2^(x+13) = 1.875 - 2^(x+13) = 122880 = 1.2e5 (größte Normalisierte Zahl)
(Die Darstellungen rechts berücksichtigen die Genauigkeit, denn natürlich kann man mit drei Bit keine fünf oder sechs Stellen speichern.)
Unendlich
0 1111 000 = unendlich
Nichtzahlen
0 1111 xxx = NaN
Herleitung
Wenn die kleinste denormalisierte Zahl gleich eins sein soll, muss nach der zweiten Zeile x = 3 sein. Daraus folgt ein Exponenten-Bias (Exzess-Wert) von -2. Vom gespeicherten Exponent muss jeweils -2 subtrahiert werden (+2 addiert werden), um zum rechnerischen Exponenten x zu kommen.
Diskussion dieses Beispiels
Der Vorteil solcher ganzzahliger Minifloats in einem Byte ist der wesentlich größere Wertebereich von -122880 ... 122880 gegenüber Darstellungen im Zweierkomplement mit -128 .. 127. Dafür sinkt die Genauigkeit rapide ab, da stets nur 4 signifikante Bitstellen existieren. Dementsprechend groß sind die Lücken im Bereich der größten normalisierten Zahlen.
Diese Minifloat-Darstellung kann nur 242 verschiedene Zahlen darstellen (sofern man +0 und -0 als verschieden ansieht), da es 14 verschiedene Bitmuster gibt, die keine Zahl darstellen (NaN).
Interessant ist die Übereinstimmung der Bitmuster von Minifloatzahlen und Integer-Zahlen zwischen 0 und 16. Erst das Bitmuster 00010001 wird als Minifloat 18, jedoch als Integerzahl 17 interpretiert.
Für negative Zahlen stimmt diese Übereinstimmung jedoch nicht mehr, da negative Integer-Zahlen üblicherweise im Zweierkomplement repräsentiert werden.
Siehe auch
- Gleitkommazahl
- IEEE 754
- IEEE 754r
Web Links
- http://www-nw.uni-regensburg.de/~.brf09510.rz.uni-regensburg.de/minifloat/mf.png Graphische Darstellung von Minifloats.
Kategorie:Datentyp
Kategorie:Numerische Mathematik
Doppelte GenauigkeitIn der Informatik ist doppelte Genauigkeit (engl. double precision oder auch nur double) eine Bezeichnung für ein Zahlenformat, das zwei Speichereinheiten im Rechner belegt. Damit sind die genauen Details abhängig vom System und dessen Speicherarchitektur. Speziell für Mikroprozessoren mit byteweisem Speicher wurde der IEEE 754-Standard entworfen, der 8 Byte (64 Bit) für dieses Zahlenformat vorschreibt. Die Bezeichnung ist nicht für Gleitpunktzahlen vorbehalten, sondern auch für ganze Zahlenformate anwendbar.
siehe auch
- Minifloats
- einfache Genauigkeit
- vierfache Genauigkeit
- Gleitkommazahl
Kategorie:Numerische Mathematik
QuadratwurzelUnter der Quadratwurzel einer Zahl versteht man in der Mathematik eine Zahl, deren Quadrat gleich der gegebenen Zahl ist. Das Symbol für die Quadratwurzel aus ist . Dabei wird die Zahl beziehungsweise der Rechenausdruck unter der Wurzel als Radikand bezeichnet. Möglich wäre auch die ausführlichere Schreibweise . Außerdem kann man die Quadratwurzel als Potenz ausdrücken. ist gleichwertig zu .
Beispiel: Wegen gilt .
Bei der formalen Definition der Quadratwurzel sind zwei Probleme zu berücksichtigen:
- Wenn man sich auf rationale Zahlen beschränkt, dann ist die Quadratwurzel in vielen Fällen nicht definiert. Schon in der Antike fand man heraus, dass etwa die Zahl keine rationale Zahl sein kann (siehe Euklids Beweis für Irrationalität von Wurzel 2).
- Im Allgemeinen existieren zwei verschiedene Zahlen, deren Quadrate mit einer vorgegebenen Zahl übereinstimmen. Beispielsweise wäre wegen auch die Zahl -3 ein möglicher Kandidat für die Quadratwurzel aus 9.
Das Symbol für die Quadratwurzel wurde zum ersten Mal während des 16. Jahrhunderts benutzt. Es wird vermutet, dass das Zeichen eine modifizierte Form des kleinen r ist, das als Abkürzung für das lateinische Wort "radix" (Wurzel) steht. Ursprünglich wurde das Symbol dem Radikanden vorangestellt; die waagerechte Verlängerung fehlte. Noch Carl Friedrich Gauß verwendete daher Klammern für kompliziertere Wurzelausdrücke und schrieb zum Beispiel anstelle von .
Im Englischen wird die Quadratwurzel als "square root" bezeichnet, weshalb in vielen Programmiersprachen die Bezeichnung "sqrt" für die Quadratwurzelfunktion verwendet wird.
Quadratwurzeln aus reellen Zahlen
Definition: Die Quadratwurzel einer nicht-negativen reellen Zahl ist diejenige nicht-negative reelle Zahl , deren Quadrat gleich ist.
Das oben erwähnte Problem, dass nicht definiert sein könnte, tritt im Bereich der reellen Zahlen für nicht auf. Auch die Eindeutigkeit ist gewährleistet, da negative Zahlen (z.B. -3) ausgeschlossen wurden.
Praktische Bestimmung von Quadratwurzeln aus reellen Zahlen
Selbst dann, wenn die Quadratwurzel aus einer natürlichen Zahl gezogen werden soll, ist das Ergebnis häufig eine irrationale Zahl, die sich durch einen nicht-periodisch unendlichen Dezimalbruch ausdrücken lässt. Es geht also oft nur darum, einen Näherungswert ausreichender Genauigkeit zu finden. Dazu gibt es eine Reihe von Möglichkeiten:
- Schriftliches Wurzelziehen: Hierbei handelt es sich um einen Algorithmus ähnlich dem gängigen Verfahren der schriftlichen Division.
- Intervallschachtelung: Dieses Verfahren ist recht leicht zu verstehen, wenn auch in der praktischen Durchführung sehr mühsam.
Beispiel (Näherungswert für ):
Aus und folgt, dass zwischen 1 und 2 liegen muss.
Daher probiert man , usw. durch.
Aus und erkennt man, dass zwischen 1,4 und 1,5 liegen muss.
Fortsetzung dieses Verfahrens mit immer mehr Nachkommastellen liefert schließlich einen Näherungswert mit der gewünschten Genauigkeit:
- Babylonisches Wurzelziehen oder Heron-Verfahren: Dieses Iterationsverfahren wird insbesondere von Taschenrechnern verwendet, da es schnell konvergiert.
- Die Taylorreihen-Entwicklung von mit Entwicklungspunkt 1 kann mit Hilfe des binomischen Lehrsatzes gefunden werden. Die Reihe konvergiert für punktweise gegen den Funktionswert der Wurzelfunktion.
:
:
Quadratwurzeln aus komplexen Zahlen
Für eine komplexe Zahl gibt es keine sinnvolle Möglichkeit, die Eindeutigkeit von zu erzwingen. Man kann also für nur von den beiden Quadratwurzeln der Zahl sprechen. Diese ergeben sich aus
:
Dabei steht sign() für
das Vorzeichen von und
:
für den Betrag von .
Ist in Polarkoordinaten gegeben,
dann hat die Quadratwurzel die Darstellung
:
wobei die Werte 0 oder 1 annehmen kann.
Der Betrag der beiden Wurzeln ergibt sich demnach als die Wurzel aus dem Betrag der komplexen Zahl. Bei der Lösung mit wird das Argument (in der komplexen Zahlenebene also der Winkel zwischen dem Radiusvektor und der reellen Achse; sein Tangens ist das Verhältnis von Imaginär- zu Realteil) halbiert. Die andere Lösung (für ) ergibt sich geometrisch durch Punktspiegelung am Ursprung.
Beispiel (Quadratwurzeln aus ):
Zunächst werden Betrag und Argument des Radikanden ermittelt.
:
:
: (2. Quadrant!)
Eine der Wurzeln ergibt sich aus
:
:
Die andere Wurzel erhält man durch Vorzeichenumkehr:
center
Quadratwurzeln modulo n
Auch im Restklassenring lassen sich Quadratwurzeln definieren.
Ganz analog zu den reellen und komplexen Zahlen heißt eine
Quadratwurzel von , wenn gilt:
:
Allerdings muss man sich zur Berechnung von Quadratwurzeln modulo n anderer Methoden
bedienen als beim Berechnen reeller oder komplexer Quadratwurzeln.
Um die Quadratwurzeln von modulo zu bestimmen, geht man folgendermaßen vor:
Zuerst bestimmt man die Primfaktorzerlegung von :
:
und bestimmt die Lösungen modulo der jeweiligen Primpotenzen .
Diese Lösungen setzt man schließlich mit dem Chinesischen Restsatz
zur gesuchten Lösung zusammen.
Berechnung von Quadratwurzeln modulo einer Primzahl p
Für Primzahlen ungleich 2 geschieht das Berechnen der Quadratwurzeln
zu so:
Um zu testen, ob überhaupt eine Quadratwurzel in hat,
verwendet man das Legendre-Symbol
:
denn es gilt:
: | | |