एक समय की बात है, एक बुद्धिमान नौकर ने एक राजकुमार की जान बचाई। राजा ने वादा किया कि नौकर जो भी माँगेगा, वह उसे देगा। राजा को शतरंज बहुत पसंद था। यह जानकर नौकर ने राजा से कहा कि उसे गेहूँ के दाने चाहिए। शतरंज के बोर्ड के पहले खाने पर एक दाना, और हर अगले खाने पर दानों की संख्या दोगुनी।
शतरंज के बोर्ड पर गेहूँ के दानों की संख्या निकालिए।
शतरंज के बोर्ड में 64 खाने होते हैं। खाना 1 पर एक दाना होता है, खाना 2 पर दो दाने, खाना 3 पर चार दाने, और इसी तरह हर बार संख्या दोगुनी होती जाती है।
ऐसा कोड लिखिए जो यह निकालता है:
डिफॉल्ट रूप से awk में संख्याएँ डबल-प्रिसिज़न फ्लोटिंग पॉइंट संख्याओं के रूप में रखी जाती हैं। इससे 53 बिट की परिशुद्धता मिलती है (मैनुअल में तालिका 16.3 देखिए)। दुर्भाग्य से, यह इस अभ्यास को पूरा करने के लिए अपर्याप्त है (स्पॉइलर अलर्ट: एक टेस्ट के लिए 63 बिट की परिशुद्धता चाहिए)।
"अपर्याप्त परिशुद्धता" ऐसी दिखती है:
$ gawk 'BEGIN {
n = 2 ^ 54
if (n == n + 1)
print "not enough precision"
else
print "OK"
}'
not enough precision
अगर संबंधित लाइब्रेरीज़ awk एक्ज़ीक्यूटेबल में कंपाइल कर दी गई हों, तो GNU awk मनमानी परिशुद्धता वाली संख्याएँ इस्तेमाल कर सकता है। अपने awk का वर्ज़न जाँचिए और देखिए कि "GNU MPFR" मौजूद है या नहीं:
$ gawk --version
GNU Awk 5.0.1, API: 2.0 (GNU MPFR 4.0.2, GNU MP 6.2.0)
...
अगर यह मौजूद है, तो -M ऑप्शन इस्तेमाल करके इस सुविधा को चालू कीजिए:
$ gawk -M 'BEGIN {
n = 2 ^ 54
if (n == n + 1)
print "not enough precision"
else
print "OK"
}'
OK
अगर मेरे awk में -M नहीं है, तो क्या करें? तब आपको कोई बाहरी प्रोग्राम कॉल करना पड़ेगा जो मनमानी परिशुद्धता का अंकगणित कर सके, जैसे bc. यह कैसे करें, इसका एक उदाहरण किसी पाइप से getline को वेरिएबल में लेने वाले हिस्से में देखिए।
आगे पढ़ने के लिए: मनमानी परिशुद्धता का अंकगणित
Exercism पर साइन अप कीजिए और AWK को 3 कॉन्सेप्ट92 अभ्यास तथा असली इंसानों से मिलने वाली मेंटरिंग के साथ सीखिए और उसमें महारत हासिल कीजिए, वह भी बिल्कुल मुफ्त।