J'ai toujours orienté les gens vers Harald Schmidt's online converter, avec le Wikipedia IEEE754-1985 article avec ses belles images.
Pour ces deux valeurs spécifiques, vous obtenez (pour 0,1):
s eeeeeeee mmmmmmmmmmmmmmmmmmmmmmm 1/n
0 01111011 10011001100110011001101
| || || || || || +- 8388608
| || || || || |+--- 2097152
| || || || || +---- 1048576
| || || || |+------- 131072
| || || || +-------- 65536
| || || |+----------- 8192
| || || +------------ 4096
| || |+--------------- 512
| || +---------------- 256
| |+------------------- 32
| +-------------------- 16
+----------------------- 2
Le signe est positif, c'est assez facile.
L'exposant est 64+32+16+8+2+1 = 123 - 127 bias = -4
, donc le multiplicateur est 2-4
ou 1/16
.
La mantisse est trapue. Il se compose de 1
(la base implicite) plus (pour tous les bits de chaque valeur étant 1/(2n)
que n
commence à 1
et augmente vers la droite), {1/2, 1/16, 1/32, 1/256, 1/512, 1/4096, 1/8192, 1/65536, 1/131072, 1/1048576, 1/2097152, 1/8388608}
.
Lorsque vous ajoutez tous ces, vous obtenez 1.60000002384185791015625
.
Lorsque vous multipliez ce chiffre par le multiplicateur, vous obtenez 0.100000001490116119384765625
, ce qui est la raison pour laquelle ils disent que vous ne pouvez pas représenter exactement 0.1
comme un flotteur IEEE754 et offre tellement d'opportunités sur le SO pour les personnes répondant à "why doesn't 0.1 + 0.1 + 0.1 == 0.3?"
questions -type :-)
L'exemple 0.5 est sensiblement plus facile. Elle est représentée comme suit:
s eeeeeeee mmmmmmmmmmmmmmmmmmmmmmm
0 01111110 00000000000000000000000
qui signifie qu'il est la base implicite, 1
, plus aucun autre additif (tous les bits de mantisse sont nuls).
Le signe est de nouveau positif. L'exposant est 64+32+16+8+4+2 = 126 - 127 bias = -1
. Par conséquent, le multiplicateur est 2-1
qui est 1/2
ou 0.5
. Donc la valeur finale est 1
multiplié par 0.5
, ou 0.5
. Voila!
je l'ai parfois trouvé plus facile de penser en termes de décimales.
Le numéro 1.345 est équivalent à
1 + 3/10 + 4/100 + 5/1000
ou:
-1 -2 -3
1 + 3*10 + 4*10 + 5*10
De même, la représentation IEEE754 pour décimal 0.8125
est:
s eeeeeeee mmmmmmmmmmmmmmmmmmmmmmm
0 01111110 10100000000000000000000
Avec la base implicite 1, qui est l'équivalent de le binaire:
01111110-01111111
1.101 * 2
ou:
-1
(1 + 1/2 + 1/8) * 2 (no 1/4 since that bit is 0)
qui devient:
(8/8 + 4/8 + 1/8) * 1/2
et puis devient:
13/8 * 1/2 = 0.8125