প্রশ্নের সরাসরি উত্তর দিতে, এখানে আমার সংস্করণটি আর ফাংশন থেকে নাম ব্যবহার করে :
import math
def signif(x, digits=6):
if x == 0 or not math.isfinite(x):
return x
digits -= math.ceil(math.log10(abs(x)))
return round(x, digits)
আমার এই উত্তর পোস্ট করার প্রধান কারণ হ'ল মন্তব্যগুলি অভিযোগ করেছেন যে "0.075" 0.08 এর পরিবর্তে 0.07 এ চলেছে। এটি "নভিসিস সি" দ্বারা চিহ্নিত হিসাবে, সীমাবদ্ধ নির্ভুলতা এবং বেস -2 উভয়ের উপস্থাপনা উভয়ই ভাসমান পয়েন্ট গণিতের সংমিশ্রণে প্রাপ্য । ০.০75৫ এর নিকটতম সংখ্যা যা প্রকৃতপক্ষে উপস্থাপন করা যেতে পারে এটি সামান্য ছোট, অতএব আপনি নির্লজ্জভাবে প্রত্যাশার চেয়ে বৃত্তাকারটি আলাদাভাবে বের হয়।
আরও মনে রাখবেন যে এটি দশমিক অ-দশমিক ভাসমান বিন্দুর গাণিতিকের ব্যবহারের ক্ষেত্রে প্রযোজ্য যেমন সি এবং জাভা উভয়েরই একই সমস্যা রয়েছে।
আরও বিশদ দেখানোর জন্য, আমরা পাইথনকে "হেক্স" ফর্ম্যাটে নম্বরটি ফর্ম্যাট করতে বলি:
0.075.hex()
যা আমাদের দেয়: 0x1.3333333333333p-4
। এটি করার কারণটি হ'ল স্বাভাবিক দশমিক প্রতিনিধিত্ব প্রায়শই গোলাকার জড়িত এবং তাই কম্পিউটারটি সংখ্যাটি কীভাবে "দেখায়" তা নয়। আপনি যদি এই ফর্ম্যাটটিতে অভ্যস্ত না হন, তবে কয়েকটি দরকারী তথ্যসূত্র হলেন পাইথন ডক্স এবং সি স্ট্যান্ডার্ড ।
এই সংখ্যাগুলি কীভাবে কিছুটা কাজ করে তা দেখানোর জন্য, আমরা এটি করে আমাদের শুরুতে ফিরে যেতে পারি:
0x13333333333333 / 16**13 * 2**-4
যা মুদ্রণ করা উচিত 0.075
। 16**13
দশমিক পয়েন্টের পরে 13 টি হেক্সাডেসিমাল সংখ্যা রয়েছে এবং 2**-4
হেক্স এক্সপোশনগুলি বেস -২ হওয়ার কারণ এটি।
এখন ভাসমানগুলি কীভাবে প্রতিনিধিত্ব করা হয় সে সম্পর্কে আমরা কিছু ধারণা পেয়েছি আমরা decimal
কী কী ঘটছে তা দেখিয়ে আমাদের আরও কিছুটা নির্ভুলতার জন্য মডিউলটি ব্যবহার করতে পারি :
from decimal import Decimal
Decimal(0x13333333333333) / 16**13 / 2**4
প্রদান: 0.07499999999999999722444243844
এবং আশা করি কেন round(0.075, 2)
মূল্যায়ন করা হয় তা ব্যাখ্যা করে0.07