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

Antworten auf die Frage(5)

Ihre Antwort auf die Frage