Érase una vez un sirviente sabio que salvó la vida de un príncipe. El rey prometió pagarle todo lo que el sirviente fuera capaz de imaginar. Sabiendo que al rey le encantaba el ajedrez, el sirviente le dijo que le gustaría tener granos de trigo. Un grano en la primera casilla de un tablero de ajedrez, y el número de granos duplicándose en cada casilla sucesiva.
Calcula el número de granos de trigo 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:
De forma predeterminada, los números en awk se representan como números de coma flotante de doble precisión. Esto proporciona 53 bits de precisión (consulta la Tabla 16.3 del manual). Lamentablemente, no es suficiente para completar este ejercicio (alerta de spoiler: un test requiere 63 bits de precisión).
«Precisión insuficiente» tiene este aspecto:
$ gawk 'BEGIN {
n = 2 ^ 54
if (n == n + 1)
print "not enough precision"
else
print "OK"
}'
not enough precision
GNU awk tiene la capacidad de usar números de precisión arbitraria, si las bibliotecas correspondientes se han compilado en el ejecutable de awk. Comprueba 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, activa la 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? Tendrás que llamar a un programa externo que pueda hacer aritmética de precisión arbitraria, como bc. Consulta la sección Usar getline en una variable desde una tubería para ver un ejemplo de cómo hacerlo.
Para saber 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.