Estoy desarrollando una plataforma sin una biblioteca matemática, así que tengo que crear mis propias herramientas. Mi forma actual de obtener la fracción es convertir el flotador en punto fijo (multiplicar con (flotante) 0xFFFF, lanzar a int), obtener solo la parte inferior (máscara con 0xFFFF) y convertirlo nuevamente a un flotador.Obtener la parte fraccionaria de un flotante sin usar modf()
Sin embargo, la imprecisión me está matando. Estoy usando mis funciones Frac() e InvFrac() para dibujar una línea anti-alias. Utilizando modf
obtengo una línea perfectamente uniforme. Con mi propio método los píxeles comienzan a saltar debido a la pérdida de precisión.
Este es mi código:
const float fp_amount = (float)(0xFFFF);
const float fp_amount_inv = 1.f/fp_amount;
inline float Frac(float a_X)
{
return ((int)(a_X * fp_amount) & 0xFFFF) * fp_amount_inv;
}
inline float Frac(float a_X)
{
return (0xFFFF - (int)(a_X * fp_amount) & 0xFFFF) * fp_amount_inv;
}
Gracias de antemano!
¿No debería fp_amount ser 0x10000 en lugar de 0xFFFF? –
Santa mierda. ¡Hazlo una respuesta para que yo pueda aceptarlo! ¡Has solucionado todo mi problema de precisión! – knight666