বিশুদ্ধ উচ্চ নির্ভুলতা গণিত


11

প্রতিস্থাপনের ক্রিয়াকলাপে উচ্চ-নির্ভুলতা গাণিতিক করতে আমি বিশ্রীকে বলার উপায় খুঁজছি। এর সাথে জড়িত রয়েছে, একটি ফাইল থেকে একটি ক্ষেত্র পড়া এবং সেই মানটিতে 1% বৃদ্ধি সহ এটি প্রতিস্থাপন করা। তবে আমি সেখানে নির্ভুলতা হারাচ্ছি। সমস্যাটির সরলীকৃত প্রজনন এখানে দেওয়া হল:

 $ echo 0.4970436865354813 | awk '{gsub($1, $1*1.1)}; {print}'
   0.546748

এখানে, দশমিক নির্ভুলতার পরে আমার কাছে 16 সংখ্যা রয়েছে তবে অ্যাডক শুধুমাত্র ছয়টি দেয়। প্রিন্টফ ব্যবহার করে, আমি একই ফল পাচ্ছি:

$ echo 0.4970436865354813 | awk '{gsub($1, $1*1.1)}; {printf("%.16G\n", $1)}'
0.546748

পছন্দসই নির্ভুলতা পেতে কিভাবে কোনও পরামর্শ?


সম্ভবত অ্যাডকের উচ্চতর রেজোলিউশন রয়েছে তবে এটি কেবল আপনার আউটপুট ফর্ম্যাটটি কেটে যাচ্ছে। প্রিন্টফ ব্যবহার করুন।
dubiousjim

প্রিন্টফ ব্যবহারের পরে ফলাফলের মানে কোনও পরিবর্তন হয়নি। প্রশ্ন অনুসারে সম্পাদিত।
এমকেসি

@ মানাটওয়ার্ক যেমন উল্লেখ করেছে, এটি gsubঅপ্রয়োজনীয়। সমস্যাটি gsubস্ট্রিংগুলিতে কাজ করে, সংখ্যা নয়, সুতরাং প্রথমে একটি রূপান্তর ব্যবহার করে সম্পন্ন করা হবে CONVFMTএবং এটির জন্য ডিফল্ট মান %.6g
jw013

@ jw013, আমি যেমন প্রশ্নে উল্লেখ করেছি, আমার আসল সমস্যাটির জন্য gsub প্রয়োজন কারণ যেহেতু আমার 1% ইনক্রিমেন্টের সাথে একটি সংখ্যার বিকল্প প্রয়োজন। একমত, সরল উদাহরণে এটি প্রয়োজন হয় না।
এমকেসি

উত্তর:


12
$ echo 0.4970436865354813 | awk -v CONVFMT=%.17g '{gsub($1, $1*1.1)}; {print}'
0.54674805518902947

বা বরং এখানে:

$ echo 0.4970436865354813 | awk '{printf "%.17g\n", $1*1.1}'
0.54674805518902947

সম্ভবত আপনি অর্জন করতে পারেন সেরা। bcস্বেচ্ছাসেবী নির্ভুলতার জন্য পরিবর্তে ব্যবহার করুন ।

$ echo '0.4970436865354813 * 1.1' | bc -l
.54674805518902943

আপনি যদি নির্বিচারে নির্ভুলতা চান তবে আপনি পতাকাটি AWKব্যবহার করতে -Mএবং PRECএকটি বড় সংখ্যায় মান সেট করতে পারেন
রবার্ট বেনসন

3
@ রবার্টবেইনস, শুধুমাত্র জিএনইউ অ্যাজকের সাথে এবং কেবল সাম্প্রতিক সংস্করণগুলির সাথে (৪.১ বা তার বেশি, সুতরাং উত্তরটি লেখার সময় নয়) এবং কেবল তখনই সংকলনের সময় এমপিএফআর সক্ষম হয়েছিল।
স্টাফেন চেজেলাস

2

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