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
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.
Bir tamsayı'in kare kökü belirlem...
Döngüler çok ters...daha hızlı?...
'/veri birleştirme katılmak için ...
Hızlı performans: dizileri sıralama...
açısal-tekrar ng ters...