jueves, 4 de agosto de 2016

Las potencias de 2 y la precisión de las hojas de cálculo

Hace unos días un compañero del departamento de matemáticas estaba intentando calcular con una hoja de cálculo el resultado de 2^64 para acompañar la leyenda del premio que ofrecio un rey al creador del ajedrez. Y se encontró con la sorpresa de que la hoja de cálculo que estaba usando da un resultado incorrecto.Veamos paso a paso las distintas facetas de esta historia.

Primero, la leyenda ilustradora. Un rey de la India tuvo a bien querer agradecer a un súbdito el invento d  un juego de tablero que le tenía totalmente absorbido y entusiasmado: el ajedrez. Así que decidió hecerle un obsequio. Y tan agradecido estaba que le dijo a este sabio que pidiese lo que quisiese ya que era un rey muy rico y poderoso (y así,  ya de paso presumía de ser rico, poderoso y generoso). En esto que el sabio le pidió algo que le pareció al rey poquita cosa: "Soy un hombre de necesidades limitadas, me conformo con que me des 1 grano de arroz por el primer escaque del tablero 2 por el segundo, 4 por el tercero y así hasta llegar al número 64". Seguramente el rey encargo este calculo a sus contables y la conclusión fue sorprendente, al menos para el rey y sus contables. No había suficiente arroz en todo el reino. Ni siquiera hay suficiente arroz en todo el mundo hoy en día para satisfacer la demanda del sabio del ajedres ya que el número de granos necesario es de 18,446,744,073,709,551,616. Suponiendo que cada grano pese unos 0,026 g necesitaríamos 494.378.475.966 toneladas, mientras que la producción mundial actual es de 481 millones de toneladas/año.

Segundo, ¿cómo nos damos cuenta de que la hoja de cálculo da un resultado incorrecto? Muy fácil. Si nos fijamos en los resultados de la primera columna en la que se expone el resultado de elevar 2 a los distintos números naturales. Nos fijamos en la cifra de la unidades y vemios que las potencias de 2 van pasando por este ciclo 2, 4, 8, 6, 2, ... y vuelta a empezar. Pero en la columna nombrada esto se cumple hasta la fila 49 y a partir de ahí la cifra de las  unidades se convierte en 0 para siempre. Esto es falta de precisión en los cálculo del programa no es que las matemáticas de multiplicar por 2 hayan cambiado.

Tercero, ¿y porqué no funciona la hoja de cálculo a partir de esa fila?  El número entero mayor que se puede manejar en las hojas de calculo actuales sin aproximaciones ni redondeos es 10^15. Más allá podemos usar potencias de 10 dando el número como el producto de un número con esta precisión y el exponente de una potencia de 10 de la siguiente forma 9,999999999999999 x10^n, de esta manera el tamaño del número es casi inacabable, pero la cantidad de cifras significativas sigue siendo como mucho 15 cifras.

Cuarto y final, ¿cómo se puede hacer esta cuenta de forma exacta en una hoja de cálculo?  Muy fácil, volviendo a usar lo que aprendimos en primaria: la multiplicación con llevadas. Tenemos dos columnas una para "unidades" y otra para "decenas" siendo estas números inferiores a 10^15 (en este caso he puesto como límite 10^12, es decir, un númreo de 12 cifras). Cuando se sobrepasa ese límite se corta el número a 12 cifras y se "lleva" 1 a las "decenas" sumándolo. Como mucho la llevada puede ser de +1 ya que para pasar de un número al siguiente multiplicamos el anterior por 2 (2x9 = 18). Desupés se forma el número resultado concatenando (uniendo) las dos columnas, primero las "decenas" y luego las "unidades" para dar 18,446,744,073,709,551,616.

Ver más:

Potencias de 2 (hoja de calculo libreoffice) 
Potencias de 2 (archivo pdf)


Números enteros en los lenguajes de programación 

Aquí vamos a meternos en las tripas de los programas y de los ordenadores. Ya sabemos que los ordenadores realizan los cálculos en código binario, por ejemplo el número 10 se expresaria como 10100 = 1·2^3 + 0·2^2 + 1·2^1 + 0·2^0. Se usa este formato por que cada 1 y cada 0 es una posición de memoria que solo puede tener 2 estados: encendida o apagada. Por eso tenemos varios tamaños de números enteros y con precisión perfecta pero tamaño limitado. la lista con los distintos tipos de números usados en los lenguak¡jes de programacion como Free Pascal empezaría con el byte que se compone de 8 cifras binarias y alcanza el valor máximo de 2^8 - 1 = 255, word con 16 bits y tamaño máximo 65535, longword con 32 bits y tamaño máximo 4,294,967,295.

Ordinal type in Free Pascal

No hay comentarios:

Publicar un comentario