ডিসি দিয়ে নির্ভুলতা হারাতে


12

আমি dcহেক্সাডেসিমাল পয়েন্ট সহ কিছু বেস 16 সংখ্যা হ্যান্ডেল করতে ব্যবহার করতে চাই তবে আমি নির্ভুল সমস্যার মধ্যে চলেছি। উদাহরণস্বরূপ, নীচে আমি উভয় হেক্স F423F.FDদ্বারা গুণ করছি 100। প্রত্যাশিত উত্তরটি হ'ল F423FFDপরিবর্তে এটি দিচ্ছে F423FFA.E1, কাছাকাছি হলেও গোল করার পরেও যথেষ্ট সঠিক নয়।

$ dc
16 d i o F423F.FD 100 * p
F423FFA.E1

আমি পড়লাম যে dcসীমাহীন নির্ভুলতা ক্যালকুলেটর ছিল, এবং এটি কোনও উপায়ে বড় সংখ্যা নয়। আমি কি ভুল করছি কিছু আছে?

আপনার উত্তরের জন্য ধন্যবাদ। সমস্যাগুলি dcদিয়েছি, আমি বুলেটটি টুকরো টুকরো করেছিলাম এবং অন্যান্য ঘাঁটিতে সত্যিকারের সংখ্যার জন্য আমার নিজের পার্সার লিখেছিলাম। যদি কেউ কোডটিতে আগ্রহী হন তবে আমি এটি এখানে পোস্ট করতে পারি।

উত্তর:


6

মনে রাখবেন যে কেবল আসল সংখ্যাটি মুদ্রণ করলে এটি গোল হয়:

$ dc <<<'16 d i o F423F.FD p'
F423F.FA

আরও নির্ভুলতার জন্য আপনি প্রচুর ট্রেলিং জিরো যুক্ত করে এটি পেতে পারেন:

$ dc <<<'16 d i o F423F.FD000000 100 * p'
F423FFD.0000000

ধন্যবাদ। আমি মনে করি এটি ব্যবহার dcকরার জন্য সংখ্যাগুলি ম্যাসেজ করার জন্য আরও কোড নেওয়া শেষ হবে কেবল সরাসরি পার্সার লিখতে! (ইনপুট দশমিক থাকতে পারে এবং নাও থাকতে পারে, এবং অন্যান্য ঘাঁটিতেও থাকতে পারে, তাই প্যাডিংয়ের পরিমাণ পৃথক হতে পারে))
ইয়িমিন রং

2
আমি এটি গ্রহণযোগ্য উত্তর হিসাবে চিহ্নিত করব। dcজবাব বজায় রাখার জন্য দায়বদ্ধ ব্যক্তিরা উত্তর দিয়েছেন: দশমিক অ-ভগ্নাংশের অঙ্কগুলি সঠিকভাবে পরিচালনা করতে ডিসি এবং বিসি দ্বারা ব্যবহৃত দশমিক-স্কেল মডেলের তুলনায় সম্পূর্ণ ভিন্ন মডেলের প্রয়োজন হবে (বিসির জন্য পসিএক্স দ্বারা নির্ধারিত, এবং উভয়ের জন্য historicalতিহাসিক traditionতিহ্য)। , সুতরাং প্রযুক্তিগতভাবে এটি স্থির করা যেতে পারে dcতবে এটি সম্ভবত ভেঙে যাবে bc, তাই ডাব্লুউন্টিক্স হিসাবে শ্রেণীবদ্ধ করা হয়েছে।
ইয়িমিন রং

8

দশমিক হিসাবে dcরূপান্তরিত ( রূপান্তর করতে ব্যবহার করে) হিসাবে প্রকাশিত, এটি 999999.98 (বৃত্তাকার ডাউন) এর সাথে মিলে যায় × 256, অর্থাৎ 255999994.88, যা হেক্সাডেসিমালে F423FFA.E1।

সুতরাং পার্থক্যটি dcএর গোলাকৃত আচরণ থেকে আসে : 256 × (999999 + 253 ÷ 256) গণনা করার পরিবর্তে, যা 255999997 দেবে, এটি 253 down 256 ডাউন করে এবং ফলাফলকে বহুগুণ করে।

