मेरे पास एक संख्यात्मक फ़ंक्शन है f(x, y)
जो एक डबल फ़्लोटिंग पॉइंट नंबर लौटाता है जो किसी सूत्र को लागू करता है और मैं यह जांचना चाहता हूं कि यह मापदंडों के सभी संयोजन के लिए विश्लेषणात्मक अभिव्यक्तियों के खिलाफ सही है x
और y
मुझे इसमें दिलचस्पी है। गणना की तुलना करने का उचित तरीका क्या है। विश्लेषणात्मक अस्थायी बिंदु संख्या?
चलो का कहना है कि दोनों संख्याएं a
और b
। अब तक मैं यह सुनिश्चित कर रहा हूं कि निरपेक्ष ( abs(a-b) < eps
) और रिश्तेदार ( abs(a-b)/max(abs(a), abs(b)) < eps
) त्रुटियां ईपीएस से कम हों। इस तरह यह संख्या 1-20 के आस-पास के अंकों को कहे जाने पर भी संख्यात्मक अशुद्धियों को पकड़ लेगा।
हालाँकि, आज मुझे एक समस्या का पता चला, संख्यात्मक मूल्य a
और विश्लेषणात्मक मूल्य b
थे:
In [47]: a
Out[47]: 5.9781943146790832e-322
In [48]: b
Out[48]: 6.0276008792632078e-322
In [50]: abs(a-b)
Out[50]: 4.9406564584124654e-324
In [52]: abs(a-b) / max(a, b)
Out[52]: 0.0081967213114754103
तो पूर्ण त्रुटि [50] (स्पष्ट रूप से) छोटी है, लेकिन सापेक्ष त्रुटि [52] बड़ी है। इसलिए मैंने सोचा कि मेरे कार्यक्रम में एक बग है। डिबगिंग करके, मुझे एहसास हुआ, कि ये संख्याएं असामान्य हैं । इस तरह, मैंने उचित सापेक्ष तुलना करने के लिए निम्नलिखित दिनचर्या लिखी:
real(dp) elemental function rel_error(a, b) result(r)
real(dp), intent(in) :: a, b
real(dp) :: m, d
d = abs(a-b)
m = max(abs(a), abs(b))
if (d < tiny(1._dp)) then
r = 0
else
r = d / m
end if
end function
tiny(1._dp)
मेरे कंप्यूटर पर 2.22507385850720138E-308 कहां से आया। अब सब कुछ काम करता है और मुझे सापेक्ष त्रुटि के रूप में 0 मिलता है और सब ठीक है। विशेष रूप से, उपरोक्त रिश्तेदार त्रुटि [५२] गलत है, यह केवल संख्याओं की अपर्याप्त सटीकता के कारण है। क्या rel_error
फंक्शन का मेरा कार्यान्वयन सही है? क्या मुझे बस यह देखना चाहिए कि abs(a-b)
छोटे (= नाममात्र) से कम है, और 0 लौटाएं? या मुझे कुछ अन्य संयोजन की जांच करनी चाहिए, जैसे
max(abs(a), abs(b))
?
मैं सिर्फ यह जानना चाहूंगा कि "उचित" तरीका क्या है।
exp(log_gamma(m+0.5_dp) - (m+0.5_dp)*log(t)) / 2
एम = 234, टी = 2000 के लिए है। जैसे ही मैं बढ़ता हूं, यह जल्दी शून्य हो जाता हैm
। सभी मैं यह सुनिश्चित करना चाहता हूं कि मेरी संख्यात्मक दिनचर्या कम से कम 12 महत्वपूर्ण परीक्षाओं के लिए "सही" संख्या (शून्य को पूरी तरह से ठीक करने के लिए भी) लौटाए। इसलिए यदि गणना एक असामान्य संख्या देता है, तो यह बस शून्य है, और कोई समस्या नहीं होनी चाहिए। तो बस तुलनात्मक दिनचर्या को इसके खिलाफ मजबूत होना चाहिए।