UTNianos

Versión completa: [Info 1 - TP 1] Ayuda con punto flotante!!!
Actualmente estas viendo una versión simplificada de nuestro contenido. Ver la versión completa con el formato correcto.
Hola gente.

Bueno queria hacerles una consulta de unos ejercicios que hay que emplear punto flotante. Por ejemplo, en el ejercicio 7 del TP N° 1, que dice:

Expresar en Base 10 los siguientes números dados en forma de Punto Flotante Precisión Simple.

Y te da el siguiente numero: 35C1F.

¿Como se resuelve eso? Tengo una idea pero no es muy clara.

Y vamos con otro, pero que es el proceso inverso.

Expresar en punto flotante simple precisión los números siguientes expresados en base 10.

Y nos da este numero: 165,625.

Eso es todo por ahora.

Saludos y muchas gracias.
Coma flotante de Simple Precision, son 4 bytes.

Por lo que el numero en realidad es 35C1F000

35C1F000 convertido a binario:

00110101110000011111000000000000

Y ahora dividimos en: 1 bit de signo, 8 de exponente, 23 de mantisa

0|01101011|10000011111000000000000

Signo: 0 -> +1
Exponente: 01101011 -> 107 -> le restamos el exceso -> 107 - 127 = -20 -> como son potencias de 2 nos quedamos con -> 2^-20
Mantisa: 10000011111000000000000 -> 2^-1+2^-7+2^-8+2^-9+2^-10+2^-11 = 0.515136719 -> Se le suma 1 -> 1.515136719

Multiplicamos todo:

+1 * 2^-20 * 1.515136719 = 1.44494697 E -6

-----------------------------------------------
El camino inverso:

Tenemos 165,625

Buscamos su signo: +1 -> 0

Transformamos el numero sin el signo a binario

165,625 -> 10100101,101

Exponente:
Desplazamos la coma hasta dejar solo un 1 a la izquierda

1,0100101101 -> 7 lugares -> Mantisa: 0100101101
Exponente: 7 -> Desplazado en 127 -> 127+7 = 134 -> En binario: 10000110

Armamos el numero

0|10000110|0100101101 -> completamos con ceros hasta los 4 bytes

01000011001001011010000000000000 -> En hexa: 4325A000 -> 4325A

-------------------------------------------------
Podes comprobar los resultados aqui: http://www.h-schmidt.net/FloatConverter/IEEE754.html
(04-05-2012 19:58)Drarko escribió: [ -> ]Coma flotante de Simple Precision, son 4 bytes.

Por lo que el numero en realidad es 35C1F000

35C1F000 convertido a binario:

00110101110000011111000000000000

Y ahora dividimos en: 1 bit de signo, 8 de exponente, 23 de mantisa

0|01101011|10000011111000000000000

Signo: 0 -> +1
Exponente: 01101011 -> 107 -> le restamos el exceso -> 107 - 127 = -20 -> como son potencias de 2 nos quedamos con -> 2^-20
Mantisa: 10000011111000000000000 -> 2^-1+2^-7+2^-8+2^-9+2^-10+2^-11 = 0.515136719 -> Se le suma 1 -> 1.515136719

Multiplicamos todo:

+1 * 2^-20 * 1.515136719 = 1.44494697 E -6

-----------------------------------------------
El camino inverso:

Tenemos 165,625

Buscamos su signo: +1 -> 0

Transformamos el numero sin el signo a binario

165,625 -> 10100101,101

Exponente:
Desplazamos la coma hasta dejar solo un 1 a la izquierda

1,0100101101 -> 7 lugares -> Mantisa: 0100101101
Exponente: 7 -> Desplazado en 127 -> 127+7 = 134 -> En binario: 10000110

Armamos el numero

0|10000110|0100101101 -> completamos con ceros hasta los 4 bytes

01000011001001011010000000000000 -> En hexa: 4325A000 -> 4325A

-------------------------------------------------
Podes comprobar los resultados aqui: http://www.h-schmidt.net/FloatConverter/IEEE754.html

Muchas gracias. Entonces la idea que yo tenia era correcta. La forma en que yo "lo sabia" hacer era de la siguiente forma, te explico así vos me decís que opinas:

Yo tengo el numero no se, por poner un ejemplo, 250,32 en decimal.

1) Lo paso a binario y me queda (por ejemplo): 10001001,100100
2) Corro la coma hasta que me quede a la izquierda un 1 --> 1,0001001100100 (2^-7)
3) La mantisa va ser 00010011001000000000000 (1+2^-4+2^-7+2^-8+2^-11)
4) El exponente va a ser: 127 + 7 : 134 (01101001, por ejemplo) (2^7)

