সমস্যাটি
সমস্যা হল ডিসি (এবং বিসি) সংখ্যার ধ্রুবক বোঝার উপায় understand
উদাহরণস্বরূপ, মান (হেক্সে) 0.3
(1 দ্বারা বিভক্ত) কাছাকাছি মানের মধ্যে রূপান্তরিত হয়0.2
$ dc <<<"20k 16 d i o 0.3 1 / p"
.199999999999999999999999999
আসলে, সমতল ধ্রুবকটিও 0.3
বদলে যায়:
$ dc <<<"20 k 16 d i o 0.3 p"
.1
দেখে মনে হচ্ছে এটি একটি বিজোড় উপায়ে রয়েছে তবে এটি (আরও পরে) নয়।
আরও শূন্য যুক্ত করা উত্তরকে সঠিক মানের কাছে পৌঁছে দেয়:
$ dc <<<"20 k 16 d i o 0.30 p"
.2E
$ dc <<<"20 k 16 d i o 0.300 p"
.2FD
$ dc <<<"20 k 16 d i o 0.3000 p"
.3000
শেষ মানটি হুবহু এবং আরও জিরো যুক্ত করা হোক না কেন তা ঠিক থাকবে।
$ dc <<<"20 k 16 d i o 0.30000000 p"
.3000000
বিসি-তেও সমস্যাটি উপস্থিত রয়েছে:
$ bc <<< "scale=20; obase=16; ibase=16; 0.3 / 1"
.19999999999999999
$ bc <<< "scale=20; obase=16; ibase=16; 0.30 / 1"
.2E147AE147AE147AE
$ bc <<< "scale=20; obase=16; ibase=16; 0.300 / 1"
.2FDF3B645A1CAC083
$ bc <<< "scale=20; obase=16; ibase=16; 0.3000 / 1"
.30000000000000000
বিট প্রতি এক অঙ্ক?
ভাসমান পয়েন্ট সংখ্যাগুলির জন্য খুব অ-স্বজ্ঞাত সত্যটি হ'ল প্রয়োজনীয় সংখ্যার সংখ্যা (বিন্দুর পরে) বাইনারি বিটের সংখ্যার (বিন্দুর পরেও) সমান। একটি বাইনারি সংখ্যা 0.101 দশমিক দশমিক 0.625 এর ঠিক সমান। বাইনারি সংখ্যা 0.0001110001 (ঠিক 0.1103515625
দশমিক দশমিক ) এর সমান
$ bc <<<'scale=30;obase=10;ibase=2; 0.101/1; 0.0001110001/1'; echo ".1234567890"
.625000000000000000000000000000
.110351562500000000000000000000
.1234567890
এছাড়াও, 2 ^ (- 10) এর মতো ভাসমান পয়েন্ট সংখ্যার জন্য, বাইনারিতে কেবল একটি (সেট) বিট থাকে:
$ bc <<<"scale=20; a=2^-10; obase=2;a; obase=10; a"
.0000000001000000000000000000000000000000000000000000000000000000000
.00097656250000000000
.0000000001
দশমিক সংখ্যা .0009765625
(10) হিসাবে বাইনারি সংখ্যা (10) এর একই সংখ্যার রয়েছে । অন্যান্য ঘাঁটিতে এটি নাও হতে পারে তবে বেস 10 হ'ল উভয় ডিসি এবং বিসি-তে সংখ্যার অভ্যন্তরীণ প্রতিনিধিত্ব এবং তাই কেবলমাত্র আমাদের ভিত্তিটিই আমাদের যত্ন নেওয়া উচিত।
গণিতের প্রমাণটি এই উত্তরটির শেষে রয়েছে।
বিসি স্কেল
বিল্ট-ইন ফাংশন scale()
বিসি দিয়ে বিন্দুর পরে অঙ্কের সংখ্যা গণনা করা যেতে পারে :
$ bc <<<'obase=16;ibase=16; a=0.FD; scale(a); a; a*100'
2
.FA
FA.E1
হিসাবে দেখানো হয়েছে, 2 ডিজিট ধ্রুবক প্রতিনিধিত্ব করতে অপর্যাপ্ত 0.FD
।
এবং এছাড়াও, বিন্দুটির পরে ব্যবহৃত অক্ষরের সংখ্যা গণনা করা সংখ্যার স্কেলটি প্রতিবেদন করার (এবং ব্যবহার করার) একটি খুব ভুল উপায়। একটি সংখ্যার স্কেল (যে কোনও বেসে) প্রয়োজনীয় বিটের সংখ্যা গণনা করা উচিত।
একটি হেক্স ফ্লোটে বাইনারি অঙ্কগুলি।
যেমনটি জানা যায়, প্রতিটি হেক্স ডিজিট 4 বিট ব্যবহার করে। সুতরাং, দশমিক বিন্দুর পরে প্রতিটি হেক্স ডিজিটের জন্য 4 বাইনারি অঙ্কের প্রয়োজন হয়, যা উপরের (বিজোড়?) বাস্তবতার কারণে 4 দশমিক সংখ্যারও প্রয়োজন।
অতএব, এর মতো একটি 0.FD
সংখ্যার পক্ষে 8 টি দশমিক সংখ্যা সঠিকভাবে উপস্থাপন করতে হবে:
$ bc <<<'obase=10;ibase=16;a=0.FD000000; scale(a);a;a*100'
8
.98828125
253.00000000
শূন্য যোগ করুন
গণিতটি সোজা (হেক্স সংখ্যার জন্য):
h
বিন্দুর পরে হেক্স সংখ্যা ( ) এর সংখ্যা গণনা করুন ।
- গুন
h
4 দ্বারা।
h×4 - h = h × (4-1) = h × 3 = 3×h
শূন্য যোগ করুন ।
শেল কোডে (শে জন্য):
a=F423F.FD
h=${a##*.}
h=${#h}
a=$a$(printf '%0*d' $((3*h)) 0)
echo "$a"
echo "obase=16;ibase=16;$a*100" | bc
echo "20 k 16 d i o $a 100 * p" | dc
যা মুদ্রণ করবে (ডিসি এবং বিসি উভয়ই সঠিকভাবে):
$ sh ./script
F423F.FD000000
F423FFD.0000000
F423FFD.0000000
অভ্যন্তরীণভাবে, বিসি (বা ডিসি) 3*h
হেক্স ভাসমানকে অভ্যন্তরীণ দশমিক প্রতিনিধিত্বতে রূপান্তর করতে উপরের গণনা করা সংখ্যার সাথে প্রয়োজনীয় সংখ্যার সংখ্যা তৈরি করতে পারে । অথবা অন্যান্য ঘাঁটিগুলির জন্য কিছু অন্যান্য কার্য (যেমন অন্যান্য বেসগুলিতে বেস 10 (বিসি এবং ডিসির অভ্যন্তরীণ) এর সাথে অঙ্কের সংখ্যা সসীম ধরে নেওয়া)। 2 আই (2,4,8,16, ...) এবং 5,10 এর মতো।
posix
পজিক্সের স্পেসিফিকেশনটিতে বলা হয়েছে (সিসির জন্য, কোন ডিসি ভিত্তিক)
অভ্যন্তরীণ গণনাগুলি দশমিক হিসাবে নির্দিষ্টভাবে সংখ্যার ইনপুট এবং আউটপুট বেস নির্বিশেষে পরিচালিত হবে।
তবে "... দশমিক অঙ্কের নির্দিষ্ট সংখ্যা" " "দশমিক অভ্যন্তরীণ গণনা" প্রভাবিত না করে "সংখ্যার ধ্রুবক উপস্থাপনের জন্য দশমিক অঙ্কের প্রয়োজনীয় সংখ্যা" (উপরে বর্ণিত হিসাবে) বোঝা যেতে পারে
কারণ:
bc <<<'scale=50;obase=16;ibase=16; a=0.FD; a+1'
1.FA
বিসি উপরের সেট হিসাবে সত্যই 50 ("দশমিক অঙ্কের নির্দিষ্ট সংখ্যা") ব্যবহার করছে না।
বিভক্ত হলেই এটি রূপান্তরিত হয় (এখনও এটি ভুল হিসাবে এটি 0.FD
50 অঙ্কে প্রসারিত করার আগে ধ্রুবকটি পড়তে 2 স্কেল ব্যবহার করে ):
$ bc <<<'scale=50;obase=16;ibase=16; a=0.FD/1; a'
.FAE147AE147AE147AE147AE147AE147AE147AE147A
তবে এটি সঠিক:
$ bc <<<'scale=50;obase=16;ibase=16; a=0.FD000000/1; a'
.FD0000000000000000000000000000000000000000
আবার, সংখ্যাযুক্ত স্ট্রিং (ধ্রুবক) পড়ার জন্য বিটের সঠিক সংখ্যাটি ব্যবহার করা উচিত।
গণিতের প্রমাণ
দুটি পদক্ষেপে:
একটি বাইনারি ভগ্নাংশটি / 2 এন হিসাবে লেখা যেতে পারে
একটি বাইনারি ভগ্নাংশ দুটি এর নেতিবাচক শক্তির সীমাবদ্ধ যোগফল।
উদাহরণ স্বরূপ:
= 0.00110101101 =
= 0. 0 0 1 1 0 1 0 1 1 0 1
= 0 + 0 × 2 -1 + 0 × 2 -2 + 1 × 2 -3 + 1 × 2 -4 + 0 × 2 -5 + 1 × 2 -6 + 0 × 2 -7 + 1 × 2 -8 + 1 × 2 -9 + 0 × 2 -10 + 1 × 2 -11
= 2 -3 + 2 -4 + 2 -6 + 2 -8 + 2 -9 + 2 -11 = (জিরো সরানো সহ)
এন বিটের একটি বাইনারি ভগ্নাংশে, শেষ বিটের মান 2 -n , বা 1/2 এন হয় । এই উদাহরণে: 2 -11 বা 1/2 11 ।
= 1/2 3 + 1/2 4 + 1/2 6 + 1/2 8 + 1/2 9 + 1/2 11 = (বিপরীতে সহ)
সাধারণভাবে, ডিনোমিনেটর 2 টির ধনাত্মক সংখ্যার যোগফল সহ 2 এন হয়ে যেতে পারে । তারপরে সমস্ত পদ একটি একক মান a / 2 n এর সাথে একত্রিত হতে পারে । এই উদাহরণের জন্য:
= 2 8 /2 11 +2 7 /2 11 +2 5 /2 11 +2 3 /2 11 +2 2 /2 11 টি + 1/2 11 = (2 প্রকাশ 11 )
= (২ 8 + 2 7 + 2 5 + 2 3 + 2 2 + 1) / 2 11 = (সাধারণ উপাদান খুঁজে বের করা)
= (256 + 128 + 32 + 8 + 4 + 1) / 2 11 = (মান রূপান্তরিত)
= 429/2 11
প্রতিটি বাইনারি ভগ্নাংশ b / 10 এন হিসাবে প্রকাশ করা যেতে পারে
A / 2 n কে 5 এন
/ 5 এন দিয়ে গুণান , (a × 5 n ) / (2 n × 5 n ) = (a × 5 n ) / 10 n = b / 10 n , যেখানে b = a × 5 n । এটিতে n সংখ্যা রয়েছে।
উদাহরণস্বরূপ, আমাদের রয়েছে:
(429 · 5 11 ) / 10 11 = 20947265625/10 11 = 0.20947265625
এটি প্রদর্শিত হয়েছে যে প্রতিটি বাইনারি ভগ্নাংশ একই সংখ্যার অঙ্ক সহ দশমিক ভগ্নাংশ।
dc
করার জন্য সংখ্যাগুলি ম্যাসেজ করার জন্য আরও কোড নেওয়া শেষ হবে কেবল সরাসরি পার্সার লিখতে! (ইনপুট দশমিক থাকতে পারে এবং নাও থাকতে পারে, এবং অন্যান্য ঘাঁটিতেও থাকতে পারে, তাই প্যাডিংয়ের পরিমাণ পৃথক হতে পারে))