[C con Clase] Valores flotantes en memoria

Davidson, Steven srd4121 en njit.edu
Jue Mayo 16 08:09:35 CEST 2013


Hola César,

2013/5/15 cesar arias <sinatra435 en hotmail.com>

> Hola hola, como estan, tengo un pequeño problema de comprencion, es el
> siguiente:
>
> Hice un programa para ver como se almacena un valor punto flotante en
> memoria, es el siguiente:
>
>
[CORTE]


> Supongo que el programa esta bien, pero no puedo interpretar los valores,
> quiero decir: la salida es la siguiente:
>
> 0.5  =     00000000 00000000 00000000 11111100
> 1.0  =     00000000 00000000 00000001 11111100
> 2.0  =     00000000 00000000 00000000 00000010
> 3.0  =     00000000 00000000 00000010 00000010
> 4.0  =     00000000 00000000 00000001 00000010
> 5.0  =     00000000 00000000 00000101 00000010
> 6.0  =     00000000 00000000 00000011 00000010
> 7.0  =     00000000 00000000 00000111 00000010
> 8.0  =     00000000 00000000 00000000 10000010
> 9.0  =     00000000 00000000 00001000 10000010
> 10.0 =     00000000 00000000 00000100 10000010
>
> sizeof(union punto): 4
>
>
> *****************************************************
>
> Segun un libro que leo se supone que la salida de 0.5 debe ser:
>
> 0.5  =     00000000 00000000 00000101 11111111
>
> ya que los primeros tres octeto escrito representa el valor 5 y el ultimo
> octeto reprecenta el valor -1, entonces el valor se lo interpreta de la
> siguiente manera:
>
> 5 * 10^(-1)    =   0.5
>
> donde 10 es un valor necesario en la interpretacion de los valores
> flotante.
>
>
Esto no es correcto en la informática; ni desde luego desde el punto de
vista del procesador. En primer lugar, al tratarse de una secuencia
binaria, tenemos que tratar los números en base 2. En matemáticas, la
respuesta sería,

0,5 (decimal) = 0,1 (binario)

En notación científica (de base 2), esto sería:

1 x 2^(-1)

Como podemos ver, la secuencia de bits en la salida no es la esperada.
>
> Entiendo que hay varias formas de interpretar valores para una
> computadora, o puede ser tambien que el programa esté resuelto de una forma
> incorrecta, pero me inclino por lo primero.
>
> Espero me puedan ayudar con este dilema, creo que es basico conoser como
> se almacenan e interpretan los numeros en la memoria.
> Gracias por sus respuestas.
>
>
El problema es que los procesadores no guardan esta información ni la
tratan como las matemáticas ni como la notación científica. Los
procesadores para números de coma flotante de 32 bits siguen el estándar de
IEEE 754. El esquema viene a ser el siguiente:

32 | 31 30 ... 24  | 23 22 21 .... 1 0
---+----------------+---------------------
 s  |         ed        |      mantisa


s : 1 bit para el signo (negativo = 1 ; positivo = 0)
ed : 8 bits para el signo exponente desplazado por 127; es decir,
guardamos: 127-exponente (verdadero)
mantisa : 23 bits para la mantisa: la parte fraccionaria de la notación
científica

Por ejemplo, si queremos representar 0,3 en el formato IEEE 754, haríamos
esto:

s = 0, porque es positivo

Queremos hacer esto:

0,3 = (1 + mantisa) x 2^exponente

que es equivalente a,

0,3 / 2^exponente = 1 + mantisa

que en el ejemplo viene a ser:

0,3 / 2^(-2) = 1,2

así que el exponente desplazado será: 127 - 2 = 125 (01111101 en binario)

Ahora tenemos que convertir 0,2 a binario:

00110011001100110011010

Al final, obtendremos la secuencia:

0 01111101 00110011001100110011010


En cuanto a tu programa, tienes que tener en cuenta que los procesadores
tratan los valores en grupos de bytes, ordenados de forma particular.
Algunos procesadores ordenan los bytes tal y como esperas: los más
significativos son los primeros - conocido como "big-endian"; otros ordenan
en el sentido inverso: los menos significativos van primero - conocido como
"little-endian". Si usas un procesador de Intel, entonces estamos en el
caso de "little-endian". Esto significa que debes invertir el orden de la
secuencia binaria. Ahora mismo te sale esto:

0.5  =      00000000 00000000 00000000 11111100

Cuando debería interpretarse así:

00111111 00000000 00000000 00000000


Espero que esto aclare las dudas.

Steven
------------ próxima parte ------------
Se ha borrado un adjunto en formato HTML...
URL: <http://listas.conclase.net/pipermail/cconclase_listas.conclase.net/attachments/20130516/3f4d7007/attachment.html>


Más información sobre la lista de distribución Cconclase