(GNU) awk (संकलित संकलित) के साथ उच्च परिशुद्धता के लिए उपयोग करें:
$ echo '0.4970436865354813' | awk -M -v PREC=100 '{printf("%.18f\n", $1)}'
0.497043686535481300
PREC = 100 का अर्थ है डिफ़ॉल्ट 53 बिट्स के बजाय 100 बिट्स।
यदि वह जागना उपलब्ध नहीं है, तो bc का उपयोग करें
$ 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
Printf प्रारूप 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 अंकों तक सही दिखें। वह मृगतृष्णा है।
$ 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
यदि गणना ग्रंथि पुस्तकालय में संकलित की गई है, तो इसकी गणना (GNU) के साथ भी की जा सकती है:
$ echo "$a" | awk -M -v PREC=100 -v CONVFMT=%.30g '{printf("%.30f\n", $1)}'
0.497043686535481300000000000000