Треки
/
AWK
AWK
/
Вправи
/
Зернята
Зернята

Зернята

Легка

Вступ

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

Вказівки

Обчисліть кількість зерен пшениці на шахівниці.

Шахівниця має 64 клітинки. На клітинці 1 лежить одне зерно, на клітинці 2 лежать два зерна, на клітинці 3 лежать чотири зерна, і так далі, щоразу кількість подвоюється.

Напишіть код, який обчислює:

  • кількість зерен на заданій клітинці
  • загальну кількість зерен на шахівниці

GNU awk й арифметика довільної точності

Типово числа в 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 для читання з каналу у змінну, де наведено приклад, як це зробити.

Додаткова література: Арифметика довільної точності

Редагувати через GitHub Посилання відкривається в новому вікні або вкладці
AWK Exercism

Час розпочати Зернята?

Зареєструйтеся на Exercism, щоб вивчати й опановувати AWK, а також 3 концепції92 вправи та справжнє наставництво від людей, і все це безкоштовно.