यदि आप अपनी राउंडिंग त्रुटि पर एक अच्छी बाध्यता की तलाश कर रहे हैं, तो आपको आवश्यक रूप से एअरट्रिब्यूट-प्रिसिजन लाइब्रेरी की आवश्यकता नहीं है। आप इसके बजाय रनिंग त्रुटि विश्लेषण का उपयोग कर सकते हैं।
मुझे एक अच्छा ऑनलाइन संदर्भ नहीं मिल रहा था, लेकिन यह सब निक हिघम की पुस्तक "शुद्धता और स्थिरता के संख्यात्मक एल्गोरिदम" की धारा 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 ± यू )