29 Rutinas matem�ticas de punto fijo

Allegro trae algunas rutinas para trabajar con n�meros de punto fijo, y define el tipo 'fixed' como un entero de 32 bits con signo. La parte alta es usada por el valor del entero y la parte baja es usada por el valor de la fracci�n, dando un rango de valores de -32768 a 32767 y un detalle de unos 4 o 5 decimales. Los n�meros de punto fijo pueden ser asignados, comparados, a�adidos, substra�dos, negados y desplazados (para multiplicar o dividir por potencias de 2) usando los operadores de enteros normales, pero tendr�a que tener cuidado de usar las rutinas de conversi�n apropiadas cuando combine n�meros de punto fijo con enteros o n�meros de coma flotante. Escribir 'punto_fijo_1 + punto_fijo_2' esta bien, pero 'punto_fijo + entero' no esta bien.


fixed itofix(int x);
Convierte un valor de entero a punto fijo. Esto es lo mismo que x<<16.

Relacionado con: fixtoi, ftofix, fixtof.
int fixtoi(fixed x);
Convierte un valor de punto fijo a entero, redondeando.
Relacionado con: itofix, ftofix, fixtof, fixfloor, fixceil.
int fixfloor(fixed x);
Devuelve el mayor entero menor que x. Esto es, redondea hacia el infinito negativo.
Relacionado con: fixtoi, fixceil.
int fixceil(fixed x);
Devuelve el menor intero mayor que x. Esto es, redondea hacia el infinito positivo.
Relacionado con: fixtoi, fixfloor.
fixed ftofix(float x);
Convierte un valor de coma flotante a punto fijo.
Relacionado con: fixtof, itofix, fixtoi.
float fixtof(fixed x);
Convierte un valor de punto fijo a coma flotante.
Relacionado con: ftofix, itofix, fixtoi.
fixed fixmul(fixed x, fixed y);
Un valor de punto fijo puede ser multiplicado o dividido por un entero con los operadores normales '*' y '/'. Sin embargo, para multiplicar dos valores de punto fijo necesita usar esta funci�n.

Si hay desbordamiento o divisi�n por cero, errno ser� activado y el valor m�ximo posible ser� devuelto, pero errno no es limpiado si la operaci�n es realizada con �xito. Esto significa que si va a comprobar un desbordamiento de divisi�n, deber�a poner errno=0 antes de llamar a fixmul().

Relacionado con: fixadd, fixsub, fixdiv.
fixed fixdiv(fixed x, fixed y);
Divisi�n de valores de punto fijo: mire fixmul().
Relacionado con: fixadd, fixsub, fixmul.
fixed fixadd(fixed x, fixed y);
A pesar de que los n�meros de punto fijo pueden ser a�adidos con el operador normal de enteros '+', eso no le da protecci�n contra desbordamientos. Si el desbordamiento es un problema, deber�a usar esta funci�n. Es mas lenta que los operadores de enteros, pero si hay un desbordamiento de divisi�n, ajustar� el tama�o del resultado en vez de dejarlo al azar, y activara errno.
Relacionado con: fixsub, fixmul, fixdiv.
fixed fixsub(fixed x, fixed y);
Resta de n�meros en punto fijo: mire fixadd().
Relacionado con: fixadd, fixmul, fixdiv.

Trigonometr�a de punto fijo

Las funciones de ra�z cuadrada, seno, coseno, tangente, cosecante y secante est�n implementadas usando tablas precalculadas, que son muy r�pidas pero no muy exactas. Por ahora, la cotangente realiza una b�squeda iterativa en la tabla de la tangente, por lo que es mas lenta que las otras.

Los �ngulos est�n representados en formato binario con 256 siendo igual al c�rculo completo, 64 es un �ngulo recto y as� sucesivamente. Esto tiene la ventaja de que un 'and' a nivel de bits puede ser usado para que el �ngulo quede entre cero y el c�rculo completo, eliminando esos tests cansinos 'if (angle >= 360)'.


fixed fixsin(fixed x);
Mira la tabla precalculada del seno.

Relacionado con: Trigonometr�a de punto fijo.
fixed fixcos(fixed x);
Mira la tabla precalculada del coseno.
Relacionado con: Trigonometr�a de punto fijo.
fixed fixtan(fixed x);
Mira la tabla precalculada de la tangente.
Relacionado con: Trigonometr�a de punto fijo.
fixed fixasin(fixed x);
Mira la tabla de la cosecante.
Relacionado con: Trigonometr�a de punto fijo.
fixed fixacos(fixed x);
Mira la tabla de la secante.
Relacionado con: Trigonometr�a de punto fijo.
fixed fixatan(fixed x);
Cotangente de punto fijo.
Relacionado con: Trigonometr�a de punto fijo.
fixed fixatan2(fixed y, fixed x);
Versi�n de punto fijo de la rutina atan2() de libc.
Relacionado con: Trigonometr�a de punto fijo.
fixed fixsqrt(fixed x);
Ra�z cuadrada de punto fijo.
Relacionado con: Trigonometr�a de punto fijo.
fixed fixhypot(fixed x, fixed y);
Hypotenusa en punto fijo (devuelve la ra�z cuadrada de x*x + y*y).
Relacionado con: Trigonometr�a de punto fijo.

Clase de punto fijo

Si est� programando en C++ puede ignorar todo lo de arriba y usar la clase "fija", que sobrecarga muchos operadores para proveer conversi�n autom�tica desde y hacia valores enteros y de coma flotante, y llama las rutinas de arriba cuando se necesitan. Sin embargo no deber�a mezclar la clase "fija" con los typedefs de punto fijo, ya que el compilador tratar� los valores de punto fijo como enteros regulares e insertar� conversiones innecesarias. Por ejemplo, si x es un objeto de clase fija, llamar fixsqrt(x) devolver� un resultado err�neo. Deber�a usar sqrt(x) o x.swrt() en vez de eso.



Alias de punto fijo

Las rutinas de punto fijo antes eran nombradas con el prefijo "f" en lugar de "fix", ej: fixsqrt() antes era fsqrt(), pero tuvieron que ser renombradas por conflictos con algunas implementaciones de la libc. Esto no deber�a afectar a la mayor�a del c�digo existente dado que existen alias de compatibilidad hacia atr�s. Estos alias son funciones est�ticas inline que enlazan los nombres antiguos con los nuevos, ej: fsqrt() llama a fixsqrt(). Puede desactivar estos alias definiendo la macro de preprocesador ALLEGRO_NO_FIX_ALIASES antes de inclu�r allegro.h.



Volver al Indice