প্রথম দশমিক জায়গায় কীভাবে প্রিন্টফ রাউন্ড অর্ধেক হয়ে যায়?


11

আমি printfআমার সিস্টেমে দুটি ভিন্ন বাস্তবায়ন পরীক্ষা করছি : printf (GNU coreutils) 8.26এবং এর সাথে সংস্করণটি বান্ডিল হয়েছে zsh 5.3.1। আমি পরীক্ষা করছি যে অর্ধ সংখ্যাটি বৃত্তাকার, অর্থাত্ 1.5, 2.5, 3.5,… 9.5 এর জন্য।

$ for i in {1..9}; do /usr/bin/printf '%.0f\n' "${i}.5"; done
2
2
4
4
6
6
8
8
10
$ for i in {1..9}; do printf '%.0f\n' "${i}.5"; done
2
2
4
4
6
6
8
8
10

এখানে, উভয় পরিষ্কারভাবে এমনকি বৃত্তাকার অর্ধেক । যাইহোক, যখন আমি প্রথম দশমিক স্থানে গোল করে পরীক্ষা করি তখন বিষয়গুলি বিভ্রান্ত হয়। অর্থাৎ, আমি 1.15, 1.25, 1.35,… 1.95 এর জন্য পরীক্ষা করছি।

$ for i in {1..9}; do /usr/bin/printf '%.1f\n' "1.${i}5"; done
1.1
1.2
1.4
1.5
1.5
1.6
1.8
1.9
2.0
$ for i in {1..9}; do printf '%.1f\n' "1.${i}5"; done
1.1
1.2
1.4
1.4
1.6
1.6
1.8
1.9
1.9

উভয় বাস্তবায়নই এটি আলাদাভাবে করে এবং আমি উভয়ই কোনও পরিষ্কার প্যাটার্ন দেখতে পাচ্ছি না। এই দুটি printfগুলি বৃত্তাকার প্রথম দশমিক স্থানে কিভাবে যায়?

উত্তর:


19

জিএনইউ প্রিন্টফ ব্যবহার করেlong double যখন zsh নিয়মিত doubleগুলি ব্যবহার করে । আপনি যে বৃত্তাকার আচরণটি দেখছেন তা হ'ল কারণ (বলুন) 1.45 টি 2 এর শক্তির যোগফল হিসাবে প্রতিনিধিত্ব করা যায় না, এটিই আইইইই 754 ভাসমান-পয়েন্ট উপস্থাপনা কীভাবে কাজ করে এবং নিকটতম আনুমানিকতা নির্ভুলতা অনুসারে পরিবর্তিত হয়। এটি কিছুটা বেশি (৮০ বিট সহ) বা এর চেয়ে কম (b৪ বিট সহ), সুতরাং আপনি যেমন দেখছেন তেমন উপরে বা নিচে।

বরাবরের মতো, আপনি যদি সঠিক মানব-স্তরের উপস্থাপনা এবং বৃত্তাকার সম্পর্কে যত্নশীল হন তবে ভাসমান-পয়েন্টটি ব্যবহার করবেন না।


1
কেবলমাত্র একটি নোট যে x.25 এবং x.75 (উপযুক্ত ছোট এক্স এর জন্য) এর সঠিক বাইনারি উপস্থাপনা রয়েছে অন্যদের মতো নয়।
টবির স্পিড
আমাদের সাইট ব্যবহার করে, আপনি স্বীকার করেছেন যে আপনি আমাদের কুকি নীতি এবং গোপনীয়তা নীতিটি পড়েছেন এবং বুঝতে পেরেছেন ।
Licensed under cc by-sa 3.0 with attribution required.