मैं वर्ग जड़ों की गणना के लिए न्यूटन विधि के विभिन्न कार्यान्वयन के साथ प्रयोग कर रहा हूं। एल्गोरिदम को समाप्त करने का एक महत्वपूर्ण निर्णय है।कौन सा फ़्लोटिंग-पॉइंट तुलना अधिक सटीक है, और क्यों?
जाहिर है यह क्योंकि x
के बड़े मूल्यों के लिए है, जहां y
x
के वर्गमूल के मौजूदा अनुमान है y*y
और x
के बीच पूर्ण अंतर का उपयोग करने से काम नहीं चलेगा यह पर्याप्त के साथ अपने वर्गमूल प्रतिनिधित्व करने के लिए संभव नहीं हो सकता परिशुद्धता।
तो मुझे एक सापेक्ष मानदंडों का उपयोग करना चाहिए। Naively मैं इस तरह कुछ इस्तेमाल किया होगा:
static int sqrt_good_enough(float x, float y) {
return fabsf(y*y - x)/x < EPS;
}
और यह बहुत अच्छी तरह से काम करता प्रतीत होता है। लेकिन हाल ही में मैं Kernighan और Plauger के प्रोग्रामिंग शैली के तत्वों पढ़ना शुरू किया है और वे अध्याय 1 में एक ही एल्गोरिथ्म, जिसका समापन मापदंड, सी में अनुवाद के लिए एक फोरट्रान कार्यक्रम देने के लिए, होगा:
static int sqrt_good_enough(float x, float y) {
return fabsf(x/y - y) < EPS * y;
}
दोनों गणितीय रूप से समकक्ष
हैं, लेकिन क्या एक दूसरे के ऊपर एक रूप पसंद करने का कोई कारण है?
यह [scicomp] (http://scicomp.stackexchange.com) के लिए एक अच्छा सवाल है, एक बीटा स्टैक एक्सचेंज समुदाय कंप्यूटर पर संख्यात्मक गणना को लक्षित करता है। –