Las floats son raras
La aritmética de coma flotante a menudo sorprende a los programadores porque aproxima números reales y puede perder precisión en operaciones comunes como restar valores casi iguales, como ilustran ejemplos con `exp(x) - 1` y técnicas para “cancelar” el ruido numérico. Los comentarios exploran conceptos de análisis numérico como la cancelación catastrófica, reformulaciones estables (por ejemplo, usar `expm1` o formas algebraicas alternativas) y herramientas como la sumación de Kahan o Herbie que ayudan a reescribir fórmulas para obtener mayor precisión. Un tema importante es cuándo los floats son inapropiados —especialmente para dinero y contabilidad— y cómo la educación, las bibliotecas y los tipos numéricos alternativos (decimal, punto fijo, enteros grandes) son cruciales para usar el cómputo numérico con seguridad.
Comportamiento de los floats y cancelación catastrófica
- Muchos comentarios recalcan que los floats no son tanto “raros” como aproximaciones de precisión limitada a los reales; restar valores casi iguales inevitablemente hace perder dígitos significativos.
- Se comenta el ejemplo “mágico” del artículo: la función
g(x) = (exp(x)-1)/log(exp(x))cancela en gran medida el ruido de redondeo compartido entre numerador y denominador, mientras quef(x) = (exp(x)-1)/xno lo hace. - Esta cancelación solo funciona dentro de un rango; para
xmuy pequeño se rompe (por ejemplo, división por cero cuandolog(exp(x))se redondea a 0). - Varios señalan que esto trata de estabilidad algorítmica, no solo de que “los floats sean malos”.
Técnicas numéricas y herramientas
- Recomendación: usar
expm1(x)paraexp(x)-1cerca de cero; se destacamath.expm1de Python, incluida su implementación inspirada en Kahan. - Reglas generales:
- Evitar restar números casi iguales.
- Evitar sumar números con magnitudes muy diferentes.
- Para sumas, usar Kahan o sumación por pares, o sumar primero los términos de menor magnitud.
- Calcular desplazamientos desde 1 (por ejemplo,
expm1) cuando los valores estén cerca de 1.
- Se menciona Herbie como una herramienta que sugiere reformulaciones más estables.
- Se citan algunas bibliotecas (por ejemplo,
decimal.js) y el hecho de que muchos lenguajes exponen IEEE-754 y funciones delibmde C, a veces con sus propios arreglos para inexactitudes conocidas.
Floats frente a dinero y cálculos empresariales
- Postura firme: nunca usar floats para contabilidad; usar enteros o tipos decimal para evitar sorpresas de redondeo en facturas, precios y totales visibles para clientes.
- Postura contraria: para muchos modelos financieros (intereses, bonos, opciones, simulaciones de riesgo), los floats son la herramienta correcta; la incertidumbre de las entradas supera el redondeo de céntimos, y los enfoques enteros/de punto fijo se vuelven complejos y frágiles.
- Punto intermedio:
- Usar formatos exactos de entero/decimal para almacenamiento, liquidación y aritmética orientada al cliente.
- Usar floats en capas analíticas/de previsión donde los céntimos exactos son menos críticos.
- Se habla de decimal flotante (IEEE decimal, hardware de IBM) y de punto fijo de “céntimos enteros” como alternativas, cada una con sus compromisos.
Educación, numerica como disciplina
- Varios sostienen que los malentendidos vienen de una mala educación: los estudiantes aprenden reales y luego se les dan floats sin enseñarles representación, redondeo o estabilidad.
- Se destaca el análisis numérico como una disciplina completa; la estabilidad algorítmica y el análisis de errores importan tanto como la elección del formato numérico.