Era uma vez um servo sábio que salvou a vida de um príncipe. O rei prometeu pagar tudo o que o servo conseguisse imaginar. Sabendo que o rei adorava xadrez, o servo disse ao rei que gostaria de receber grãos de trigo. Um grão na primeira casa de um tabuleiro de xadrez, com o número de grãos a duplicar em cada casa seguinte.
Calcula o número de grãos de trigo num tabuleiro de xadrez.
Um tabuleiro de xadrez tem 64 casas. A casa 1 tem um grão, a casa 2 tem dois grãos, a casa 3 tem quatro grãos, e assim por diante, duplicando a cada casa.
Escreve código que calcule:
Por omissão, os números em awk são representados como números de vírgula
flutuante de precisão dupla. Isto dá 53 bits de precisão (ver a Tabela
16.3 no manual). Infelizmente, isto não chega para completar
este exercício (aviso de spoiler: um dos testes exige 63 bits de precisão).
Uma precisão insuficiente tem este aspeto:
$ gawk 'BEGIN {
n = 2 ^ 54
if (n == n + 1)
print "not enough precision"
else
print "OK"
}'
not enough precision
O GNU awk tem a capacidade de usar números de precisão arbitrária, desde que
as bibliotecas relevantes tenham sido compiladas no executável awk. Verifica
a tua versão do awk e procura por "GNU MPFR":
$ gawk --version
GNU Awk 5.0.1, API: 2.0 (GNU MPFR 4.0.2, GNU MP 6.2.0)
...
Se estiver presente, ativa essa capacidade com a opção -M:
$ gawk -M 'BEGIN {
n = 2 ^ 54
if (n == n + 1)
print "not enough precision"
else
print "OK"
}'
OK
E se o meu awk não tiver a opção -M? Vais ter de chamar um programa
externo capaz de fazer aritmética de precisão arbitrária, como o bc. Vê a
secção Usar o getline numa variável a partir de um pipe para
veres um exemplo de como fazer isto.
Leitura adicional: Aritmética de precisão arbitrária
Inscreve-te no Exercism para aprenderes e dominares AWK com 3 conceitos92 exercícios, e mentoria humana real, tudo grátis.