prev up next

Previous: Konstantenbezeichner Up: Einfache Datentypen Next: Operatoren

Gleitkommazahlen (float, double)

Gleitkommazahlen werden durch Vorzeichen, Mantisse und Exponent beschrieben und erreichen damit deutlich größere Absolutwerte als Integerzahlen und können auch gebrochene Zahlen codieren. Genauer: Für eine gegebene Zahl $x$ werden Mantisse $m$ und Exponent $e$ gesucht mit der Eigenschaft

\begin{displaymath}x = m \cdot 2^{e}\end{displaymath}

Das heißt: Der Wert der Gleitkommazahl ergibt sich aus dem Produkt von Mantisse und der Zweierpotenz des Exponenten. Da es für ein gegebenes $x$ mehrere zueinander passende Mantissen und Exponenten gibt, wählt man die normalisierte Form mit einer Mantisse $1 \leq m < 2$. Da eine normalisierte Mantisse $m$ immer mit einer $1$ vor dem Komma beginnt, reicht es aus, ihren Nachkommawert als reduzierte Mantisse $f = m - 1.0 $ abzuspeichern.

Java verwendet zur Kodierung von Vorzeichen, Mantisse und Exponent den IEEE-Standard 754-1985, den wir hier aus didaktischen Gründen etwas vereinfacht darstellen.

Codierung

Bei einer Codierung für 32 Bits (float) werden für das Vorzeichen 1 Bit, für den Exponenten 8 Bits und für die reduzierte Mantisse 23 Bits vorgesehen.

X XXXXXXXX XXXXXXXXXXXXXXXXXXXXXXX
Vorzeichen $s$ Exponent $e$ reduzierte Mantisse $f$

Die Codierung des Vorzeichens geschieht über 0 = positiv und 1 = negativ, die Codierung des ganzzahligen Exponenten erfolgt im 2-er Komplement, die Codierung der nichtganzzahligen Mantisse erfolgt als Dualzahl mit Nachkommastellen. Hierbei werden die Dualziffern nach dem Komma gewichtet mit 2er-Potenzen der Form $2^i$ mit negativen $i$. D.h.

\begin{displaymath}0. d_{-1}d_{-2}d_{-3}\ldots d_{-k} \mbox{ hat die Bedeutung }
\sum_{i = -1}^{-k} d_{i} {\cdot} 2^i\end{displaymath}

Zu gegebenem $x$ lässt sich eine normalisierte Mantisse und der dazu passende Exponent wie folgt finden:

Bestimme die größte $2$-er Potenz $2^e$ mit $2^e \leq x$. Setze $m = x/2^e$. Offenbar gilt

\begin{displaymath}x = m \cdot 2^{e} \mbox{ mit }1 \leq m < 2 .\end{displaymath}

Zur Bestimmung der $k$ Nachkommastellen der reduzierten Mantisse $f := m -
1.0$ eignet sich folgender Algorithmus

for (i = 0; i < k; i++) {
   f = f * 2.0;
   if (f >= 1.0) {IO.print('1'); f = f - 1.0;}
      else IO.print('0');
}

Beispiel:
Sei $x = 13.5$ gegeben. Offenbar gilt

\begin{displaymath}13.5 = 1.6875 \cdot 2^3\end{displaymath}

Als Codierung ergibt sich

\begin{eqnarray*}
s&=& {0}\\
e&=& 3\\
m&=& (13.5)/2^{3} = 1.6875\\
f&=& 1.6875 - 1.0 = 0.6875 = \frac{1}{2} + \frac{1}{8} + \frac{1}{16}\\
\end{eqnarray*}



0 00000011 10110000000000000000000
Vorzeichen Exponent reduzierte Mantisse

Für die Spezialfälle wird vereinbart: Das vorzeichenbehaftete Unendlich ($\pm\infty$) wird durch den maximal möglichen Exponent $e=+127$ kodiert. Die vorzeichenbehaftete Null wird durch den minimal möglichen Exponent $e=-128$ kodiert.

Die größte darstellbare positive Zahl im vereinfachten float-Format liegt knapp unter

\begin{displaymath}2 {\cdot} 2^{126} = 2^{127} \approx 10^{38}\end{displaymath}

0 01111110 11111111111111111111111
Vorzeichen Exponent reduzierte Mantisse
Die kleinste darstellbare positive Zahl im vereinfachten float-Format lautet

\begin{displaymath}1.0 {\cdot} 2^{-127} = 2^{-127} \approx 10^{-38}\end{displaymath}

0 10000001 00000000000000000000000
Vorzeichen Exponent reduzierte Mantisse

Bei der Codierung für 64 Bits (double) sind für das Vorzeichen 1 Bit, für den Exponenten 11 Bits und für die reduzierte Mantisse 52 Bits vorgesehen.

X XXXXXXXXXXX XXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXX
Vorzeichen $s$ Exponent $e$ reduzierte Mantisse $f$


\begin{displaymath}
\mbox{Wert} = \left\{ \begin{array}{ll}
(-1)^{s} \cdot 2^{e}...
...= 1023\\
\pm 0 &\mbox{falls } e = -1024\\
\end{array}\right.
\end{displaymath}

Damit liegt die größte darstellbare positive Zahl im vereinfachten double-Format knapp unter

\begin{displaymath}2 \cdot 2^{1022} = 2^{1023} \approx 10^{308}\end{displaymath}

Die kleinste darstellbare positive Zahl im vereinfachten double-Format lautet

\begin{displaymath}1.0 \cdot 2^{-1023} = 2^{-1023} \approx 10^{-308}\end{displaymath}



Unterabschnitte
prev up next
Previous: Konstantenbezeichner Up: Einfache Datentypen Next: Operatoren