Erik Wiffin resume perfectamente en esta página web con el curioso nombre de 0.30000000000000004.com uno de los problemas de la representación matemática de los números en coma flotante que utilizan los ordenadores, o más bien los lenguajes que se usan los ordenadores.
Todos números se almacenan con una cantidad limitada de dígitos. A veces, al cambiar de una base a otra (por ejemplo de base 10 a base 2, binario), se pierde parte de esa información y al operar con ella se amplifica el problema creando un poco de confusión. En el ejemplo que produce el curioso nombre de la página, al convertir 0,1 y 0,2 a binario la secuencia de dígitos binarios es repetitiva (aunque ambos son «números redondos» en base 10). El resultado es que en muchos lenguajes al calcular luego 0,1 + 0,2 con esos dígitos y volver a convertirlo a decimal el resultado no es exactamente 0,3 como cabría esperar.
La página muestra lo que aparece como resultado al usar diversos lenguajes: Ada, C, C++, C#, Common Lisp, Erlang, Fortran, Go, Roku, Java, MathLab, Mathematica, PHP, Perl, Python, R, TCL, Visual Basic y otros más esotéricos. En cada uno de ellos se calcula la suma (0,1+0,2) y se muestra el resultado (0,3; 0,30000000000000004; 0,300000; 0.300000012; 0.2999999999999999888977697537… hay de todo). A veces se indican comentarios y trucos sobre cómo obtener los dígitos, formateando el resultado o definiendo la precisión en la configuración.
Hay más detalles sobre todo esto en el IEEE 754-2008 que es el estándar para aritmética en coma flotante y en What Every Computer Scientist Should Know About Floating-Point Arithmetic, un estupendo artículo al respecto.
§
Me hizo gracia que todo esto concidiera con que Amazon me enviara un correo de confirmación acerca de un pedido con el número de seguimiento en coma flotante, algo así como 6.29775E+22. ¡Cosas de las conversiones descarriadas!
Relacionado: