Skip to article frontmatterSkip to article content
Site not loading correctly?

This may be due to an incorrect BASE_URL configuration. See the MyST Documentation for reference.

Numerische Berechnung verwenden praktisch immer gebrochene Zahlen (“Kommazahlen”). Zwei Varianten für die Darstellung von gebrochenen Zahlen durch Bitfolgen:

Festkommazahlen spielen heute nur in Spezialanwendungen eine Rolle, siehe z.B. GNUCash und STM32G4 CORDIC co-processor. Auch werden Festkommazahlen von gängigen Programmiersprachen nur in Ausnahmefällen unterstützt (ein Beispiel ist GNU C). Beschäftigen uns hier deshalb nur mit Gleitkommazahlen genauer.

2.1Darstellung von Gleitkommazahlen

Ist die Höchstanzahl der Mantissenziffern (ohne Vorzeichen) festgelegt auf tNt\in\bbN, so gibt es mehrere Paare (m,e)(m,e), die die selbe Zahl darstellen. Beispiel für b=10b=10, t=4t=4:

123101=1230100.123\cdot 10^1=1230\cdot 10^0.

Man wählt üblicherweise die Darstellung mit der längsten möglichen Mantisse, d.h. die Mantisse hat stets genau tt Ziffern und die erste Ziffer ist nicht Null. Eine so dargestellte Gleitkommazahl heißt normalisierte Gleitkommazahl. Diese Darstellung ist eindeutig, für Null aber nicht möglich. Wenn nicht anders angegeben, meinen wir mit “Gleitkommazahl” im Folgenden stets eine normalisierte Gleitkommazahl.

Die Ziffernanzahl im Exponent spielt in der numerischen Mathematik nur selten eine Rolle. Die Mantissenlänge ist hingegen ausschlaggebend für die Genauigkeit von Berechnungen. Wenn wir im Folgenden Aussagen der Form “für alle reellen Zahlen gilt...” formulieren, meinen wir damit stets nur solche reellen Zahlen, die betragsmäßig kleiner als die größte darstellbare Gleitkommazahl sind, also keinen Exponentenüberlauf verursachen.

2.2Datenformat für binäre Gleitkommazahlen

Für die Umwandlung von Mantisse und Exponent einer binären Gleitkommazahl zu einer Bitfolge spielt heute hauptsächlich der Standard IEEE 754 eine Rolle. Siehe Floating-point arithmetic für Ausnahmen.

Benötigte Bitfolgen für eine normalisierte Gleitkommazahl:

Der Zusammenhang zwischen EE und ee entsteht dabei aus der Forderung, dass links und rechts der zweiten Mantissenziffer gleich viele Kommapositionen darstellbar sein sollen:

Die durch Vorzeichenbit S, Mantissenbetrag MM (ohne erste Ziffer) und transformierten Exponent EE beschriebene Zahl ist also

(1)S(2t1+M)2E(2p11)(t1)(-1)^S\,(2^{t-1}+M)\cdot 2^{E-(2^{p-1}-1)-(t-1)}

oder auch

(1)S1.M2E(2p11),(-1)^S\cdot 1.M\cdot 2^{E-(2^{p-1}-1)},

wobei 1.M1.M als 1+2(1t)M1+2^{(1-t)}\,M zu verstehen ist.

Übliche Werte für die Bitanzahl von Mantisse und Exponent bei binären Gleitkommazahlen

Bezeichnungt1t-1ppWertebereich von e+t1e+t-1dezimale Ziffern von mm
16-Bit-Geleitkommazahl1051415-14\ldots 15343\ldots 4
32-Bit-Geleitkommazahl238126127-126\ldots 127787\ldots 8
64-Bit-Geleitkommazahl521110221023-1022\ldots 1023151615\ldots 16

Spezielle Werte:

Ungültige Zahlen entstehen z.B. als Ergebnis der Division 0/0. Unendliche Werte entstehen zum z.B. bei 1/0 (dann ++\infty) oder -1/0 (dann -\infty). Die Zahl 0 hat dabei ebenfalls ein Vorzeichen. Betragskleine negative Zahlen werden auf -0 gerundet, positive auf +0. Somit kann 1/0 auch -\infty ergeben, wenn die 0 durch Runden einer negativen Zahl entstanden ist.

2.3Runden

Das übliche Rundungsverfahren für Gleitkommazahlen entspricht nicht exakt dem mathematischen Runden.

Beim mathematischen Runden wird in der zweiten Regel immer die größere der beiden möglichen Zahlen gewählt. Dies führt jedoch zur statistischen Drift.

Beispiel: Rechnen mit 2 Kommastellen. Mittelwert der 10 Werte 0.105, 0.115, 0.125, 0.135, 0.145, 0.155, 0.165, 0.175, 0.185, 0.195 ist 0.15 bzw. 0.16 je nach verwendeter Rundungsregel (IDVID 230).

Die Schranke ε:=12b1t\varepsilon:=\frac{1}{2}\,b^{1-t} für den relativen Rundungsfehler heißt Maschinenepsilon. Aus der Dreiecksungleichung folgen

(1ε)xround(x)(1+ε)x(1-\varepsilon)\,|x|\leq|\mathrm{round}(x)|\leq(1+\varepsilon)\,|x|

und

11+εround(x)x11εround(x)\frac{1}{1+\varepsilon}\,|\mathrm{round}(x)|\leq|x|\leq\frac{1}{1-\varepsilon}\,\mathrm{round}(x)

(IDVID 260). Diese Ungleichungen spielen eine wichtige Rolle bei der Fehleranalyse von Algorithmen. Insbesondere existiert zu jedem reellen xx ein ϱ\varrho mit

round(x)=(1+ϱ)x,ϱε.\mathrm{round}(x)=(1+\varrho)\,x,\qquad |\varrho|\leq\varepsilon.

2.4Grundoperationen

Einige grundlegende Operationen, die nach IEEE 754 mit korrektem Runden implementiert sein müssen (meist direkt in der Hardware):

Praktisch alle Prozessoren bieten viele weitere Operationen an. Siehe z.B. Intel® 64 and IA-32 Architectures Software Developer’s Manual Volume 1: Basic Architecture (ab Abschnitt 8.3.7). Mathematische Bibliotheken liegen üblicherweise in an die verschiedenen Prozessoren angepassten Versionen vor, sodass möglichst viele Operationen direkt auf der Hardware ausgeführt werden können.

Als Maß für die Rechengeschwindigkeit eines Prozessors werden gern FLOPS (floating-point operations per second, auch: flop/s) angegeben. Eine “floating-point operation” ist dabei meist als kombinierte Addition und Multiplikation zu verstehen. Es gibt jedoch keine allgemein anerkannte feste Definition dieser Einheit! Die Umrechnungen von FLOPS in Prozessortakte ist prozessorabhängig; siehe Floating point operations per second für die Umrechnungsfaktoren bei üblichen Prozessoren. Die Prozessortaktanzahlen für verschiedene Operationen findet man zum Beispiel in 4. Instruction tables: Lists of instruction latencies, throughputs and micro-operation breakdowns for Intel, AMD, and VIA CPUs (Spalte “Latency”, z.B. Seite 369 für Intel-Ice-Lake-Prozessoren).

2.5Hinweise für die Praxis

Der IEEE-754-Standard überlässt einige Details der konkreten Implementierung, sodass Programmcode sich auf unterschiedlichen Prozessorarchitekturen und bezüglich unterschiedlicher Compiler und Bibliotheken eventuell unterschiedlich verhält, siehe z.B. Floating-Point Determinism.

Auch setzen die meisten Compiler Codeoptimierung ein, wobei zu Gunsten von Geschwindigkeit auf Genauigkeit verzichtet wird. Die Optimierung lässt sich über zahlreiche Optionen steuern/abschalten. Für GNU C siehe Options That Control Optimization, für Microsoft C++ siehe /fp (Specify floating-point behavior).

Nicht nur mit Blick auf Abweichungen zwischen erwarteter und tatsächlich erzielter Genauigkeit sind diese Aspekte interessant, sondern auch mit Blick auf Reproducible Builds.

Für weitere “Randthemen” und Probleme bei der Verwendung von Gleitkommazahlen siehe auch Random ASCII – tech blog of Bruce Dawson (Category Archives: Floating Point).

Drei Personen sprechen diskutieren: "The math department number shortage is getting worse. We have only 15 2s and 12 3s left. No, wait, 13 2s and 10 3s. No, wait..."

“10 minutes ago we were down to only 2 0s!” “How many do we have now?” “I ... don’t know!!” Quelle: Randall Munroe, xkcd.com/3009