jueves, 3 de abril de 2008

Errores bajo los puntos. Un pecado grave.


Los ordenadores no lo saben todo. En particular, ni siquiera saben qué es exactamente el número 0.3, lo cual, para una máquina supuestamente ideada para el cómputo, parece un pecado bastante grave.

La culpa la tienen la representación binaria y la aritmética de punto flotante, cuyas limitaciones he podido recordar hoy mismo, cuando se recomienda usar JavaScript en cálculos tan aparentemente sencillos como estos:

var a = 0.333 * 100; // Debería resultar 33.3
alert(a); // Pero da 33.300000000000004

var b = 0.119 * 100; // Debería resultar 11.9
alert(b); // Pero da 11.899999999999998

Naturalmente existen mecanismos para solventar este tipo de incordios numéricos en el plano de la utilidad práctica, pero resulta interesante no olvidar los problemas inherentes al hecho de tratar de representar un espacio infinito de números (los números reales) con una cantidad finita de bits.


La representación en punto flotante implica transformaciones o mapeos de infinito-a-uno, lo que trae como consecuencias los siguientes problemas:

* Errores de redondeo: la mayoría de los números reales no son representables exactamente en formatos binarios de punto flotante, lo que hace que números para nosotros tan sencillos como 0.1, 0.2, 0.3, 0.4, 0.6, 0.7, 0.8, y 0.9 sean inconcebibles (en sentido exacto) para nuestro ordenador.

* Imprecisiones en los cálculos: incluso cuando los operandos sean exactamente representables en punto flotante, el resultado de una operación probablemente no lo sea, por lo que se generarán errores de redondeo que además se pueden ir acarreando en sucesivas operaciones.

* Pérdida de propiedades básicas: como la asociatividad de la suma y el producto, o la propiedad distributiva de sumas y multiplicaciones. Por los problemas de precisión y redondeo mencionados, podemos encontrar ambigüedad en ciertas expresiones (como w = x + y + z, por ejemplo), al tratar de trasladarlas al espacio de punto flotante.

En buena parte de los usos prácticos, estos redondeos son perfectamente asumibles siempre que se manejen con cuidado. Y para las aplicaciones que requieren un grado de exactitud mayor, muchos lenguajes de programación incorporan otros formatos y representaciones más apropiadas para el cálculo con la precisión arbitraria que necesitemos.

Ya en el terreno de lo humano, tampoco parece haber consenso en la representación escrita de los números reales, pues hay cierta división de opiniones en cuanto al símbolo empleado para separar las cifras pertenecientes a las partes entera y decimal de una cantidad. El privilegio se lo disputan la coma, el punto y, en menor medida, el momayyez. Personalmente defiendo el primero, aunque los ordenadores tienen cierto favoritismo hacia el punto y es el que he usado en este artículo para evitar confusiones con la coma ortográfica.

Adolfocanals@educ.ar

No hay comentarios: