Programación en Lenguaje Ensamblador

-El Verdadero Lenguaje de las Máquinas-

IEEE 754 y los Juegos 3D

–Importancia del Punto Flotante en los Videojuegos–

###ESTA NOTA AUN NO ESTA TERMINADA NI SERA LA ULTIMA ACERCA DEL PUNTO FLOTANTE O IEEE 754###

Hasta donde recuerdo, el primer juego que exigía una unidad de punto flotante para funcionar fue Quake de Id Software. O al menos ese fue el primer juego que necesitaba un procesador Pentium de Intel como requerimiento mínimo.

imagen de quake

¿Pero que tiene que ver uno de los mas famosos juegos para computadora con un aburrido circuito electrónico que solo sabe hacer cuentas? Resulta que para hacer los cálculos para las gráficas 3D es necesario una gran velocidad y precisión numérica. Y aunque es posible hacer gráficas respetables usando “fixed point” (a los estándares de los noventas), desde el punto de vista de un procesador Intel es mas rápido y eficiente trabajar con números de punto flotante. Aunque antes de empezar a detallar el funcionamiento de una FPU, es necesario aclarar algunos términos básicos: Para empezar. ¿Porqué demonios se le llama unidad de punto flotante?

Flotante significa que sube y baja y que no se mantiene al mismo nivel, tal y como lo hace un barco de papel que flota en el agua. Contrario a lo que sucede con el punto fijo o Fixed Point. Donde el punto que separa a los enteros de las fracciones se mantiene mas o menos en el mismo lugar o casi no se mueve. El simil en el mundano sistema decimal son los números de notación científica. Esos que tienen un número con un punto una cifra chiquitita que les cuelga por un lado. Para quienes fueron a la escuela pública aquí va un ejemplo sencillo:

2.345 x 10^6

Lo que nos dice esta expresión es que al número 2.345 hay que multiplicarlo por 10^6. Como 10^6 es un millón (1,000,000) la multiplicación es 2.345 x 1,000,000 que nos da un fabulosos total de 2,345,000. Para quien tiene mas de 2 dedos de frente es obvio que no era necesario hacer todo este cálculo, solo bastaba con ‘correr’ (como dirían en españa) el punto 6 lugares hacia la derecha. Si el exponente de la base 10 es negativo, entonces habría que deslizarsa hacia la izquierda. Y si el exponente fuera cero el punto se quedaría donde está.

Sin embargo, dentro del mundo de la computación no existe el sistema decimal, todo se hace en binario. Si recuerdan la nota de “El Partido por la Mitad” sabrán como se representan las fracciones en este sistema. Sin embargo, la mayor parte de lo que se aplica para la notación científica decimal tambien cuenta para la notación exponencial binaria. En este gráfico vemos como se almacena un flotante de 32 bits:

***aqui deberia de ir un dibujo de un flotante de 32 bits***

Veamos cada parte del número:

Signo.- Es el bit mas alto, pero se interpreta diferente que los enteros con signo. Aquí simplemente indica que el valor es positivo (bit = 0) o negativo (bit = 1)

Exponente.- Es un número entero signado. En este caso mide 8 bits y puede representar de -128 a + 127. No hay que olvidar que en los números de punto flotante la base es 2. Un exponente debe de ser polarizado (biased) para evitar errores en el cálculo de recíprocos.

Mantisa o Significando.- Son los últimos 23 bits. (aunque funciona como si fueran 24) El tamaño del significando determina la precisión de los números de punto flotante. Pues aunque es posible representar valores con exponente tan grande como 2^ 255. Mas allá de 16,777,216 o de 1 / 16,777,216 comienza a perderse precisión.

Ahora veamos un ejemplo clásico del libro de Brey. El número decimal 100.25 a formato de punto flotante:

Tenemos 100.25

Convirtamos la parte entera a binario del método tradicional:

comienza con 100

0110 0100

convertir a binario la parte fraccionaria es diferente. A la fracción le vamos restando potencias negativas de 2. Si se puede restar se resta y se escribe un uno y si no se escribe un cero. Seguimos el proceso hasta que la fracción se iguala a cero o hasta que se nos acaben los bits para representarla.

0.25 – 0.5 <0 ——- 0

0.25– 0.25 >= 0 —-1

0.01

Entonces, l00.25 es 01100100.01

Como sabemos, multiplicar un número por un valor elevado a la potencia cero no lo altera sin importar porqué valor se multiplique, entonces

