আপনার সমস্যাটি নীচে নির্দিষ্ট করা আছে, আপনাকে পিছনে ফিরে কিছু প্রশ্ন জিজ্ঞাসা করতে হবে।
- আপনার ইনপুটগুলি কী ধরণের (গুলি)?
- আপনার আউটপুটগুলির জন্য আপনি কী ধরণের (গুলি) চান?
- 1 এরও কম ফলাফলের জন্য, আপনি ঠিক কীটি দেখতে চান? আপনি কি 10 এর প্রকৃত শক্তি চান বা 10 এর ক্ষমতার ভাসমান বিন্দুটি অনুমান করতে চান? আপনি সচেতন যে 10 এর নেতিবাচক শক্তি ঠিক ভাসমান পয়েন্টে ঠিক প্রকাশ করা যায় না? আসুন আপাতত ধরে নেওয়া যাক আপনি 10 এর ক্ষমতার ভাসমান পয়েন্টের আনুষঙ্গিকতা চান।
- যদি ইনপুটটি হুবহু 10 এর শক্তি হয় (বা 10 এর পাওয়ারের নিকটতম ভাসমান বিন্দু অনুমান), আউটপুটটি কি ইনপুটটির মতো হওয়া উচিত? অথবা এটি 10 এর পরবর্তী শক্তি হওয়া উচিত? "10 -> 10" বা "10 -> 100"? আপাতত প্রাক্তন ধরে নেওয়া যাক।
- আপনার ইনপুট মানগুলি প্রশ্নযুক্ত ধরণের যে কোনও সম্ভাব্য মান হতে পারে? অথবা তারা আরও বাধা হয়।
অন্য উত্তরে লগারিদম নেওয়ার প্রস্তাব করা হয়েছিল, তারপরে রাউন্ড আপ (সিলিং ফাংশন), তারপরে এক্সপোনসিটিয়েট করা।
def nextpow10(n):
return 10 ** math.ceil(math.log10(n))
দুর্ভাগ্যক্রমে এটি গোলাকৃতি ত্রুটিতে ভুগছে। প্রথমে এন-কে যে কোনও ডেটা টাইপ করা হয় তা ডাবল স্পষ্টতা ফ্লোটিং পয়েন্ট সংখ্যায় রূপান্তরিত হয়, সম্ভাব্যভাবে রাউন্ডিং ত্রুটিগুলি প্রবর্তন করে, তারপরে লগারিদম গণনা করা হয় সম্ভাব্যভাবে তার অভ্যন্তরীণ গণনায় এবং এর ফলাফল উভয়ই আরও বেশি গোলাকার ত্রুটিগুলি প্রবর্তন করে।
এর ফলে এটি একটি ভুল ফলাফল দিয়েছে যেখানে একটি উদাহরণ পেতে আমার বেশি সময় লাগেনি।
>>> import math
>>> from numpy import nextafter
>>> n = 1
>>> while (10 ** math.ceil(math.log10(nextafter(n,math.inf)))) > n:
... n *= 10
...
>>> n
10
>>> nextafter(n,math.inf)
10.000000000000002
>>> 10 ** math.ceil(math.log10(10.000000000000002))
10
এটি অন্য দিক থেকে ব্যর্থ হওয়া তাত্ত্বিকভাবেও সম্ভব, যদিও এটি উস্কে দেওয়া আরও কঠিন বলে মনে হয়।
সুতরাং ভাসমান এবং ints এর শক্তিশালী সমাধানের জন্য আমাদের ধরে নিতে হবে যে আমাদের লোগারিদমের মান কেবল আনুমানিক, এবং তাই আমাদের অবশ্যই কয়েকটি সম্ভাবনার পরীক্ষা করতে হবে। এর লাইন বরাবর কিছু
def nextpow10(n):
p = round(math.log10(n))
r = 10 ** p
if r < n:
r = 10 ** (p+1)
return r;
আমি বিশ্বাস করি যে এই কোডটি সমস্ত আর্গুমেন্টের জন্য একটি বিবেকবান বাস্তব-বিশ্বের পরিসীমাটিতে সঠিক ফলাফল দেওয়া উচিত। এটি খুব কম বা খুব বড় সংখ্যক নন ইন্টিজার এবং অ-ভাসমান বিন্দুর ধরণের সমস্যার জন্য ভঙ্গ হবে কারণ ইস্যুগুলিকে ভাসমান স্থানে রূপান্তরিত করে। পাইথন বিশেষ ক্ষেত্রে ওভারফ্লো রোধের প্রয়াসে লগ 10 ফাংশনে পূর্ণসংখ্যার যুক্তি, তবে এখনও যথেষ্ট পরিমাণে পূর্ণসংখ্যার সাহায্যে বৃত্তাকার ত্রুটির কারণে ভুল ফলাফলকে জোর করা সম্ভব হতে পারে।
দুটি বাস্তবায়ন পরীক্ষা করার জন্য আমি নিম্নলিখিত পরীক্ষার প্রোগ্রামটি ব্যবহার করেছি।
n = -323 # 10**-324 == 0
while n < 1000:
v = 10 ** n
if v != nextpow10(v): print(str(v)+" bad")
try:
v = min(nextafter(v,math.inf),v+1)
except:
v += 1
if v > nextpow10(v): print(str(v)+" bad")
n += 1
এ নিখুঁত বাস্তবায়নে প্রচুর ব্যর্থতা খুঁজে পায়, তবে উন্নত বাস্তবায়নে কোনওটিই পায় না।
10
করছে, এর জন্য উদাহরণ সহ কিছু দরকার হবেlog10
।