John Carmacks ungewöhnliche Fast-Inverse-Quadratwurzel (Quake III)
John Carmack hat eine spezielle Funktion im Quake III-Quellcode, die die Quadratwurzel eines Floats berechnet, 4x schneller als normal(float)(1.0/sqrt(x))
, darunter eine fremde0x5f3759df
Konstante. Siehe den Code unten. Kann jemand Zeile für Zeile erklären, was genau hier vor sich geht und warum dies so viel schneller als die reguläre Implementierung funktioniert?
float Q_rsqrt( float number )
{
long i;
float x2, y;
const float threehalfs = 1.5F;
x2 = number * 0.5F;
y = number;
i = * ( long * ) &y;
i = 0x5f3759df - ( i >> 1 );
y = * ( float * ) &i;
y = y * ( threehalfs - ( x2 * y * y ) );
#ifndef Q3_VM
#ifdef __linux__
assert( !isnan(y) );
#endif
#endif
return y;
}