यदि आप अपनी राउंडिंग त्रुटि पर एक अच्छी बाध्यता की तलाश कर रहे हैं, तो आपको आवश्यक रूप से एअरट्रिब्यूट-प्रिसिजन लाइब्रेरी की आवश्यकता नहीं है। आप इसके बजाय रनिंग त्रुटि विश्लेषण का उपयोग कर सकते हैं।
मुझे एक अच्छा ऑनलाइन संदर्भ नहीं मिल रहा था, लेकिन यह सब निक हिघम की पुस्तक "शुद्धता और स्थिरता के संख्यात्मक एल्गोरिदम" की धारा 3.3 में वर्णित है। विचार काफी सरल है:
- अपने कोड को फिर से कारक करें ताकि आपके पास प्रत्येक पंक्ति पर एक एकल अंकगणितीय ऑपरेशन का एक असाइनमेंट हो।
- प्रत्येक चर के लिए, उदाहरण के लिए
x, एक चर बनाते हैं x_errजो xएक स्थिरांक को दिए जाने पर शून्य से प्रारंभ होता है।
- प्रत्येक ऑपरेशन के लिए, उदाहरण के लिए
z = x * y, z_errफ़्लोटिंग-पॉइंट अंकगणित के मानक मॉडल और परिणामस्वरूप zऔर चलने वाली त्रुटियों का उपयोग करके चर को अपडेट करें x_errऔर y_err।
- आपके फ़ंक्शन का रिटर्न मान तब भी संबंधित
_errमान होना चाहिए । यह आपकी कुल राउंडऑफ़ त्रुटि पर एक डेटा-निर्भर बाउंड है।
मुश्किल हिस्सा चरण 3 है। सबसे सरल अंकगणितीय कार्यों के लिए, आप निम्नलिखित नियमों का उपयोग कर सकते हैं:
z = x + y -> z_err = u*abs(z) + x_err + y_err
z = x - y -> z_err = u*abs(z) + x_err + y_err
z = x * y -> z_err = u*abs(z) + x_err*abs(y) + y_err*abs(x)
z = x / y -> z_err = u*abs(z) + (x_err*abs(y) + y_err*abs(x))/y^2
z = sqrt(x) -> z_err = u*abs(z) + x_err/(2*abs(z))
जहां u = eps/2इकाई राउंडऑफ है। हां, नियम +और -समान हैं। op(x)लागू किए गए परिणाम के टेलर श्रृंखला विस्तार का उपयोग करके किसी भी अन्य ऑपरेशन के नियमों को आसानी से निकाला जा सकता है op(x + x_err)। या आप गुगली करने की कोशिश कर सकते हैं। या निक हिघम की किताब का उपयोग कर रहे हैं।
एक उदाहरण के रूप में, निम्नलिखित मतलाब / ऑक्टेव कोड पर विचार करें जो हॉर्नर योजना का उपयोग करते हुए aएक बिंदु पर गुणांक में एक बहुपद का मूल्यांकन करता है x:
function s = horner ( a , x )
s = a(end);
for k=length(a)-1:-1:1
s = a(k) + x*s;
end
पहले चरण के लिए, हम दो ऑपरेशनों को विभाजित करते हैं s = a(k) + x*s:
function s = horner ( a , x )
s = a(end);
for k=length(a)-1:-1:1
z = x*s;
s = a(k) + z;
end
हम तब _errचरों का परिचय देते हैं। नोट आदानों कि aऔर xग्रहण कर रहे हैं सटीक होना करने के लिए, लेकिन हम अभी भी रूप में अच्छी तरह उपयोगकर्ता के लिए संगत मानों पारित करने के लिए आवश्यक बना सकते हैं a_errऔर x_err:
function [ s , s_err ] = horner ( a , x )
s = a(end);
s_err = 0;
for k=length(a)-1:-1:1
z = x*s;
z_err = ...;
s = a(k) + z;
s_err = ...;
end
अंत में, हम त्रुटि के नियम प्राप्त करने के लिए ऊपर वर्णित नियम लागू करते हैं:
function [ s , s_err ] = horner ( a , x )
u = eps/2;
s = a(end);
s_err = 0;
for k=length(a)-1:-1:1
z = x*s;
z_err = u*abs(z) + s_err*abs(x);
s = a(k) + z;
s_err = u*abs(s) + z_err;
end
ध्यान दें कि चूंकि हमारे पास कोई a_errया नहीं है x_err, उदाहरण के लिए, उन्हें शून्य माना जाता है, संबंधित शब्दों को केवल त्रुटि अभिव्यक्तियों में अनदेखा किया जाता है।
Et voilà! अब हमारे पास एक हॉर्नर स्कीम है जो डेटा-निर्भर त्रुटि अनुमान (नोट: यह त्रुटि पर एक ऊपरी बाध्य है ) परिणाम के साथ देता है।
एक साइड नोट के रूप में, चूंकि आप C ++ का उपयोग कर रहे हैं, आप फ्लोटिंग-पॉइंट वैल्यूज़ के लिए अपनी खुद की क्लास बनाने पर विचार कर सकते हैं, जो _errशब्द के चारों ओर वहन करती है और ऊपर वर्णित इन मानों को अपडेट करने के लिए सभी अंकगणितीय ऑपरेशनों को ओवरलोड करती है। बड़े कोड के लिए, यह आसान, यद्यपि कम्प्यूटेशनल रूप से कम कुशल, मार्ग हो सकता है। ऐसा कहने के बाद, आप इस तरह की कक्षा ऑनलाइन पा सकते हैं। एक त्वरित Google खोज ने मुझे यह लिंक दिया ।
±uएक्स ( 1 ± यू )