X | XXXXXXXX | XXXXXXXXXXXXXXXXXXXXXXX |
Vorzeichen s | Exponent e | Mantisse f |
Bei einer normalisierten Darstellung liegt der Wert der Mantisse 1.f im Intervall [1, 2[.
Hierbei haben Dualzahlen nach dem Komma
Algorithmus dezimal
dual:
Sei Dezimalzahl x gegeben.
Bestimme größte 2-er Potenz 2d mit
2d x.
Setze
f = (x - 2d)/2d.
Offenbar gilt
Bestimme die Dualzahl-Bits von f durch
for (i = 0; i < 23; i++) { f = f * 2.0; if (f >= 1.0) {IO.print('1'); f = f - 1.0;} else IO.print('0'); }
s | = | 0 | |
f | = | (13.5 - 23)/23 = 0.6875 = ![]() ![]() ![]() |
|
e | = | 3 + 127 = 130 |
0 | 10000010 | 10110000000000000000000 |
Vorzeichen | Exponent | Mantisse |
Bei einer subnormalisierten Darstellung liegt der Wert der Mantisse 0.f im Intervall [0, 1[.
Exponent e = 0 und Mantisse f = 0 repräsentieren
die vorzeichenbehaftete Null.
Exponent e = 255 und Mantisse f = 0 repräsentieren
das vorzeichenbehaftete Unendlich(
+ , -
).
Exponent e = 255 und Mantisse f
0 repräsentieren
die undefinierte Zahl NaN (not a number).
Beispiel: 2-130 = 1/16 . 2-126
Daraus folgt
s | = | 0 | |
f | = | 0.0625 = 1/16 | |
e | = | 0 |
Codierung
0 | 00000000 | 00010000000000000000000 |
Vorzeichen | Exponent | Mantisse |
Die größte darstellbare positive Zahl liegt knapp unter
0 | 11111110 | 11111111111111111111111 |
Vorzeichen | Exponent | Mantisse |
0 | 00000000 | 00000000000000000000001 |
Vorzeichen | Exponent | Mantisse |
Bei der Codierung für 64 Bits ( double) benötigt das Vorzeichen 1 Bit, der Exponent 11 Bits, die Mantisse 52 Bits.
X | XXXXXXXXXXX | XXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXX |
Vorzeichen s | Exponent e | Mantisse f |
Damit liegt die größte darstellbare positive Zahl knapp unter
Die kleinste darstellbare positive Zahl lautet
+ | : | Gleitkomma x Gleitkomma |
![]() |
Gleitkomma | Addition |
- | : | Gleitkomma x Gleitkomma |
![]() |
Gleitkomma | Subtraktion |
* | : | Gleitkomma x Gleitkomma |
![]() |
Gleitkomma | Multiplikation |
/ | : | Gleitkomma x Gleitkomma |
![]() |
Gleitkomma | Division |
% | : | Gleitkomma x Gleitkomma |
![]() |
Gleitkomma | Modulo |
++ | : | Gleitkomma |
![]() |
Gleitkomma | Inkrement um 1.0 |
-- | : | Gleitkomma |
![]() |
Gleitkomma | Dekrement um 1.0 |
Multiplikation: (Exponenten addieren, Mantissen multiplizieren)
Beispiel: | 12 | * | 20 | = | ||
1.5 . 23 | * | 1.25 . 24 | = | |||
1.5 . 1.25 | * | 23 . 24 | = | |||
1.875 | * | 27 | = | 240 |
Addition: (Exponenten angleichen, Mantissen addieren)
Beispiel: | 12 | + | 20 | = | ||
1.5 . 23 | + | 1.25 . 24 | = | |||
0.75 . 24 | + | 1.25 . 24 | = | |||
(0.75 + 1.25) | * | 24 | = | |||
1 | * | 25 | = | 32 |
Problem beim Angleichen der Exponenten:
Beispiel: | 1024 | + |
![]() |
= | ||
1 . 210 | + | 1 . 2-20 | = | |||
1 . 210 | + | 2-30 . 210 | = | |||
1 . 210 | + | 0 . 210 | = | 1024 |
Bei 23 Bits für die Mantisse ist 2-30 nicht mehr darstellbar.
Gleitkommaoperationen stoßen in Java keine Ausnahmebehandlung an.
D.h., Division durch Null führt nicht zum Abbruch, sondern ergibt den
Wert + bzw. -
;
Null dividiert durch Null ergibt NaN (not a number).
Beispiele: | .2 | ||||
2 | |||||
2. | |||||
2.0 | |||||
2.538 | |||||
2.538f | |||||
2.5E2 | = | 2.5*102 | = | 250 | |
2.5E-2 | = | 2.5*10-2 | = | 0.025 |
Source:
Gleitkomma.java
JavaDoc:
Gleitkomma.html
Applet: