[Linux-Biella] Q_rsqrt
Jumping Jack
jumpingjack a mclink.it
Mer 5 Feb 2014 15:59:11 CET
E' po' che la uso, ma ieri ho misurato (parzialmente) le prestazioni e
mi ha stupito su Arduino.
float Q_rsqrt( float number ){
long i;
float x2, y;
const float threehalfs = 1.5F;
x2 = number * 0.5F;
y = number;
i = * ( long * ) &y; // evil floating
point bit level hacking
i = 0x5f3759df - ( i >> 1 ); // what the fuck?
y = * ( float * ) &i;
y = y * ( threehalfs - ( x2 * y * y ) ); // 1st iteration
y = y * ( threehalfs - ( x2 * y * y ) ); // 2nd iteration,
this can be removed (not true)
return y;
}
Si tratta del calcolo della radice quadrata inversa approssimativa
utilizzata in quake 3, l'algoritmo comunque risulta orgininariamente
usato sui Silicon Graphics molti anni prima.
La seconda iterazione è marcata come rimovibile, ma usata non è così,
perchè in certi casi il risultato è proprio sbagliato non solo meno
preciso. (la dicitura "not true" l'ho aggiunta io)
Comunque la funzione impiega meno di 20us su Arduino a 16Mhz, non ho il
valore preciso ma credo sia vicino ai 12us (circa 200 clock).
JJ
Maggiori informazioni sulla lista
Linux