Il était une fois un serviteur sage qui sauva la vie d'un prince. Le roi promit de payer tout ce que le serviteur pourrait imaginer. Sachant que le roi aimait les échecs, le serviteur lui dit qu'il aimerait recevoir des grains de blé. Un grain sur la première case d'un échiquier, le nombre de grains doublant à chaque case suivante.
Calcule le nombre de grains de blé sur un échiquier.
Un échiquier comporte 64 cases. La case 1 contient un grain, la case 2 en contient deux, la case 3 en contient quatre, et ainsi de suite, en doublant à chaque fois.
Écris du code qui calcule :
Par défaut, les nombres en awk sont représentés par des nombres à virgule flottante en double précision. Cela offre 53 bits de précision (voir la Table 16.3 du manuel). Malheureusement, ce n'est pas suffisant pour venir à bout de cet exercice (attention, spoiler : un test nécessite 63 bits de précision).
« Précision insuffisante » ressemble à ceci :
$ gawk 'BEGIN {
n = 2 ^ 54
if (n == n + 1)
print "not enough precision"
else
print "OK"
}'
not enough precision
GNU awk peut utiliser des nombres à précision arbitraire, si les bibliothèques nécessaires ont été compilées dans l'exécutable awk. Vérifie la version de ton awk et cherche « GNU MPFR » :
$ gawk --version
GNU Awk 5.0.1, API: 2.0 (GNU MPFR 4.0.2, GNU MP 6.2.0)
...
Si elle est présente, active cette fonctionnalité avec l'option -M :
$ gawk -M 'BEGIN {
n = 2 ^ 54
if (n == n + 1)
print "not enough precision"
else
print "OK"
}'
OK
Et si ton awk ne gère pas -M ? Tu devras alors faire appel à un programme externe capable de faire de l'arithmétique à précision arbitraire, comme bc. Voir la section Utiliser getline pour lire dans une variable depuis un pipe pour un exemple.
Pour aller plus loin : Arithmétique à précision arbitraire
Inscris-toi sur Exercism pour apprendre et maîtriser AWK avec 3 concepts92 exercices, et un vrai mentorat humain, le tout gratuitement.