Y el numero, entonces en punto flotante va a ser: 0 0001001100100 00010011001000000000000

Y el inverso es lo mismo pero al revés (mas fácil). Saludos y gracias!
Coma flotante de Simple Precision, son 4 bytes(32 bits= 1 para signo 8 para el exponente 23 para mantisa).

El numero que te dan es 00035C1F El usuario Drako lo completo al revés
00035C1F convertido a binario:

0000 0000 0000 0011 0101 1100 1111

Y ahora dividimos en: 1 bit de signo, 8 de exponente, 23 de mantisa

0 ! 0000 0000 ! 0000 0110 1011 1000 0011 111

Signo: 0 -> +1(positivo)
Exponente: 0000 0000 (Desnormalizado) -> Equivale al -126. Fijate siempre que te de este exp estas en el caso de "Desnormalizados" (esta bastante entendible en Wikipedia ;))
Mantisa: -> 2^-6+2^-7+2^-9+2^-11+2^-12+2^-13+2^-19+2^-20+2^-21+2^-22+2^-23 = 0,02624881268 (en este caso no se le suma 1, solo va si es Noramalizado)

Multiplicamos todo:

+1 * 2^-126 * 0,02624881268 = 3,0855 E -40

Fijate que el caso Del 165.625 El usuario Drako completo los ceros para completar los 4 bytes a la derecha en el campo
mantisa, eso esta bien, esos ceros no cambian la magnitud del numero ya que son ceros a derecha de la coma, y despues del ultimo digito con "peso"; es por eso que en este caso el num 00035C1F no es igual que el 35C1F000 ya que no hay ninguna coma.

Yo estuve haciendo del mismo TP el 3ED, pense que por la pinta iba a ser sencillo, el ayudante de catedra me paso el resultado que le paso el profe para que el corrija despues y da 1.408 E -42 fijate con esa a ver si te da asi.

Espero que haberte ayudado. Saludos thumbup3
(06-05-2012 16:16)guille769 escribió: [ -> ]Fijate que el caso Del 165.625 El usuario Drako completo los ceros para completar los 4 bytes a la derecha en el campo
mantisa, eso esta bien, esos ceros no cambian la magnitud del numero ya que son ceros a derecha de la coma, y despues del ultimo digito con "peso"; es por eso que en este caso el num 00035C1F no es igual que el 35C1F000 ya que no hay ninguna coma.

(04-05-2012 19:58)Drarko escribió: [ -> ]01000011001001011010000000000000 -> En hexa: 4325A000 -> 4325A

Yo completo a la derecha, es lo correcto y despues corto del numero.
Fijate que si no completas queda: 0100001100100101101, por lo que para transformarlo a hexa te falta un cero.
Ahora, si yo cuando paso de decimal a hexadecimal de Simple Precision, completo con ceros a la derecha, en el proceso inverso TAMBIEN tengo que completar con ceros a la derecha, osea ese 35C1F lo tengo que tomar como 35C1F000 ya que los ceros que le agrego, como bien decis vos, se agregan a la mantisa, a la derecha de la coma.

El año pasado fui ayudante del curso de Fernando Lage (jefe de catedra de Info I) y ese es el criterio que se toma, completar a la derecha.
buenas ! otra vez yo.. reviviendo viejos post... tengo una consulta para el 2do ejercicio de drako
165,625
en punto flotante de press simple es
0 10000110 01001011010000000000000
lo entendi perfecto thumbup3thumbup3thumbup3thumbup3

ahora si yo qiero hacer el paso inverso con este mismo ejemplo no llego nunca a 165,625... tendria que llegar?
mira lo hago aca
0 10000110 01001011010000000000000

0 signo + =P
10000110 en decimal es el numero 134 - 127 = 7.... o sea que voy a tener 2^-7 love
01001011010000000000000 aca hago la falopeada esa 2^-2 + 2^-5 + 2^-7+ 2^-8 + 2^-10= 0,293945312 + 1 =1 ,293945312
ahora hago 1,293945312 * 2 ^-7 y da 0,010108947 .... y ese numero no se parece ni un poco a 165,625 .... ya estoy re duro nosewall


EDIT: RESUELTO !!! el 7 era positivo !!!! ojo ! al hacer 1,293945312 * 2 ^7 da =D .... soy feliz, gracias gente ! arre
URLs de referencia