2010-08-10 14 views
9

Estoy tratando de entender mejor la aritmética de coma flotante y he visto algunos enlaces a 'Lo que todo científico debería saber sobre la aritmética de punto flotante'.Cómo representar 0.1 en punto flotante Aritmética y decimal

Todavía no entiendo cómo un número como 0.1 o 0.5 se almacena en flotantes y como decimales.

¿Puede alguien explicar cómo se presenta la memoria?

Sé que el flotador tiene dos partes (es decir, un número por el poder de algo).

Respuesta

35

Siempre he apuntado personas hacia Harald Schmidt's online converter, junto con el Wikipedia IEEE754-1985 article con sus bellas imágenes.

Para esos dos valores específicos, se obtiene (por 0,1):

s eeeeeeee mmmmmmmmmmmmmmmmmmmmmmm 1/n 
0 01111011 10011001100110011001101 
      | || || || || || +- 8388608 
      | || || || || |+--- 2097152 
      | || || || || +---- 1048576 
      | || || || |+------- 131072 
      | || || || +-------- 65536 
      | || || |+----------- 8192 
      | || || +------------ 4096 
      | || |+---------------  512 
      | || +----------------  256 
      | |+-------------------  32 
      | +--------------------  16 
      +-----------------------  2 

El signo es positivo, que es bastante fácil.

El exponente es 64+32+16+8+2+1 = 123 - 127 bias = -4, por lo que el multiplicador es 2-4 o 1/16.

La mantisa es gruesa. Se compone de 1 (la base implícita) más (para todos aquellos bits que valen 1/(2n) como comienza en 1 y aumenta a la derecha), {1/2, 1/16, 1/32, 1/256, 1/512, 1/4096, 1/8192, 1/65536, 1/131072, 1/1048576, 1/2097152, 1/8388608}.

Cuando sumas todo esto, obtienes 1.60000002384185791015625.

Cuando se multiplican por el multiplicador, se obtiene 0.100000001490116119384765625, que es por eso que dicen que no se puede representar exactamente 0.1 como un flotador IEEE754, y ofrece tantas oportunidades para las personas en SO responder preguntas de tipo "why doesn't 0.1 + 0.1 + 0.1 == 0.3?" :-)


El ejemplo de 0.5 es sustancialmente más fácil. Se representa como:

s eeeeeeee mmmmmmmmmmmmmmmmmmmmmmm 
0 01111110 00000000000000000000000 

que significa que es la base implícita, 1, además no hay otros aditivos (todos los bits de la mantisa son cero).

El signo vuelve a ser positivo. El exponente es 64+32+16+8+4+2 = 126 - 127 bias = -1. Por lo tanto, el multiplicador es 2-1 que es 1/2 o 0.5.

Así que el valor final es 1 multiplicado por 0.5, o 0.5. Voila!


A veces me ha resultado más fácil pensar en términos decimales.

El número 1.345 es equivalente a

1 + 3/10 + 4/100 + 5/1000 

o:

 -1  -2  -3 
1 + 3*10 + 4*10 + 5*10 

Del mismo modo, la representación IEEE754 para decimal 0.8125 es:

s eeeeeeee mmmmmmmmmmmmmmmmmmmmmmm 
0 01111110 10100000000000000000000 

Con la base implícita de 1, que es equivalente a el binario:

  01111110-01111111 
1.101 * 2 

o:

     -1 
(1 + 1/2 + 1/8) * 2  (no 1/4 since that bit is 0) 

que se convierte en:

(8/8 + 4/8 + 1/8) * 1/2 

y entonces se convierte en:

13/8 * 1/2 = 0.8125 
2

Ver the Wikipedia entrythe IEEE group y, en primer lugar.

Básicamente, hay un signo, un número y un exponente. Un número en una base no puede representarse finitamente en otra base si la base de origen tiene factores no presentes en la base de destino. Por ejemplo, 1/3 no se puede representar como un número decimal finito, pero es trivial para representar como un número ternario (base-3): (0,1) .

Así 0.5 tiene una representación finito binario, (0,1) , es decir, 2 -1, pero 0.1 tiene un repitiendo representación porque 2 y 10 tienen un factor de (5) no en común.

Cuestiones relacionadas