Números de base N y su precisión.

Todos los sistemas numéricos posicionales (números de base-N) comparten el mismo problema de  precisión

La mayoría de los lenguajes de programación, se basan en el estándar IEEE 754.

La cuestión,  es que los números se representan en este formato como un número entero multiplicado por una potencia de dos; los números racionales (como 0.1, que es 1/10) cuyo denominador no es una potencia de dos, no se pueden representar de forma exacta.

Para 0.1 en el formato estándar binario64, la representación se puede escribir en decimal exactamente como 0.1000000000000000055511151231257827021181583404541015625, o 0x1.999999999999ap-4 en notación C99 hexfloat.

Sin embargo, el número racional 0.1, que es 1/10, se puede escribir exactamente como 0,1 en decimal, o 0x1.99999999999999 … p-4, en un análogo de la notación hexfloat C99, donde … representa una secuencia interminable de 9.

Las constantes 0.2 y 0.3  por ejemplo, también tendrán aproximaciones a sus valores verdaderos.

Pero sucede que el doble más cercano a 0.2 es mayor que el número racional 0.2, mientras  que el doble más cercano a 0.3 es menor que el número racional 0.3.

La suma de 0.1 y 0.2 termina siendo mayor que el número racional 0.3.

Un tratamiento bastante completo de las cuestiones de la aritmética de coma flotante puede leerse en What Every Computer Scientist Should Know About Floating-Point Arithmetic, o en floating-point-gui.de, ambos en ingles.

Los números decimales con base 10, tienen los mismos problemas, por ejemplo  números como 1/3 terminan como 0.333333333 .

En la práctica, este problema de precisión significa que se necesita usar funciones de redondeo para redondear sus números de coma flotante a la cantidad de decimales que le interesen antes de mostrarlos.

También debe reemplazar las pruebas de igualdad con comparaciones que permitan cierta tolerancia, lo que significa:

No hacer si (x == y) {...}

En su lugar, haga if (abs (x - y) <mi valor de tolerancia) {...}.

Donde abs es el valor absoluto.,mi valor de tolerancia es un valor que eliges  para tu aplicación,  ( no debe ser una constante de estilo «épsilon») y tendrá mucho que ver con el «margen de maniobra» que estés dispuesto a permitir y cuál será el número más grande que va a comparar.

Mas de cien pupilas, donde vernos vivos …..

J. Sabina