Analicemos si Google se equivoca con las matemáticas

Si al leer Google en el título del post piensan que voy a hablar de Chrome se equivocan. No me gusta escribir de temas que, de tanto ser mencionados en todos los blogs, ya se tornaron aburridos. En cambio voy a hablar de un supuesto error de Google, que se difundió por algunos blogs hace un  par de semanas, saliéndome bastante de la temática linuxera del blog, pero tratando un poco un tema importante en el cálculo por computadora.

El error surgía al realizar la operación 399999999999999-399999999999998 a través del buscador de Google. Esta clase de errores ocurren en todo programa de computación que realice cálculos, debido a la manera en que trabajan con los números. En este post voy a explicar el motivo de este error.

Para entender por qué ocurren esta clase de errores debemos, en primer lugar, conocer la manera en la que las computadoras guardan los números con los que deben operar y la manera en la que trabajan.

Imaginemos que ingresamos un número en la computadora, al que luego se le realizará una operación. Este número es almacenado en la memoria. Para imaginar un poco como se almacena este número, podemos intentar ver a la memoria como un conjunto de celdas, donde el contenido de una celda es un bit (1 o 0), que representa un dígito binario. Dependiendo del tipo de número que ingresemos, va a cambiar la cantidad de casilleros que necesitemos para guardarlo.

¿Cómo se distribuyen los números entre las celdas de memoria?

Hay diferentes maneras de guardar los datos en estos casilleros, siendo la más usada en los cálculos de precisión la notación de punto flotante. Puede esquematizarse de esta manera:


Podemos representar un número real x como x=m*2^e (el 2 es debido a que se trabaja con un sistema binario), donde:
m=mantisa: representa los dígitos que se usan al operar. Son los más significativos los que se almacenan (los que tienen más valor relativo). El primer dígito representa el primer dígito decimal del número, ejemplo: .1011001110
e=exponente: da el orden de magnitud del número. Define el rango de número que se pueden manejar de esta manera.

No hay que dejar de mencionar que todos estos números son almacenados en forma binaria en la memoria, pero para poder verlo claramente, y no meterme innecesariamente en aritmética binaria, los ejemplos que voy a dar van a estar todos en el sistema de numeración decimal (el que usamos todos los días)

Como ejemplo podemos representar el número 456 en la notación de punto flotante. Lo podemos escribir de esta manera:

456=.456*10^3

¿Qué sucede cuando el número tiene muchos dígitos?

Todos sabemos que la memoria no es infinita, por lo que para representar algunos números tenemos algunos problemas, ya que pueden tener una cantidad grande, o incluso infinita, de cifras.

Supongamos que tomamos como espacio de almacenamiento para nuestro número 32 bits en memoria, como se usa generalmente para representar números decimales, salvo en cálculos de precisión, que suelen usarse 64 bits.

Usando 32 bits, puede demostrarse que pueden representarse números con una precisión de 8 dígitos, por lo que los dígitos que nos sobren deben ser descartados, redondeando el número que realmente almacenamos, para que el descarte no provoque tanto error.

¿Y esto como afecta al resultado que nos da Google?

El caso del número que hizo noticia con Google se representaría así:

399999999999999=.40000000*10^16

Ahora veamos como sería el otro de los número, representado también con la notación de punto flotante de 32 bits:

399999999999998=.40000000*10^16

Ahora que sabemos como se guardan los números, hagamos la resta como si fuesemos la calculadora de Google:

399999999999999-399999999999998=.40000000*10^16-.40000000*10^16=0

Podemos ver que el resultado al que llegamos es 0. Podríamos haber obtenido el resultado que queríamos haciendo que los números ocupen una mayor cantidad de bites, aumentando la precisión, pero necesitaríamos duplicar el uso de la memoria para algo que no es tan necesario para una calculadora de funciones básicas. Tampoco el aumentar el tamaño del número es una solución que funciona para todos los casos, ya que incluso en aplicaciones de cálculo, como el Scilab, hay que tener cuidado con el orden de las operaciones, para que no ocurra que para la computadora dos números distintos se vean como iguales.

En conclusión puede decirse que Google no se equivoca con las matemáticas, sino que no es lo suficientemente preciso.

Leave a Reply

Connect with Facebook