Era uma vez um servo sábio que salvou a vida de um príncipe. O rei prometeu pagar o que o servo fosse capaz de 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 dobrando a cada casa seguinte.
Calcule o número de grãos de trigo em um 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, dobrando a cada vez.
Escreva um código que calcule:
Por padrão, os números em awk são representados como números de ponto
flutuante de precisão dupla. Isso oferece 53 bits de precisão (veja a Tabela
16.3 no manual). Infelizmente, isso não é suficiente para
concluir este exercício (alerta de spoiler: um dos testes exige 63 bits de
precisão).
"Precisão insuficiente" fica assim:
$ 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, se as
bibliotecas relevantes tiverem sido compiladas no executável do awk. Verifique
a versão do seu awk e procure 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, habilite o recurso usando 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? Você vai ter que chamar um programa
externo que consiga fazer aritmética de precisão arbitrária, como o bc. Veja a
seção Usando getline em uma variável a partir de um pipe para ver
um exemplo de como fazer isso.
Leitura adicional: Aritmética de precisão arbitrária
Crie sua conta no Exercism para aprender e dominar AWK com 3 conceitos92 exercícios e mentoria humana de verdade, tudo de graça.