GeeksforGeeks

La raíz cuadrada inversa rápida es un algoritmo que estima  {\dfrac{1}{\sqrt{x}}}, el inverso recíproco (o inverso multiplicativo) de la raíz cuadrada de un número de coma flotante de 32 bits x en formato de coma flotante IEEE 754. La computación de raíces cuadradas recíprocas es necesaria en muchas aplicaciones, como la normalización de vectores en videojuegos y se usa principalmente en cálculos involucrados en la programación 3D. En gráficos 3D, se utilizan normales de superficie, vectores de 3 coordenadas de longitud 1, para expresar la iluminación y la reflexión. Había un montón de normales de superficie. Y calcularlos implica normalizar muchos vectores. Normalizar a menudo es solo un término elegante para división. El teorema de Pitágoras calcula la distancia entre puntos, y la división por distancia ayuda a normalizar los vectores:

Este algoritmo es mejor conocido por su implementación en 1999 en el código fuente del juego Quake III Arena, un videojuego de disparos en primera persona que hizo un uso intensivo de gráficos 3D. En ese momento, era generalmente costoso computacionalmente calcular el recíproco de un número de coma flotante, especialmente a gran escala; la rápida raíz cuadrada inversa omitió este paso.

Algoritmo:
Paso 1: reinterpreta los bits de la entrada de punto flotante como un entero.

i = * ( long * ) &y; 

Paso 2: Toma el valor resultante y hace aritmética de enteros en él, lo que produce una aproximación del valor que estamos buscando.

i = 0x5f3759df - ( i >> 1 );

Paso 3: Sin embargo, el resultado no es la aproximación en sí, es un entero que resulta ser, si reinterpreta los bits como un número de punto flotante, la aproximación. Por lo tanto, el código hace el reverso de la conversión en el paso 1 para volver al punto flotante:

y = * ( float * ) &i;

Paso 4: Y finalmente ejecuta una sola iteración del método de Newton para mejorar la aproximación.

y = y * ( threehalfs - ( x2 * y * y ) ); //threehalfs = 1.5F;

El algoritmo acepta un número de coma flotante de 32 bits como entrada y almacena un valor reducido a la mitad para su uso posterior. Luego, tratando los bits que representan el número de punto flotante como un entero de 32 bits, se realiza un desplazamiento lógico a la derecha por un bit y el resultado se resta del número mágico 0x5F3759DF. Esta es la primera aproximación de la raíz cuadrada inversa de la entrada. Tratando los bits de nuevo como un número de punto flotante, ejecuta una iteración del método de aproximación de Newton, produciendo una aproximación más precisa.

Digamos que hay un número en forma de exponente o notación científica:
{10^8} =100 million
Ahora, para encontrar la raíz cuadrada regular, dividiríamos el exponente por 2:
{\sqrt{{10^8}}}={10^{8/2}}={10^4}=10000
Y si, quieres saber la raíz cuadrada inversa, divide el exponente por -2 para voltear el signo:
 {\dfrac {1} {\sqrt{10^8}}}={10^{8/-2}}=10^{-4}=\dfrac{1}{10000}

Por lo tanto, el código convierte el número de coma flotante en un entero. Luego cambia los bits por uno, lo que significa que los bits exponentes se dividen por 2 (cuando finalmente volvemos a convertir los bits en un flotador). Y por último, para negar el exponente, restamos del número mágico 0x5f3759df. Esto hace algunas cosas: conserva la mantisa (la parte no exponente, también conocida como 5 en: 5 · 10^8), maneja exponentes impares-pares, cambiando bits del exponente a la mantisa y todo tipo de cosas funky.

El siguiente código es la rápida implementación de raíz cuadrada inversa de Quake III Arena (comentario original exacto escrito en el juego Quake III Arena).

#include<bits/stdc++.h>
using namespace std;
float inverse_rsqrt( float number )
{
const float threehalfs = 1.5F;
float x2 = number * 0.5F;
float y = number;
long i = * ( long * ) &y;
i = 0x5f3759df - ( i >> 1 );
y = * ( float * ) &i;
y = y * ( threehalfs - ( x2 * y * y ) );
return y;
}
int main(){
int n = 256;
float f = inverse_rsqrt(n);
cout << f << endl;
return 0;
}



Salida:



+