ग्रेग हेविल और इलिडान 4 ने उत्कृष्ट गणितीय स्पष्टीकरण के साथ एक लिंक दिया। मैं इसे उन लोगों के लिए यहाँ प्रस्तुत करने का प्रयास करूँगा जो विवरण में बहुत अधिक नहीं जाना चाहते हैं।
किसी भी गणितीय कार्य, कुछ अपवादों के साथ, एक बहुपद योग द्वारा दर्शाया जा सकता है:
y = f(x)
में तब्दील किया जा सकता है :
y = a0 + a1*x + a2*(x^2) + a3*(x^3) + a4*(x^4) + ...
जहाँ a0, a1, a2, ... स्थिरांक हैं । समस्या यह है कि कई कार्यों के लिए, वर्गमूल की तरह, सटीक मूल्य के लिए इस राशि के सदस्यों की अनंत संख्या है, यह कुछ ^ ^ n पर समाप्त नहीं होती है । लेकिन, अगर हम कुछ x ^ n पर रुकते हैं तब भी हमारे पास कुछ सटीक करने के लिए एक परिणाम होगा।
इसलिए, यदि हमारे पास:
y = 1/sqrt(x)
इस विशेष मामले में उन्होंने दूसरे बहुपद सदस्यों को दूसरे से पीछे छोड़ने का फैसला किया, शायद गणना गति के कारण:
y = a0 + a1*x + [...discarded...]
और कार्य अब y के लिए a0 और a1 की गणना करने के लिए नीचे आया है ताकि सटीक मान से कम से कम अंतर हो। उन्होंने गणना की है कि सबसे उपयुक्त मूल्य हैं:
a0 = 0x5f375a86
a1 = -0.5
इसलिए जब आप इसे समीकरण में डालते हैं तो आपको मिलता है:
y = 0x5f375a86 - 0.5*x
जो कोड में दिखाई देने वाली रेखा के समान है:
i = 0x5f375a86 - (i >> 1);
संपादित करें: वास्तव में यहाँ y = 0x5f375a86 - 0.5*x
समान नहीं है i = 0x5f375a86 - (i >> 1);
क्योंकि फ्लोटिंग शिफ्टिंग पूर्णांक के रूप में न केवल दो से विभाजित होती है, बल्कि एक्सपोनेंट को भी दो से विभाजित करती है और कुछ अन्य कलाकृतियों का कारण बनती है, लेकिन यह अभी भी कुछ गुणांक a0, a1, a2 की गणना करने के लिए नीचे आती है ...
इस बिंदु पर उन्हें पता चला है कि इस परिणाम की सटीकता उद्देश्य के लिए पर्याप्त नहीं है। इसलिए उन्होंने अतिरिक्त सटीकता को बेहतर बनाने के लिए न्यूटन के पुनरावृत्ति का केवल एक कदम उठाया:
x = x * (1.5f - xhalf * x * x)
वे एक लूप में कुछ और पुनरावृत्तियों को कर सकते थे, प्रत्येक एक परिणाम में सुधार, जब तक आवश्यक सटीकता पूरी नहीं हो जाती। यह वास्तव में सीपीयू / एफपीयू में कैसे काम करता है! लेकिन ऐसा लगता है कि केवल एक पुनरावृत्ति ही पर्याप्त थी, जो गति के लिए एक आशीर्वाद भी थी। सीपीयू / एफपीयू फ्लोटिंग पॉइंट नंबर के लिए सटीकता तक पहुंचने के लिए कई पुनरावृत्तियों को करता है जिसमें परिणाम संग्रहीत होता है और इसमें अधिक सामान्य एल्गोरिदम होता है जो सभी मामलों के लिए काम करता है।
तो संक्षेप में, उन्होंने क्या किया:
CPU / FPU के समान एल्गोरिथ्म का उपयोग (लगभग), 1 / sqrt (x) के विशेष मामले के लिए प्रारंभिक स्थितियों में सुधार का फायदा उठाते हैं और सटीक CPU / FPU के लिए सभी तरह की गणना नहीं करते हैं, लेकिन पहले बंद कर देंगे, इस प्रकार गणना गति में प्राप्त करना।