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 que f(x) = (exp(x)-1)/x no lo hace.
  • Esta cancelación solo funciona dentro de un rango; para x muy pequeño se rompe (por ejemplo, división por cero cuando log(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) para exp(x)-1 cerca de cero; se destaca math.expm1 de 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 de libm de 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.