C'era una volta un servo saggio che salvò la vita a un principe. Il re promise di pagare qualunque cosa il servo avesse potuto immaginare. Sapendo che il re amava gli scacchi, il servo disse al re che avrebbe voluto dei chicchi di grano. Un chicco sulla prima casella di una scacchiera, con il numero di chicchi che raddoppia a ogni casella successiva.
Calcola il numero di chicchi di grano su una scacchiera.
Una scacchiera ha 64 caselle. La casella 1 ha un chicco, la casella 2 ha due chicchi, la casella 3 ha quattro chicchi, e così via, raddoppiando ogni volta.
Scrivi il codice che calcola:
Per impostazione predefinita, i numeri in awk sono rappresentati come numeri in virgola mobile a doppia precisione. Questo offre 53 bit di precisione (vedi la Tabella 16.3 nel manuale). Purtroppo non bastano per completare questo esercizio (attenzione allo spoiler: un test richiede 63 bit di precisione).
Una «precisione insufficiente» si presenta così:
$ gawk 'BEGIN {
n = 2 ^ 54
if (n == n + 1)
print "not enough precision"
else
print "OK"
}'
not enough precision
GNU awk può usare numeri a precisione arbitraria, se le librerie necessarie sono state compilate all'interno dell'eseguibile awk. Controlla la versione di awk e cerca «GNU MPFR»:
$ gawk --version
GNU Awk 5.0.1, API: 2.0 (GNU MPFR 4.0.2, GNU MP 6.2.0)
...
Se è presente, abilita questa possibilità con l'opzione -M:
$ gawk -M 'BEGIN {
n = 2 ^ 54
if (n == n + 1)
print "not enough precision"
else
print "OK"
}'
OK
E se il mio awk non ha -M? Dovrai rivolgerti a un programma esterno in grado di fare aritmetica a precisione arbitraria, come bc. Guarda la sezione Usare getline per leggere una variabile da una pipe per un esempio di come si fa.
Per approfondire: Aritmetica a precisione arbitraria
Iscriviti a Exercism per imparare e padroneggiare AWK con 3 concetti92 esercizi e il mentoring di persone reali, tutto gratis.