Greg Hewgill ve IllidanS4 mükemmel matematiksel açıklamalarla bir bağlantı kurdu. Ayrıntılara çok fazla girmek istemeyenler için burada özetlemeye çalışacağım.
Bazı istisnalar dışında herhangi bir matematiksel fonksiyon, bir polinom toplamı ile temsil edilebilir:
y = f(x)
edilebilir aynen dönüştü:
y = a0 + a1*x + a2*(x^2) + a3*(x^3) + a4*(x^4) + ...
A0, a1, a2, ... sabittir . Sorun şu ki, karekök gibi pek çok işlev için, tam değer için bu toplamın sonsuz sayıda üyesi vardır, bazı x ^ n'de bitmez . Ancak, x ^ n'de durursak, yine de kesinliğe kadar bir sonuca sahip oluruz.
Yani, eğer sahipsek:
y = 1/sqrt(x)
Bu özel durumda, muhtemelen hesaplama hızı nedeniyle, saniyenin üzerindeki tüm polinom üyelerini atmaya karar verdiler:
y = a0 + a1*x + [...discarded...]
Ve şimdi, y'nin kesin değerden en az farka sahip olması için a0 ve a1'i hesaplamak için görev geldi. En uygun değerlerin şunlar olduğunu hesaplamışlardır:
a0 = 0x5f375a86
a1 = -0.5
Yani bunu denkleme koyduğunuzda şunu elde edersiniz:
y = 0x5f375a86 - 0.5*x
Kodda gördüğünüz satırla aynı olan:
i = 0x5f375a86 - (i >> 1);
Düzenleme: Aslında burada y = 0x5f375a86 - 0.5*x
aynı şey değildir i = 0x5f375a86 - (i >> 1);
ama aynı zamanda bölme işlemlerini üs ikişer ikişer tamsayı olarak sadece böler şamandıra kayması beri ve diğer bazı eserler neden olur, ancak hala bazı katsayıları, a2 A1 A0 hesaplama aşağı gelir ....
Bu noktada, bu sonucun kesinliğinin amaç için yeterli olmadığını anladılar. Böylece sonuç doğruluğunu iyileştirmek için ayrıca Newton'un yinelemesinin yalnızca bir adımını yaptılar:
x = x * (1.5f - xhalf * x * x)
Gerekli doğruluk sağlanana kadar, her biri sonucu iyileştiren bir döngüde daha fazla yineleme yapabilirlerdi. CPU / FPU'da tam olarak böyle çalışır! Ancak görünen o ki, tek bir yineleme yeterliydi, bu da hız için bir nimetti. CPU / FPU, sonucun saklandığı kayan nokta sayısının doğruluğuna ulaşmak için gerektiği kadar yineleme yapar ve tüm durumlar için çalışan daha genel bir algoritmaya sahiptir.
Kısacası yaptıkları şuydu:
CPU / FPU ile (neredeyse) aynı algoritmayı kullanın, 1 / sqrt (x) özel durumu için başlangıç koşullarının iyileştirilmesinden yararlanın ve CPU / FPU'nun gideceği kesinliğe kadar tüm yolu hesaplamayın, ancak daha önce durun, bu nedenle hesaplama hızında kazanç.