GeeksforGeeks

hurtig invers kvadratrod er en algoritme, der estimerer {\dfrac{1}{\kvm {}}} , den gensidige (eller multiplikative invers) af kvadratroden af et 32-bit flydende punktnummer i IEEE 754 flydende punktsformat. Beregning af gensidige firkantede rødder er nødvendig i mange applikationer, såsom vektornormalisering i videospil og bruges mest i beregninger involveret i 3D-programmering. I 3D-grafik anvendes overfladenormaler, 3-koordinatvektorer med længde 1 til at udtrykke belysning og refleksion. Der var mange overfladenormaler. Og beregning af dem indebærer normalisering af mange vektorer. Normalisering er ofte bare en fancy betegnelse for division. Pythagoras sætning beregner afstanden mellem punkter, og opdeling efter afstand hjælper med at normalisere vektorer:

denne algoritme er bedst kendt for sin implementering i 1999 i kildekoden til jordskælv III Arena spil, et førstepersonsskydespil, der gjorde kraftig brug af 3d-grafik. På det tidspunkt var det generelt beregningsmæssigt dyrt at beregne det gensidige af et flydende punktnummer, især i stor skala; den hurtige inverse kvadratrod omgåede dette trin.

algoritme:
Trin 1 : Det fortolker bitene af floating-point input som et heltal.

i = * ( long * ) &y; 

Trin 2 : Det tager den resulterende værdi og gør heltal aritmetik på det, der producerer en tilnærmelse af den værdi, vi leder efter.

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

Trin 3 : resultatet er dog ikke selve tilnærmelsen, det er et heltal, der tilfældigvis er, hvis du fortolker bitene som et flydende punktnummer, tilnærmelsen. Så koden gør det modsatte af konverteringen i trin 1 For at komme tilbage til flydende punkt:

y = * ( float * ) &i;

Trin 4: og endelig kører det en enkelt iteration af Nytons metode til at forbedre tilnærmelsen.

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

algoritmen accepterer et 32-bit flydende punktnummer som input og gemmer en halveret værdi til senere brug. Derefter behandles bitene, der repræsenterer floating-point-tallet som et 32-bit heltal, et logisk skift til højre med en bit, og resultatet trækkes fra det magiske tal 0h5f3759df. Dette er den første tilnærmelse af den inverse kvadratroden af input. Behandling af bitene igen som et flydende punktnummer, det kører en iteration af Nyton ‘ s tilnærmelsesmetode, hvilket giver en mere præcis tilnærmelse.

lad os sige, at der er et tal i eksponentform eller videnskabelig notation:
{10^8} =100 million
nu, for at finde den almindelige kvadratrod, ville vi bare dele eksponenten med 2:
{\kr{{10^8}}}={10^{8/2}}={10^4}=10000
og hvis du vil vide den inverse kvadratrod, skal du dele eksponenten med -2 for at vende tegnet:
 {\dfrac{1}{10^8}}}={10^{8/-2}}=10^{-4}=\ dfrac{1}{10000}

så konverterer koden det flydende punktnummer til et heltal. Det skifter derefter bitene med en, hvilket betyder, at eksponentbitene er divideret med 2 (når vi til sidst vender bitene tilbage til en float). Og endelig, for at negere eksponenten, trækker vi fra det magiske tal 0h5f3759df. Dette gør et par ting: det bevarer mantissen (den ikke-eksponente del, aka 5 i: 5 · 10^8), håndterer Ulige Lige eksponenter, skifter bits fra eksponenten ind i mantissen og alle mulige funky ting.

følgende kode er den hurtige inverse kvadratrod implementering fra jordskælv III Arena (nøjagtig original kommentar skrevet i jordskælv III Arena spil).

#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;
}



udgang:



+