(GNU) awk (বিগনাম সংকলিত সহ) ব্যবহারের সাথে উচ্চতর নির্ভুলতার জন্য ব্যবহার করুন:
$ echo '0.4970436865354813' | awk -M -v PREC=100 '{printf("%.18f\n", $1)}'
0.497043686535481300
PREC = 100 এর অর্থ ডিফল্ট 53 বিটের পরিবর্তে 100 বিট।
যদি সেই বিশদটি উপলব্ধ না হয়, বিসি ব্যবহার করুন
$ echo '0.4970436865354813*1.1' | bc -l
.54674805518902943
অথবা আপনার ভাসমানগুলির অন্তর্নিহিত অবজ্ঞানের সাথে বাঁচতে শিখতে হবে।
আপনার মূল লাইনে বেশ কয়েকটি সমস্যা রয়েছে:
- 1.1 এর একটি ফ্যাক্টর 10% বৃদ্ধি, 1% নয় (একটি 1.01 গুণক হওয়া উচিত)। আমি 10% ব্যবহার করব।
স্ট্রিং থেকে একটি (ভাসমান) সংখ্যায় রূপান্তর ফর্ম্যাটটি CONVFMT দ্বারা প্রদত্ত। এর ডিফল্ট মান %.6g
। এটি মানগুলি 6 দশমিক অঙ্কের (ডটের পরে) সীমাবদ্ধ করে। এটি gsub পরিবর্তনের ফলাফলের জন্য প্রয়োগ করা হয় $1
।
$ a='0.4970436865354813'
$ echo "$a" | awk '{printf("%.16f\n", $1*1.1)}'
0.5467480551890295
$ echo "$a" | awk '{gsub($1, $1*1.1)}; {printf("%.16f\n", $1)}'
0.5467480000000000
প্রিন্টফ ফর্ম্যাটটি g
অনুসরণযোগ্য শূন্যগুলি সরিয়ে দেয়:
$ echo "$a" | awk '{gsub($1, $1*1.1)}; {printf("%.16g\n", $1)}'
0.546748
$ echo "$a" | awk '{gsub($1, $1*1.1)}; {printf("%.17g\n", $1)}'
0.54674800000000001
উভয় সমস্যার সমাধান করা যেতে পারে:
$ echo "$a" | awk '{printf("%.17g\n", $1*1.1)}'
0.54674805518902947
অথবা
$ echo "$a" | awk -v CONVFMT=%.30g '{gsub($1, $1*1.1)}; {printf("%.17f\n", $1)}'
0.54674805518902947
তবে ধারণাটি পাবেন না যে এর অর্থ উচ্চতর নির্ভুলতা। অভ্যন্তরীণ সংখ্যা উপস্থাপনা এখনও ডাবল আকারে ভাসা। এর অর্থ হ'ল 53 বিট নির্ভুলতা এবং এটির সাথে আপনি কেবল 15 টি সঠিক দশমিক অঙ্কের বিষয়ে নিশ্চিত হতে পারেন, এমনকি যদি 17 বারের বেশি অঙ্ক পর্যন্ত সঠিক দেখা যায় look এটা একটা মরীচিকা।
$ echo "$a" | awk -v CONVFMT=%.30g '{gsub($1, $1*1.1}; {printf("%.30f\n", $1)}'
0.546748055189029469325134868996
সঠিক মানটি হ'ল:
$ echo "scale=18; 0.4970436865354813 * 1.1" | bc
.54674805518902943
বিগনাম লাইব্রেরিটি যদি সংকলন করা থাকে তবে এটি (জিএনইউ) awk দিয়েও গণনা করা যেতে পারে:
$ echo "$a" | awk -M -v PREC=100 -v CONVFMT=%.30g '{printf("%.30f\n", $1)}'
0.497043686535481300000000000000