मुझे पता है कि यह होमवर्क असाइनमेंट की तरह लगता है, लेकिन ऐसा नहीं है। हाल ही में मुझे कुछ गणितीय परिचालनों जैसे कि साइन, स्क्वायर रूट इत्यादि करने के लिए इस्तेमाल किए गए एल्गोरिदम में दिलचस्पी है। फिलहाल, मैं सी # में कंप्यूटिंग स्क्वायर जड़ों की Babylonian method लिखने की कोशिश कर रहा हूं।मैं इस वर्ग रूट विधि को कैसे सुधार सकता हूं?
public static double SquareRoot(double x) {
if (x == 0) return 0;
double r = x/2; // this is inefficient, but I can't find a better way
// to get a close estimate for the starting value of r
double last = 0;
int maxIters = 100;
for (int i = 0; i < maxIters; i++) {
r = (r + x/r)/2;
if (r == last)
break;
last = r;
}
return r;
}
यह सिर्फ ठीक काम करता है और .नेट फ्रेमवर्क के Math.Sqrt के रूप में ठीक उसी जवाब का उत्पादन() विधि हर बार:
अब तक, मैं इस किया है। जैसा कि आप शायद अनुमान लगा सकते हैं, हालांकि, यह मूल विधि (लगभग 800 टिकों से) धीमा है। मुझे पता है कि यह विशेष विधि देशी विधि से कभी तेज नहीं होगी, लेकिन मैं सोच रहा हूं कि क्या कोई अनुकूलन है जो मैं कर सकता हूं।
एकमात्र ऑप्टिमाइज़ेशन मैंने तुरंत देखा था कि गणना 100 गुना चल जाएगी, जवाब देने के बाद भी (जिस बिंदु पर, आर हमेशा एक ही मूल्य होगा)। इसलिए, मैंने यह देखने के लिए एक त्वरित जांच जोड़ा कि क्या नया गणना मूल्य पहले गणना मूल्य के समान है और लूप से बाहर निकलता है। दुर्भाग्यवश, इसने गति में बहुत अंतर नहीं बनाया, लेकिन ऐसा करने के लिए सही काम की तरह लग रहा था।
और इससे पहले कि आप कहें "क्यों न केवल Math.Sqrt() का उपयोग करें?" ... मैं इसे सीखने के अभ्यास के रूप में कर रहा हूं और वास्तव में किसी भी उत्पादन कोड में इस विधि का उपयोग करने का इरादा नहीं रखता हूं।
युगल की तुलना करना कभी अच्छा विचार नहीं है। – Carra
टाइपो: एस/"न्यूटन की विधि"/"बेबीलोन विधि" - न्यूटन की विधि (चाहे वह अभिसरण पर कुछ कैविएट्स के साथ) –
अभिसरण की गति के लिए ठीक काम करता है जड़ से बड़ा 2^52 * ईपीएस है तो यह अच्छी तरह से संभव है वह रूट के चारों ओर घूमता है और वह गणित। एबीएस (आर-आखिरी) ईपीएस से कभी छोटा नहीं होता है। इसलिए, जबकि यह प्रस्ताव मूल कार्यक्रम की तुलना में थोड़ा बेहतर है, फिर भी यह आवश्यकतानुसार कई और पुनरावृत्तियों का कारण बन सकता है। – Accipitridae