SORU
28 AĞUSTOS 2009, Cuma


John Carmack'in Alışılmadık Hızlı Ters Kare Kök (Quake III)

John Carmack bir şamandıra, 4x ters kare kökü daha hızlı 0x5f3759df bir garip sürekli dahil (float)(1.0/sqrt(x)) düzenli daha hesaplayan Quake III kaynak kod içinde özel bir işlevi vardır. Kodu aşağıya bakınız. Biri burada neler olduğunu ve bu düzenli uygulama daha çok çalışır neden satır satır açıklayabilir misiniz?

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

CEVAP
28 AĞUSTOS 2009, Cuma


BİLGİNİZE. Carmack bunu yazmadım. Terje Mathisen ve Gary Tarolli kısmi (ve çok mütevazi bir rakam için kredi yanı sıra bazı diğer kaynaklardan kredi almak.

Efsanevi sürekli türetilmiş olduğunu nasıl gizemini koruyor.

Gary Tarolli alıntı:

aslında yaptığı bir kayan nokta tamsayı - sürdü hesaplama anlamak için uzun bir zaman, nasıl ve neden bu, hatırlayamıyorum çalışır ayrıntılar artık.

Biraz daha iyi bir sabit, uzman bir matematikçi tarafından geliştirilen (Chris Lomont) orijinal algoritma nasıl çalıştığını bulmaya çalışıyoruz

float InvSqrt(float x)
{
  float xhalf = 0.5f*x;
  int i = *(int*)&x; // get bits for floating value
  i = 0x5f375a86- (i>>1); // gives initial guess y0
  x = *(float*)&i; // convert bits back to float
  x = x*(1.5f-xhalf*x*x); // Newton step, repeating increases accuracy
  return x;
}

Rağmen bu, onun ilk girişimi matematiksel olarak üstün sürüm kimliği var Karekök (geldi neredeyse aynı sabit) ispat değersiz biri başlangıçta tarafından geliştirilen Gary olmasına rağmen matematiksel olarak çok 'saf'. Çok mükemmel ıırc var nedenini açıklayamıyor.

Bunu Paylaş:
  • Google+
  • E-Posta
Etiketler:

YORUMLAR

SPONSOR VİDEO

Rastgele Yazarlar

  • Commander Chalkboard

    Commander Ch

    20 Ocak 2014
  • NPR

    NPR

    22 NİSAN 2006
  • Subscribe!!

    Subscribe!!

    3 EKİM 2009