Había una vez un sirviente sabio que salvó la vida de un príncipe. El rey prometió pagarle lo que el sirviente fuera capaz de imaginar. Como sabía que al rey le encantaba el ajedrez, el sirviente le dijo que quería granos de trigo. Un grano en la primera casilla de un tablero de ajedrez, y el número de granos se duplicaba en cada casilla siguiente.
Calcula la cantidad de granos de trigo que hay en un tablero de ajedrez.
Un tablero de ajedrez tiene 64 casillas. La casilla 1 tiene un grano, la casilla 2 tiene dos granos, la casilla 3 tiene cuatro granos, y así sucesivamente, duplicándose cada vez.
Escribe código que calcule:
Por defecto, los números en awk se representan como números de punto flotante de doble precisión. Esto brinda 53 bits de precisión (ver la tabla 16.3 del manual). Lamentablemente, no alcanza para completar este ejercicio (alerta de spoiler: una prueba requiere 63 bits de precisión).
«Precisión insuficiente» se ve así:
$ gawk 'BEGIN {
n = 2 ^ 54
if (n == n + 1)
print "not enough precision"
else
print "OK"
}'
not enough precision
GNU awk puede usar números de precisión arbitraria si las bibliotecas correspondientes se compilaron en el ejecutable de awk. Verifica tu versión de awk y busca «GNU MPFR»:
$ gawk --version
GNU Awk 5.0.1, API: 2.0 (GNU MPFR 4.0.2, GNU MP 6.2.0)
...
Si está presente, habilita esa capacidad con la opción -M:
$ gawk -M 'BEGIN {
n = 2 ^ 54
if (n == n + 1)
print "not enough precision"
else
print "OK"
}'
OK
¿Y si mi awk no tiene -M? Vas a tener que llamar a un programa externo que pueda hacer aritmética de precisión arbitraria, como bc. Consulta la sección Usar getline hacia una variable desde una tubería para ver un ejemplo de cómo hacerlo.
Para leer más: Aritmética de precisión arbitraria
Regístrate en Exercism para aprender y dominar AWK con 3 conceptos92 ejercicios y mentoría humana real, todo gratis.