01100100.01 == 01100100.01 x 2 ^ 0

El último paso es deslizar el punto hasta la derecha del primer número UNO. Esto equivale a multiplicar el número por una potencia de 2 (Recuerden que una división es en realidad una multiplicación por un valor con exponente negativo) y hay que ajustar el exponente del 2 de acuerdo con ese movimiento:

01.10010001 x 2 ^ 6

Esta notación significa: Multiplicar el valor 01.10010001 por 2^6. Lo que nos da 01100100.01 que es el valor en formato binario de punto fijo.

Bueno, hasta ahora apenas hemos visto como convertir valores con decimal a notacion científica binaria. Pero no hemos visto nada sobre valores de punto flotante. Para hacer esto, aún hay que hacer algunas modificaciones:

El signo pasa directamente.- Solo va 0 si es positivo y 1 si es negativo.

El exponente debe ser polarizado (biased).- Para evitar desbordamientos a la hora de obtener el recíproco de un número es necesario polarizarlo. Esto se hace sumándole el mayor entero positivo. En este caso 7F hexadecimal para 8 bits. Esto permite cambiarlo de signo impunemente sin necesidad de preocuparse por un desbordamiento causado por el Wrap-Around. Si miran el Yin-Yang binario (la rueda azul y roja de la nota Positivo y Negativo) verán que este proceso manda el cero a la parte baja del círculo que representa los valores con signo.

Al significando se le quita el bit J.- Como ya saben desde sus años en la primaria pública. A la izquierda del punto que separa los enteros de las fracciones, siempre debe de haber un número diferente de cero. En el caso decimal puede ser cualquier valor del 1 al 9. Pero en binario, este valor solo puede ser UNO. Y si el valor no es uno, entonces el exponente no está bien definido. Ese bit es llamado “Bit J” en los manuales de Intel. De este modo, solo los 23 bits que siguen al punto se escriben en el formato. Los bits a la derecha se rellenan con ceros.

***tengo pendiente poner aqui la construcción del valor flotante***

Pero las cosas no son tan sencillas. En el mundo del punto flotante existen una gran cantidad de bestias extráñas que solo quien programa en Ensamblador puede verlas cara a cara. Algunas de estas son:

NaN’s.- Es cuando una operación da un resultado que no puede ser representado por los números reales. Como la raiz cuadrada de un valor negativo.

Infinito.- Es posible representar el infinito en formato de punto flotante.

Números denormales.- Hay una zona de la recta numérica real que no puede ser representada adecuadamente en formato de punto flotante. Para evitar esto la FPU manda una señal cuando detecta esta condición.

Zona de baja precisión.- El rango de números reales que pueden ser representados en punto flotante es similar a un resorte. Si el resorte está comprimido no hay espacio entre los anillos que forma la espiral pero conforme lo estiramos se van creando huecos. Del mismo modo, hay zonas en las que esos huecos son tan grandes que hay una gran pérdida de datos debida al redondeo.

Bueno, esta nota ya se extendió demasiado. Otro día seguiré con un estudio de esta clase de fenómenos.

mayo 1, 2009 - Posted by | Uncategorized | , , , ,

2 comentarios »

  1. Que pasó con el dibujo:
    ***aqui deberia de ir un dibujo de un flotante de 32 bits***

    |S|EEEEEEEE|MMMMMMMMMMMMMMMMMMMMMMM|

    |31|30<–23| 22 <– 0 |

    Sería interesante que trates este tema mas a fondo, bueno es sólo una sugerencia.
    Gracias, el blog esta muy interesante..quiero mas y mas conocimiento jeje…

    Comentario por Luis | julio 18, 2010 | Responder

    • jeje, sabia que estaba olvidando algo. Que bueno que me lo recuerdas para ponerlo y de una vez profundizar sobre el tema

      Comentario por asm86 | julio 18, 2010 | Responder


Responder

Introduce tus datos o haz clic en un icono para iniciar sesión:

Logo de WordPress.com

Estás comentando usando tu cuenta de WordPress.com. Cerrar sesión / Cambiar )

Imagen de Twitter

Estás comentando usando tu cuenta de Twitter. Cerrar sesión / Cambiar )

Foto de Facebook

Estás comentando usando tu cuenta de Facebook. Cerrar sesión / Cambiar )

Google+ photo

Estás comentando usando tu cuenta de Google+. Cerrar sesión / Cambiar )

Conectando a %s

A %d blogueros les gusta esto: