লগ 1 পি এবং এক্সপ্যাম 1 কখন ব্যবহার করা উচিত?


30

আমার কাছে একটি সাধারণ প্রশ্ন রয়েছে যা গুগলের কাছে সত্যই কঠিন ( ভাসমান-পয়েন্ট এরিথমেটিক পেপার সম্পর্কে প্রতিটি কম্পিউটার বিজ্ঞানীর কী জানা উচিত ) তাত্ত্বিক ছাড়াও ।

যখন যেমন ফাংশন উচিত log1pবা expm1পরিবর্তে ব্যবহার করা যেতে logএবং exp? এগুলি কখন ব্যবহার করা উচিত নয়? এই ফাংশনগুলির বিভিন্ন প্রয়োগগুলি কীভাবে তাদের ব্যবহারের ক্ষেত্রে পৃথক হয়?


2
Scicomp.SE এ স্বাগতম! এটি একটি খুব যুক্তিসঙ্গত প্রশ্ন, তবে আপনি উল্লেখ করছেন এমন log1p কিছু ব্যাখ্যা করলে উত্তর দেওয়া সহজ হবে (বিশেষত এটি কীভাবে বাস্তবায়িত হয়, তাই আমাদের অনুমান করার দরকার নেই)।
ক্রিশ্চান ক্ল্যাসন

4
বাস্তব-মূল্যবান যুক্তিগুলির জন্য, x ছোট হলে লগ 1 পি এবং এক্সপ্যাম 1 ( এক্স ) ব্যবহার করা উচিত , উদাহরণস্বরূপ, যখন ভাসমান পয়েন্ট যথার্থতায় 1 + x = 1 হয়। উদাহরণস্বরূপ, ডকস.স্কিপি.আর . / ডক / নম্পি / রেফারেন্স / জেনারেটেড / এনম্পি.এক্স.এম.এইচটিএমএল এবং ডকসস.সি.পি..আর.ডোক / নম্পি / রেফারেন্স / জেনারেটেড / নম্পি.লগ.পি.এইচ.টি.এমটিএল দেখুন(x)(x)x1+x=1
GoHokies

@ ক্রিশ্চিয়ান ক্লাসন ধন্যবাদ, আমি বেশিরভাগ সি ++ এসডি বা আর এর দিকে উল্লেখ করছি, তবে আপনি জিজ্ঞাসা করার সাথে সাথে আমি ভাবতে শুরু করি যে বাস্তবায়নগুলির মধ্যে পার্থক্য সম্পর্কে শেখাও খুব আকর্ষণীয় হবে।
টিম

এখানে একটি উদাহরণ দেওয়া হয়েছে: scicomp.stackexchange.com/questions/8371/…
জুয়ান এম বেলো-রিভাস

1
@ ব্যবহারকারী2186862 "যখন ছোট হয়" সঠিক হয় তবে কেবল "যখন 1 + x = 1 ভাসমান পয়েন্ট যথার্থতায়" না হয় (যা সাধারণ ডাবল স্পেসিফিক গাণিতিকের ক্ষেত্রে x 10 - 16 এর জন্য ঘটে )। আপনার লিঙ্ক করা ডকুমেন্টেশন পৃষ্ঠাগুলি দেখায় যে তারা উদাহরণস্বরূপ x 10 - 10 এর জন্য ইতিমধ্যে কার্যকর । x1+x=1x1016x1010
ফেডেরিকো পোলোনি

উত্তর:


25

exp(x)=n=0xnn!=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(108)1=0.000000010000000050000000166666667083333334166666668exp(1022)1=0.000000000000000000000100000000000000000000005000000

সাধারণভাবে একটি "সঠিক" বাস্তবায়ন expএবং expm11ULP (অর্থাৎ শেষ স্থানের এক ইউনিট) এর চেয়ে বেশি হওয়া উচিত না। যাইহোক, এই নির্ভুলতা অর্জনের পরে "ধীর" কোডের ফলাফল হয়, কখনও কখনও দ্রুত, কম নির্ভুল বাস্তবায়ন পাওয়া যায়। উদাহরণস্বরূপ CUDA এ আমাদের আছে expfএবং expm1f, যেখানে fদ্রুত দাঁড়িয়ে আছে । মতে CUDA সি নির্দেশিকা প্রোগ্রামিং, অ্যাপ্লিকেশন। ডিexpf 2ULP এর একটি ত্রুটি রয়েছে।

আপনি যদি কয়েকটি ইউএলপিএসের ক্রমের ত্রুটিগুলি সম্পর্কে চিন্তা না করেন তবে সাধারণত এক্সফোনেনশিয়াল ফাংশনের বিভিন্ন বাস্তবায়ন সমতুল্য, তবে সাবধান হন যে বাগগুলি কোথাও লুকিয়ে থাকতে পারে ... ( পেন্টিয়াম এফডিএল বাগটি মনে আছে ?)

expm1exp(x)1xxexpm1

>>> exp(200)-1 == exp(200) == expm1(200)
True

1exp(200)

loglog1plog(1+x)x|x|1


1
এই উত্তরটি ইতিমধ্যে ওপি প্রশ্নের মন্তব্যে অন্তর্ভুক্ত ছিল। তবে আমি কেবল স্পষ্টতার জন্য একটি দীর্ঘ (যদিও প্রাথমিক) অ্যাকাউন্ট দেওয়ার জন্য দরকারী মনে করেছি, এটি কিছু পাঠকের পক্ষে উপকারী হবে।
স্টেফানো এম

ঠিক আছে, তবে একটি সহজেই সিদ্ধান্তে পৌঁছতে পারে "তাই আমি সবসময় এক্সপ এর পরিবর্তে এক্সপ্যাম 1 ব্যবহার করতে পারি" ...
টিম

1
@ টিম আপনার সিদ্ধান্তটি ভুল: আপনি সর্বদা এর expm1(x)পরিবর্তে ব্যবহার করতে পারেন exp(x)-1। অবশ্যই exp(x) == exp(x) - 1সাধারণভাবে ধরে না।
স্টেফানো এম

x1

1
expm1(x)0x1exp(x) - 1x1x<ϵϵ

1

এর মধ্যে পার্থক্যটি প্রসারিত করার জন্য logএবং log1pলগারিদম যদি গ্রাফটি পুনরায় স্মরণ করতে পারে তবে:

লগ্যারিদম

logx0ln(x)x0ln(x)ln(1e)=1ln(1e10)=10

x0ln(x+1)0ln(1+1e)0.31ln(1+1e10)0.000045log1p

1log01log1p

আমাদের সাইট ব্যবহার করে, আপনি স্বীকার করেছেন যে আপনি আমাদের কুকি নীতি এবং গোপনীয়তা নীতিটি পড়েছেন এবং বুঝতে পেরেছেন ।
Licensed under cc by-sa 3.0 with attribution required.