2012-07-25 12 views
9

Encontré en la red Fast Inverse Square Root en http://en.wikipedia.org/wiki/Fast_inverse_square_root. ¿Funciona correctamente en x64? ¿Alguien lo usó y realizó una prueba seria?Fast Inverse Square Root en x64

+10

Como nota al margen, esos trucos son desde momentos en que el punto flotante no fue compatible o lento. Aunque una raíz y división cuadradas normales todavía pueden considerarse lentas, hoy en día también tienes SSE (especialmente en x64) y su propia raíz cuadrada inversa (intrínseca: '_mm_rsqrt_ss/ps') es probablemente más rápida y más precisa que el truco de Carmack. Por supuesto, solo funciona para flotadores de 32 bits, pero de todos modos no se usan dobles para valores aproximados inexactos. –

Respuesta

17

Originalmente Fast Inverse Square Root se escribió para un flotador de 32 bits, por lo que mientras opere en representación de coma flotante IEEE-754, no hay manera de que la arquitectura x64 afecte el resultado.

Tenga en cuenta que para el punto flotante "doble" de precisión (64 bits), debe usar otra constante:

... el "número mágico" de 64 bits IEEE754 tipo de dos plazas ... se demostró ser exactamente 0x5fe6eb50c7b537a9

3

Aquí es una implementación de doble precisión flota:

#include <cstdint> 

double invsqrtQuake(double number) 
    { 
     double y = number; 
     double x2 = y * 0.5; 
     std::int64_t i = *(std::int64_t *) &y; 
     // The magic number is for doubles is from https://cs.uwaterloo.ca/~m32rober/rsqrt.pdf 
     i = 0x5fe6eb50c7b537a9 - (i >> 1); 
     y = *(double *) &i; 
     y = y * (1.5 - (x2 * y * y)); // 1st iteration 
     //  y = y * (1.5 - (x2 * y * y)); // 2nd iteration, this can be removed 
     return y; 
    } 

me hicieron algunas pruebas y parece funcionar bien