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);
Relacionado con: itofix, ftofix, fixtof, fixfloor, fixceil.int fixfloor(fixed x);
Relacionado con: fixtoi, fixceil.int fixceil(fixed x);
Relacionado con: fixtoi, fixfloor.fixed ftofix(float x);
Relacionado con: fixtof, itofix, fixtoi.float fixtof(fixed x);
Relacionado con: ftofix, itofix, fixtoi.fixed fixmul(fixed x, fixed y);
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);
Relacionado con: fixadd, fixsub, fixmul.fixed fixadd(fixed x, fixed y);
Relacionado con: fixsub, fixmul, fixdiv.fixed fixsub(fixed x, fixed y);
Relacionado con: fixadd, fixmul, fixdiv.
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);
Relacionado con: Trigonometría de punto fijo.fixed fixtan(fixed x);
Relacionado con: Trigonometría de punto fijo.fixed fixasin(fixed x);
Relacionado con: Trigonometría de punto fijo.fixed fixacos(fixed x);
Relacionado con: Trigonometría de punto fijo.fixed fixatan(fixed x);
Relacionado con: Trigonometría de punto fijo.fixed fixatan2(fixed y, fixed x);
Relacionado con: Trigonometría de punto fijo.fixed fixsqrt(fixed x);
Relacionado con: Trigonometría de punto fijo.fixed fixhypot(fixed x, fixed y);
Relacionado con: Trigonometría 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.
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.