GeeksforGeeks

raiz quadrada inversa rápida é um algoritmo que estima  {\dfrac{1}{\sqrt{x}}}}}, o recíproco (ou inverso multiplicativo) da raiz quadrada de um número de ponto flutuante de 32 bits x no formato IEEE 754 de ponto flutuante. Computing reciprocal square roots is necessary in many applications, such as vector normalization in video games and is mostly used in calculations involved in 3D programming. Em gráficos 3D, padrões de superfície, vetores de 3 coordenadas de comprimento 1 é usado, para expressar iluminação e reflexão. Havia muitos normais na superfície. E calculá-los envolve normalizar muitos vetores. Normalizar é muitas vezes apenas um termo chique para divisão. O teorema de Pitágoras calcula a distância entre pontos, e dividir por distância ajuda a normalizar vetores:

este algoritmo é mais conhecido por sua implementação em 1999 no código fonte do jogo Quake III Arena, um jogo de tiro em primeira pessoa que fez uso pesado de gráficos 3D. Naquela época, era geralmente computacionalmente caro calcular a reciprocidade de um número de Ponto Flutuante, Especialmente em grande escala. ; a raiz quadrada inversa rápida contornou este passo.

Algorithm:
Step 1: It reinterprets the bits of the floating-point input as an integer.

i = * ( long * ) &y; 

Passo 2: ele toma o valor resultante e faz aritmética inteira sobre ele que produz uma aproximação do valor que estamos procurando.

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

Passo 3: o resultado não é a aproximação em si, porém, é um inteiro que acontece ser, se você reinterpretar os bits como um número de ponto flutuante, a aproximação. Então o código faz o inverso da conversão no Passo 1 para voltar a ponto flutuante:

y = * ( float * ) &i;

Passo 4: e finalmente executa uma única iteração do método de Newton para melhorar a aproximação.

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

the algorithm accepts a 32-bit floating-point number as the input and stores a halved value for later use. Então, tratando os bits representando o número de ponto flutuante como um inteiro de 32-bit, um deslocamento lógico para a direita por um bit é realizado e o resultado subtraído do número mágico 0x5F3759DF. Esta é a primeira aproximação da raiz quadrada inversa da entrada. Tratando os bits novamente como um número de ponto flutuante, ele executa uma iteração do método de aproximação de Newton, produzindo uma aproximação mais precisa.

Vamos dizer que há um número é o expoente formulário ou notação científica:
{10^8} =100 milhões de
Agora, para encontrar o regular raiz quadrada, tínhamos apenas dividir o expoente por 2:
{\sqrt{{10^8}}}={10^{8/2}}={10^4}=10000
E se, quer saber o inverso da raiz quadrada, dividir o expoente por -2 para inverter o sinal:
{\dfrac{1}{\sqrt{10^8}}}={10^{8/-2}}=10^{-4}=\dfrac{1}{10000}

Assim, o código converte o número do ponto flutuante para um inteiro. Ele então muda os bits por um, o que significa que os bits exponentes são divididos por 2 (quando eventualmente transformamos os bits de volta em um float). E por último, para negar o expoente, subtraímos do número mágico 0x5f3759df. Isto faz algumas coisas: preserva a mantissa (a parte não-expoente, aka 5 in: 5 · 10^8), lida com expoentes ímpares, transferindo bits do expoente para a mantissa, e todo o tipo de coisas estranhas.

o seguinte código é a implementação rápida de raiz quadrada inversa do Quake III Arena (comentário original Exato escrito no jogo 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;
}



resultado:



+