dcএকটি স্বেচ্ছাসেবী নির্ভুলতা ক্যালকুলেটর, যার অর্থ এটি আপনি চান যে কোনও নির্ভুলতার গণনা করতে পারেন, তবে আপনাকে এটি বলতে হবে যে এটি কি। ডিফল্টরূপে, এর নির্ভুলতা 0, অর্থাত্ বিভাগটি কেবল পূর্ণসংখ্যার মান উত্পন্ন করে, এবং গুণন ইনপুটটিতে অঙ্কের সংখ্যা ব্যবহার করে। নির্ভুলতা সেট করতে, ব্যবহার করুন k(এবং মনে রাখবেন যে ইনপুট বা আউটপুট রিক্সিক নির্বিশেষে সর্বদা দশমিক অঙ্কে যথার্থতা প্রকাশ করা হয়):

10 k
16 d i o
F423FFD 100 / p
F423F.FD0000000
100 * p
F423FFD.000000000

(8 ডিজিটের যথার্থতা যথেষ্ট হবে যেহেতু আপনাকে দশমিক 1 ÷ 256 উপস্থাপন করতে হবে))


1
এটি "স্বেচ্ছাচারিত নির্ভুলতা" ক্যালকুলেটরের সম্পূর্ণ অপ্রত্যাশিত ফলাফল বলে মনে হবে?
ইয়িমিন রং

3
এটি kসেট করার পরে এখনও নির্ভুলতা হারাবে : 10 k 16 d i o F423F.FD pF423F.FA, সুতরাং এগুলি ব্যবহারের আগে আমাকে সমস্ত নম্বর স্কেল করতে হবে dc। মূলত যাইহোক সেগুলি প্রাক-পার্সিংয়ের পরিমাণ।
ইয়িমিন রং

2
@ ইয়ামিন হ্যাঁ, দুর্ভাগ্যক্রমে dcকেবলমাত্র অঙ্কের সংখ্যা ব্যবহার করে এর ইনপুটটি স্কেল করে যা আমার কাছে একটি বাগের মতো মনে হয় (যেহেতু অঙ্কের সংখ্যাটি ইনপুট র‌্যাডিক্স ব্যবহার করে গণনা করা হয়, তবে দশমিক মানের ক্ষেত্রে প্রয়োগ করা হয়)।
স্টিফেন কিট

1
@ ধাগ এটিই পসিএক্স নির্দিষ্ট করে ( bcযার dcজন্য ভিত্তি করে): "অভ্যন্তরীণ গণনাগুলি দশমিক অঙ্কের নির্দিষ্ট সংখ্যায় নির্দিষ্ট ইনপুট এবং আউটপুট ভিত্তি নির্বিশেষে দশমিক হিসাবে পরিচালিত হবে” "
স্টিফেন কিট

1
একটি ধ্রুবককে কীভাবে পার্স করা হচ্ছে এটি সত্যিই একটি সমস্যা। চেষ্টা করুন 20 k 16 d i o 0.3 1 / p (যা প্রিন্ট করে .19999999999999999)। বুঝতে পারুন যে অপারেশনটি কেবলমাত্র ভাগ 0.2করে চলেছে 1(যা তাত্ত্বিকভাবে মান পরিবর্তন করা উচিত নয়)। যদিও 20 k 16 d i o 0.3000 1 / p(সঠিকভাবে) কপি করে প্রিন্ট .30000000000000000। (
অবিরত

1

সমস্যাটি

সমস্যা হল ডিসি (এবং বিসি) সংখ্যার ধ্রুবক বোঝার উপায় 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বিন্দুর পরে হেক্স সংখ্যা ( ) এর সংখ্যা গণনা করুন ।
  • গুন h4 দ্বারা।
  • 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.FD50 অঙ্কে প্রসারিত করার আগে ধ্রুবকটি পড়তে 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

এটি প্রদর্শিত হয়েছে যে প্রতিটি বাইনারি ভগ্নাংশ একই সংখ্যার অঙ্ক সহ দশমিক ভগ্নাংশ।

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