जब आप स्क्वायर रूट की गणना करने के लिए न्यूटन-रैफसन का उपयोग करते हैं, तो आप वास्तव में पारस्परिक वर्ग रूट खोजने के लिए पुनरावृत्ति का उपयोग करना चाहते हैं (जिसके बाद आप केवल इनपुट द्वारा गुणा कर सकते हैं - गोल करने के लिए कुछ देखभाल के साथ - वर्ग रूट का उत्पादन)।
अधिक सटीक: हम फ़ंक्शन f(x) = x^-2 - n
का उपयोग करते हैं। जाहिर है, अगर f(x) = 0
, तो x = 1/sqrt(n)
।यह न्यूटन यात्रा को जन्म देता है:
x_(i+1) = x_i - f(x_i)/f'(x_i)
= x_i - (x_i^-2 - n)/(-2x_i^-3)
= x_i + (x_i - nx_i^3)/2
= x_i*(3/2 - 1/2 nx_i^2)
ध्यान दें कि (वर्गमूल के लिए यात्रा के विपरीत), पारस्परिक वर्गमूल के लिए इस यात्रा नहीं डिवीजनों शामिल है, तो यह आम तौर पर और अधिक कुशल है।
मैंने आपके प्रश्न में विभाजित किया है कि आपको पहिया को फिर से आविष्कार करने के बजाय मौजूदा सॉफ्ट-फ्लोट पुस्तकालयों को देखना चाहिए। वह सलाह यहां भी लागू होती है। यह फ़ंक्शन पहले से ही मौजूदा सॉफ्ट-फ्लोट पुस्तकालयों में लागू किया जा चुका है।
संपादित करें: sqrt(612)
: प्रश्नकर्ता अभी भी भ्रमित हो रहा है, तो चलो एक उदाहरण भी काम करें। 612
1.1953125 x 2^9
(या b1.0011001 x 2^9
है, यदि आप बाइनरी पसंद करते हैं)। f * 2^(2m)
के रूप में इनपुट लिखने के लिए एक्सपोनेंट (9) के भी हिस्से को खींचें, जहां m
एक पूर्णांक है और f
सीमा [1,4) में है। फिर हम होगा:
sqrt(n) = sqrt(f * 2^2m) = sqrt(f)*2^m
हमारे उदाहरण के लिए इस कमी को लागू करने देता है f = 1.1953125 * 2 = 2.390625
(b10.011001
) और m = 4
। अब 0.5 के शुरुआती अनुमान का उपयोग करके x = 1/sqrt(f)
खोजने के लिए न्यूटन-रैफसन पुनरावृत्ति करें (जैसा कि मैंने एक टिप्पणी में देखा है, यह अनुमान सभी f
के लिए अभिसरण करता है, लेकिन आप प्रारंभिक अनुमान के रूप में रैखिक अनुमान का उपयोग करके काफी बेहतर कर सकते हैं):
x_0 = 0.5
x_1 = x_0*(3/2 - 1/2 * 2.390625 * x_0^2)
= 0.6005859...
x_2 = x_1*(3/2 - 1/2 * 2.390625 * x_1^2)
= 0.6419342...
x_3 = 0.6467077...
x_4 = 0.6467616...
तो प्रारंभिक अनुमान के साथ भी (अपेक्षाकृत खराब), हम 1/sqrt(f) = 0.6467616600226026
के वास्तविक मूल्य पर तेजी से अभिसरण प्राप्त करते हैं। जाहिर है sqrt (612) = २४.७३८६३३ ...
, अगर आप सही राउंडिंग चाहते हैं, सावधान विश्लेषण की जरूरत है सुनिश्चित करें कि आप:
अब हम बस अंतिम परिणाम को इकट्ठा:
sqrt(f) = x_n * f = 1.5461646...
sqrt(n) = sqrt(f) * 2^m = 24.738633...
और जाँच गणना के प्रत्येक चरण में पर्याप्त सटीकता लेते हैं। इसके लिए सावधान बहीखाता की आवश्यकता है, लेकिन यह रॉकेट विज्ञान नहीं है। आप बस सावधानीपूर्वक त्रुटि सीमा रखते हैं और उन्हें एल्गोरिदम के माध्यम से प्रचारित करते हैं।
यदि आप स्पष्ट रूप से अवशिष्ट की जांच किए बिना गोल करने को सही करना चाहते हैं, तो आपको 2p + 2 बिट्स (जहां पी स्रोत और गंतव्य प्रकार की सटीकता है) की सटीकता के लिए sqrt (f) की गणना करने की आवश्यकता है। हालांकि, आप एसकर्ट (एफ) को पी बिट्स, स्क्वायर जो मूल्य से थोड़ा अधिक कंप्यूटिंग करने की रणनीति भी ले सकते हैं, और अगर आवश्यक हो तो पीछे की ओर एक को समायोजित कर सकते हैं (जो अक्सर सस्ता होता है)।
वर्ग अच्छा है कि यह एक यूनरी फ़ंक्शन है, जो कमोडिटी हार्डवेयर पर एकल-सटीक व्यवहार्यता के लिए संपूर्ण परीक्षण करता है।
आप ओएस एक्स सॉफ्ट-फ्लोट sqrtf
opensource.apple.com पर फ़ंक्शन पा सकते हैं, जो ऊपर वर्णित एल्गोरिदम का उपयोग करता है (मैंने लिखा है, जैसा कि होता है)। यह एपीएसएल के तहत लाइसेंस प्राप्त है, जो आपकी आवश्यकताओं के लिए उपयुक्त हो सकता है या नहीं।
हां, न्यूटन-रैफसन विधि वर्ग की जड़ें खोजने के लिए तेज़ है। –
math.stackexchange के लिए अधिक उपयुक्त –
मैं बस पूछ रहा था; कठोर होने की कोई जरूरत नहीं है। –