[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