Dinahosting

Tu computadora tiene huecos

en

La ilusión de la precisión absoluta en informática

Siempre pensamos en una computadora como una máquina precisa y veloz. Normalmente los errores son provocados por el programador, pero quizá os sorprenda saber que nuestra computadora, funcionando perfectamente, también puede llevarnos a cometer errores. Un ejemplo de ello es cuando sumamos 100 veces la cifra 0.1 y el resultado no es 10 en el lenguaje de programación Python:

Error de suma en Python
Precisión de un ordenador
¿Hasta qué punto es un ordenador preciso? El lenguaje de programación Python no redondea los resultados obtenidos con números reales, lo que puede llevar a errores.

Este no es un problema único de Python. De hecho, podéis comprobarlo en vuestra hoja de cálculo favorita: colocad 100 celdas con 0.1 y sumadlas. Veréis que el resultado es 10. Ahora id a formato de la celda e indicad que queréis 15 decimales. El resultado ya no es 10.

¿Cómo almacena una computadora los números reales?

Cuando trabajamos con números enteros, una computadora es precisa en el amplio sentido de la palabra. El único límite es el tamaño de los números que podemos almacenar. Si usamos 64 bits para almacenar un número, podemos llegar a representar más de un trillón de números, suficientes para tenernos entretenidos durante toda la vida del universo y más allá.

Todo cambia cuando nos movemos al mundo de los números reales. Os propongo un pequeño ejercicio mental: ¿Cuántos números reales hay en este intervalo?

Intervalo real [0,1]

Pues para empezar, en este intervalo nos cabría el trillón de números del que hablábamos antes, y muchos más, porque hay infinitos números reales entre el cero y el uno. Cuando trabajamos con números reales y requerimos precisión, los programadores debemos tener muy en cuenta cómo representa los números una computadora para evitar errores.

Coma flotante y el estándar IEEE 754

Lo primero que hemos hecho ha sido normalizar los números, quedándonos con el signo, la mantisa y el exponente. A esta forma de representar los números se le denomina coma flotante. El estándar IEEE 754 define cómo se utilizan estos números en la mayoría de las computadoras actuales.

Formato IEEE 754
Bits usados para el almacenamiento de coma flotante de 64 bits. 1 bit para el signo, 11 para el exponente y 52 para la mantisa.

¿Y por qué 0.1 sumado 100 veces no es 10? Aquí aparece un error que nos provoca el cambio a sistema binario. Hay números decimales, como el 0.1, que no se pueden representar de forma exacta en sistema binario, lo que genera una sucesión infinita en la mantisa y, por tanto, un error de redondeo inevitable.

Este es un post de nuestro socio J. M. Morales «El Zombi de Schrödinger», que escribe el blog «Cuanto Zombi».

¿Por qué Python dice que 0.1 sumado 100 veces no es 10?

Se debe a que el número 0.1 no tiene una representación exacta en sistema binario, generando errores de redondeo en la mantisa de la coma flotante.

¿Qué es la mantisa en computación?

La mantisa o fracción representa las cifras significativas de un número almacenado en formato de coma flotante.

¿Es un problema exclusivo de Python?

No, es un comportamiento inherente a la arquitectura de las computadoras y al estándar IEEE 754, presente en casi todos los lenguajes y hojas de cálculo.

2 respuestas a «Tu computadora tiene huecos»

  1. Avatar de Dani

    Pedazo de artículo

    Muchas gracias Sr. Zombie

  2. Avatar de Mario
    Mario

    Hola.

    Me gustaría, ante todo, felicitar al autor por su sencillez al abordar esta cuestión, nada sencilla de comprender por un lego.

    En todo caso, me gustaría matizar que el texto no es del todo correcto. Espero explicarme…

    Una computadora (esto es, la parte física, lo que vemos y podemos tocar: el hardware), no tiene «huecos»… excepto si la máquina está mal diseñada, como con el famoso «bug» (error) del Pentium.

    Tampoco es habitual encontrarse con errores o «huecos» en los lenguajes de programación (como el Python que comentas), aunque han existido y, supongo, existirán en el futuro. Se suelen corregir mediante versiones del lenguaje.

    También se pueden cometer errores en los compiladores o intérpretes (como el de Python) que produzcan «huecos» (es decir, valores erróneos desde el punto de vista matemático) en las operaciones, bien fundamentales (suma, resta, multiplicación o división) o bien provenientes de un error de codificación en alguna de las funciones matemáticas (raíz cuadrada, exponencial…). Como en el caso del lenguaje, los compiladores e intérpretes se suelen corregir sacando «parches» o nuevas versiones.

    Lo que sí que puede tener (y los tiene; y muchos, además) es el software.

    Tanto cuando se realizan aplicaciones (una calculadora, una hoja de cálculo…) como cuando se almacena (en memoria o disco) el programador puede cometer errores (de redondeo, entre otros muchos) que den como resultado valores erróneos, matemáticamente hablando. Es algo inevitable y, en ocasiones, difícil de detectar.

    En fin, disculpas por este tocho y gracias, de nuevo, por el artículo.