আমার একটি সংখ্যাসূচক ফাংশন রয়েছে যা f(x, y)
একটি দ্বৈত ভাসমান পয়েন্ট নম্বরটি ফিরিয়ে দেয় যা কিছু সূত্র কার্যকর করে এবং আমি তা পরীক্ষা করে দেখতে চাই যে এটি প্যারামিটারগুলির সমস্ত সংমিশ্রনের জন্য বিশ্লেষণাত্মক অভিব্যক্তির বিরুদ্ধে সঠিক x
এবং y
আমি আগ্রহী the বিশ্লেষণী ভাসমান পয়েন্ট সংখ্যা?
ধরা যাক দুটি সংখ্যা a
এবং b
। এখনও অবধি আমি নিশ্চিত হয়েছি যে পরম ( abs(a-b) < eps
) পাশাপাশি আপেক্ষিক ( abs(a-b)/max(abs(a), abs(b)) < eps
) ত্রুটি উভয়ই ইপ্সের চেয়ে কম are এই সংখ্যাটি সংখ্যাসূচক ভুলগুলি ধরবে যদিও সংখ্যাগুলি 1e-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] বড় large সুতরাং আমি ভেবেছিলাম যে আমার প্রোগ্রামে একটি বাগ আছে। ডিবাগিংয়ের মাধ্যমে, আমি বুঝতে পারি যে এই সংখ্যাগুলি অস্বাভাবিক । এর মতো, যথাযথ তুলনামূলক তুলনা করতে আমি নিম্নলিখিত রুটিনটি লিখেছিলাম:
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 পাই এবং সব ঠিক আছে। বিশেষত, উপরের আপেক্ষিক ত্রুটি [52] ভুল, এটি কেবলমাত্র ডেনরমাল সংখ্যার অপর্যাপ্ত নির্ভুলতার কারণে ঘটে। আমার 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 টি উল্লেখযোগ্য সংখ্যায় ফিরে আসে। সুতরাং যদি গণনাটি একটি অস্বীকৃত নম্বর দেয় তবে তা কেবল শূন্য এবং কোনও সমস্যা হওয়া উচিত নয়। সুতরাং তুলনার রুটিনকে এর বিপরীতে শক্ত হওয়া দরকার to