Errores ocultos: la trampa de los números flotantes

Fuentes: Floats Don't Agree With Themselves | merca.earth

Este artículo explora un problema sutil pero crítico en el cálculo geométrico: la falta de reproducibilidad de los resultados al usar números de punto flotante (floats). El autor, Gerardus Cremer, se enfrentó a una situación donde un test de superposición de polígonos funcionaba localmente pero fallaba en el servidor, a pesar de usar el mismo código y datos de entrada. La raíz del problema no era un error en su código, sino la inherente imprecisión y falta de estandarización en la forma en que los floats son representados y calculados en diferentes arquitecturas y compiladores.

El problema surge porque la norma IEEE 754 define el formato de almacenamiento de los floats, pero no su comportamiento. Diferentes implementaciones pueden realizar cálculos de manera distinta, por ejemplo, a través de la optimización FMA (Fused Multiply-Add), que reduce el número de operaciones de redondeo, o mediante la reasociación de operaciones. Incluso una pequeña diferencia de un bit en el resultado puede alterar significativamente la descomposición de un polígono, ya que el signo del producto cruzado es crucial para determinar si un vértice es convexo o reflexo.

Para solucionar este problema, Cremer desarrolló 'exact-poly', una biblioteca de geometría 2D que utiliza exclusivamente enteros (i64 e i128) en lugar de floats. Esto elimina la incertidumbre asociada con los floats y garantiza resultados reproducibles en diferentes plataformas. La biblioteca también introduce el concepto de 'SCALE', una escala de medida que permite representar coordenadas geográficas o físicas como enteros, con un margen de seguridad considerable para evitar desbordamientos. La elección de SCALE es un compromiso, ya que la aritmética entera no se escala automáticamente, y se debe elegir una escala adecuada para el problema en cuestión.

'exact-poly' demuestra que la precisión exacta en cálculos geométricos es posible, aunque requiere un diseño cuidadoso y la aceptación de ciertas limitaciones, como la necesidad de elegir una escala apropiada. El artículo destaca la importancia de comprender las sutilezas de la aritmética de punto flotante y la necesidad de buscar alternativas cuando la reproducibilidad es crítica, especialmente en aplicaciones como la geodesia, la física y la ingeniería CAD. La demostración en vivo de 'exact-poly' permite a los usuarios verificar la consistencia de los cálculos en diferentes plataformas, resaltando la importancia de la reproducibilidad en el desarrollo de software geométrico.