12 octubre 2009

Inverso de la raiz cuadrada

Probando cosas en OpenGL he encontrado esta función "mágica" que calcula el inverso de la raiz cuadrada de un número. Es decir, 1/sqrt(x) o x^(-1/2). Investigando un poco he visto que tiene artículo en la wikipedia explicando sus propiedades mágicas.

La función sacada de la WP:

float InvSqrt (float x) {
float xhalf = 0.5f*x;
int i = *(int*)&x;
i = 0x5f3759df - (i>>1);
x = *(float*)&i;
return x*(1.5f - xhalf*x*x);
}


La función recibe un número en coma flotante de 32 bits, convierte el número a entero y hace un desplazamiento de bits a la derecha (equivalente a dividir entre 2). Este número entero lo resta a la constante mágica 0x5f3759df y convierte el resultado a coma flotante de nuevo. Ahora con un par de operaciones se obtiene una aproximación para 1/sqrt(x). Un poco raro ¿no?

Parece ser que se comenzó a conocer esta función cuando publicaron el código fuente de Quake 3 como GPL, aunque ya se había utilizado anteriormente en más sitios sin publicarla.

El artículo de la wikipedia: Fast inverse square root