একদা এক জ্ঞানী ভৃত্য এক রাজপুত্রের প্রাণ বাঁচিয়েছিলেন। রাজা কথা দিলেন, ভৃত্যটি যা কিছু চাইতে পারে তিনি তাই দেবেন। রাজা যে দাবা ভালোবাসেন তা জেনে ভৃত্যটি রাজাকে বললেন, তিনি কিছু গমের দানা চান। দাবাবোর্ডের প্রথম ঘরে এক দানা, আর পরের প্রতিটি ঘরে দানার সংখ্যা দ্বিগুণ হয়ে চলবে।
দাবা বোর্ডে গমের দানার সংখ্যা হিসাব করুন।
দাবা বোর্ডে ৬৪টি ঘর থাকে। ১ নম্বর ঘরে একটি দানা, ২ নম্বর ঘরে দুটি দানা, ৩ নম্বর ঘরে চারটি দানা, এভাবেই প্রতি ঘরে দানার সংখ্যা দ্বিগুণ হতে থাকে।
এমন কোড লিখুন যা হিসাব করে:
ডিফল্টভাবে awk-এ সংখ্যাগুলো ডাবল-প্রিসিশন ফ্লোটিং পয়েন্ট সংখ্যা হিসেবে উপস্থাপিত হয়। এতে ৫৩ বিট প্রিসিশন পাওয়া যায় (ম্যানুয়ালের সারণি ১৬.৩ দেখুন)। দুর্ভাগ্যবশত, এই অনুশীলনীটি সম্পূর্ণ করতে এটি যথেষ্ট নয় (স্পয়লার অ্যালার্ট: একটি টেস্টে ৬৩ বিট প্রিসিশন দরকার)।
"যথেষ্ট প্রিসিশন নেই" দেখতে এরকম হয়:
$ gawk 'BEGIN {
n = 2 ^ 54
if (n == n + 1)
print "not enough precision"
else
print "OK"
}'
not enough precision
GNU awk-এর আরবিট্রারি-প্রিসিশনের সংখ্যা ব্যবহারের ক্ষমতা আছে, যদি সংশ্লিষ্ট লাইব্রেরিগুলো 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টি অনুশীলনী আর সত্যিকারের মানুষের মেন্টরিং দিয়ে শিখুন ও দক্ষ হয়ে উঠুন, সম্পূর্ণ বিনামূল্যে।