exp(x)=∑n=0∞xnn!=1+x+12x2+…
|x|≪1exp(x)≈1+xexp(x)−1|x|≪1
এটি সহজেই পাইথনে প্রদর্শিত হতে পারে:
>>> from math import (exp, expm1)
>>> x = 1e-8
>>> exp(x) - 1
9.99999993922529e-09
>>> expm1(x)
1.0000000050000001e-08
>>> x = 1e-22
>>> exp(x) - 1
0.0
>>> expm1(x)
1e-22
exp(10−8)−1exp(10−22)−1=0.000000010000000050000000166666667083333334166666668…=0.000000000000000000000100000000000000000000005000000…
সাধারণভাবে একটি "সঠিক" বাস্তবায়ন exp
এবং expm1
1ULP (অর্থাৎ শেষ স্থানের এক ইউনিট) এর চেয়ে বেশি হওয়া উচিত না। যাইহোক, এই নির্ভুলতা অর্জনের পরে "ধীর" কোডের ফলাফল হয়, কখনও কখনও দ্রুত, কম নির্ভুল বাস্তবায়ন পাওয়া যায়। উদাহরণস্বরূপ CUDA এ আমাদের আছে expf
এবং expm1f
, যেখানে f
দ্রুত দাঁড়িয়ে আছে । মতে CUDA সি নির্দেশিকা প্রোগ্রামিং, অ্যাপ্লিকেশন। ডিexpf
2ULP এর একটি ত্রুটি রয়েছে।
আপনি যদি কয়েকটি ইউএলপিএসের ক্রমের ত্রুটিগুলি সম্পর্কে চিন্তা না করেন তবে সাধারণত এক্সফোনেনশিয়াল ফাংশনের বিভিন্ন বাস্তবায়ন সমতুল্য, তবে সাবধান হন যে বাগগুলি কোথাও লুকিয়ে থাকতে পারে ... ( পেন্টিয়াম এফডিএল বাগটি মনে আছে ?)
expm1
exp(x)−1xxexpm1
>>> exp(200)-1 == exp(200) == expm1(200)
True
1exp(200)
log
log1p
log(1+x)≈x|x|≪1
log1p
কিছু ব্যাখ্যা করলে উত্তর দেওয়া সহজ হবে (বিশেষত এটি কীভাবে বাস্তবায়িত হয়, তাই আমাদের অনুমান করার দরকার নেই)।