[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