2010-07-17 15 views
8

yo estaba tratando de comprender la representación de punto flotante en C usando el código (tanto float y int son de 4 bytes en mi máquina):Representación de flotador en C

int x = 3; 
float y = *(float*) &x; 
printf("%d %e \n", x, y); 

Sabemos que la representación binaria de x será el siguiente

00000000000000000000000000000011

y por lo tanto yo hubiera esperado a ser representados de la siguiente manera

  • bit de signo (primer bit de la izquierda) = 0

  • Exponente (bits 2-9 de la izquierda) = 0

  • Mantisa (bits 10-32): 1 + 2^(-22)+2^(-23)

Llevando a y = (-1)^0 * 2^(0-127) * (1+2^(-22) + 2^(-23)) = 5.87747E-39

Mi programa sin embargo imprime

3 4.203895e-45

Eso es, y tiene el valor 4.203895e-45 en lugar de 5.87747E-39 como lo esperaba. Por qué pasó esto. ¿Qué estoy haciendo mal?

P.S. También imprimí los valores directamente desde gdb, por lo que no es un problema con el comando printf.

+5

http://en.wikipedia.org/wiki/Single_precision_floating-point_format – kennytm

+0

¿En qué máquina está intentando esto?¿Cuál es el orden de bytes del host? Big Endian? Little Endian? – Dirk

+0

x86_64 linux machine. Little-endian. – Siggi

Respuesta

12

Los números de punto flotante IEEE con campos de exponente de los 0 son 'desnormalizados'. Esto significa que el 1 implícito en frente de la mantisa ya no está activo. Esto permite representar números realmente pequeños. Ver This wikipedia article for more explanation. En su ejemplo, el resultado sería 3 * 2^-149

1

En detalles se describe http://en.wikipedia.org/wiki/IEEE_754-2008 Este estándar supone que se cambia la mantisa izquierda hasta que se oculta el primer bit de significado (exponente creciente). En su caso, tiene la expresión 1 + 2^(- 23) - luego obtiene la respuesta correcta 4.9..E-32

+0

¿Podría mostrar trabajando para su respuesta? No parece ser correcto con respecto a simplemente conectar 1 + 2^(- 23) O la respuesta correcta es 4.9E-32. – freespace

6

-127 en el exponente está reservado para números desnaturalizados. Su cálculo es para números normalizados mientras su flotador es un flotador denormalizado.

números desnormalizaremos se calculan usando un método similar, pero:

  1. exponente se -126
  2. bit líder implícita ya no se supone

Así que esto significa que el cálculo es en su lugar:

(-1)**0*2**(-126)*(2**(-22)+2**(-23)) = 4.2038953929744512e-45 

Lo anterior es python, donde ** mea ns lo mismo que ^

Cuestiones relacionadas