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: