2010-08-10 6 views
9

Je suis en train de comprendre l'arithmétique en virgule flottante mieux et ai vu quelques liens vers « Ce que tout informaticien doit savoir sur Virgule flottante Arithmétique ».Comment représenter 0,1 en arithmétique à virgule flottante et décimal

Je ne comprends toujours pas comment un certain nombre comme 0.1 ou 0.5 est stocké dans des flotteurs et en décimales. Est-ce que quelqu'un peut expliquer comment il est présenté est la mémoire?

Je sais sur le flotteur étant deux parties (à savoir un nombre à la puissance de quelque chose).

Répondre

35

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 
2

Voir the Wikipedia entry et the IEEE group, d'abord.

Fondamentalement, il y a un signe, un nombre et un exposant. Un nombre dans une base ne peut pas être représenté finiment dans une autre base si la base de la source a des facteurs non présents dans la base de destination. Par exemple, 1/3 ne peut pas être représenté comme un nombre décimal fini, mais est trivial à représenter comme un nombre ternaire (base-3): (0.1) .

So 0,5 a une représentation binaire finie, (0.1) , soit 2 -1, mais 0,1 a une répétant représentation parce que 2 et 10 ont un facteur (5) pas à commun.

Questions connexes