sto sviluppando per una piattaforma senza una libreria matematica, quindi ho bisogno di costruire i miei propri strumenti. Il mio attuale modo di ottenere la frazione è quello di convertire il galleggiante a punto fisso (moltiplicare con (float) 0xFFFF, gettato a int), ottenere solo la parte inferiore (maschera con 0xFFFF) e riconvertirlo in un galleggiante di nuovo.Ottenere la parte frazionaria di un galleggiante senza utilizzare modf()
Tuttavia, l'imprecisione mi sta uccidendo. Sto usando le mie funzioni Frac() e InvFrac() per disegnare una linea anti-alias. Usando modf
ottengo una linea perfettamente liscia. Con il mio metodo, i pixel iniziano a saltare a causa della perdita di precisione.
Questo è il mio codice:
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;
}
Grazie in anticipo!
Non dovrebbe fp_amount essere 0x10000 invece di 0xFFFF? –
Santa merda. Fallo una risposta così posso accettarlo! Hai appena risolto il mio intero problema di precisione! – knight666