Жив колись мудрий слуга, який урятував життя принцу. Король пообіцяв дати йому все, що той зможе забажати. Знаючи, що король любить шахи, слуга попросив зерна пшениці. Одне зерно на першій клітинці шахівниці, а на кожній наступній кількість зерен подвоюється.
Обчисліть кількість зерен пшениці на шахівниці.
Шахівниця має 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
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 вправи та справжнє наставництво від людей, і все це безкоштовно.