روزی روزگاری، خدمتکار دانایی بود که جانِ شاهزادهای را نجات داد. پادشاه وعده داد هر آنچه خدمتکار به ذهنش برسد، بپردازد. خدمتکار که میدانست پادشاه عاشق شطرنج است، به پادشاه گفت که دانههای گندم میخواهد. یک دانه روی خانهی اول صفحهی شطرنج و در هر خانهی بعدی، تعداد دانهها دو برابر میشود.
تعداد دانههای گندم روی یک صفحهی شطرنج را محاسبه کنید.
یک صفحهی شطرنج ۶۴ خانه دارد. خانهی ۱ یک دانه دارد، خانهی ۲ دو دانه دارد، خانهی ۳ چهار دانه دارد و به همین ترتیب، هر بار دو برابر میشود.
کدی بنویسید که این موارد را محاسبه کند:
بهطور پیشفرض، اعداد در awk بهصورت اعداد اعشاری شناور با دقت مضاعف نمایش داده میشوند. این ۵۳ بیت دقت فراهم میکند (به جدول ۱۶٫۳ در راهنما نگاه کنید). متأسفانه این برای کامل کردن این تمرین کافی نیست (هشدار لو دادن مطلب: یکی از testها به ۶۳ بیت دقت نیاز دارد).
«دقت ناکافی» چنین چیزی است:
$ 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 برای خواندن از یک لوله در یک متغیر را ببینید.
مطالعهی بیشتر: محاسبات با دقت دلخواه