Inicio · Parte 01 — Aritmética computacional y representación numérica
forma ingenua: √(x²+1) − x
forma estable: 1 / (√(x²+1) + x)
La cancelación catastrófica es el fenómeno más peligroso de la aritmética de punto flotante porque no produce ninguna señal. Al restar dos números que coinciden en sus primeros k dígitos, esos dígitos se anulan y el resultado queda formado por los dígitos de menor peso, que son precisamente los contaminados por el redondeo previo. El error absoluto se mantiene; el resultado se hace pequeño; el error relativo explota.
El caso canónico es √(x²+1) − x para x grande. Con x = 10⁸, ambos términos valen aproximadamente 10⁸ y coinciden en unos 16 dígitos, que son todos los que hay. El resultado de la resta es esencialmente ruido. La forma algebraicamente equivalente 1/(√(x²+1) + x) —obtenida multiplicando y dividiendo por el conjugado— no tiene resta y da el resultado correcto.
El patrón se repite en toda la matemática computacional: exp(x) − 1 para x pequeño (por eso existe expm1), log(1 + x) para x pequeño (log1p), la fórmula cuadrática cuando b² ≫ 4ac (clase 036), y la varianza calculada como E[X²] − E[X]² en lugar de con la fórmula de dos pasos.
La regla práctica es reconocible: cada vez que una fórmula reste dos cantidades que pueden ser casi iguales, hay que buscar una forma alternativa. Casi siempre existe, y obtenerla es álgebra elemental —racionalizar, factorizar, usar una identidad—, no análisis numérico avanzado.
La misma expresión por dos caminos con x = 10⁸.
Ingenua: √(10¹⁶ + 1) − 10⁸
= 100000000.00000001 − 100000000
= 7.45e−09 ← casi todo ruido
Estable: 1 / (√(10¹⁶+1) + 10⁸)
= 1 / 200000000.00000001
= 5.0e−09 ← correcto
Diferencia relativa entre ambas: ~49 %
Dígitos significativos de la ingenua: ~0
Las dos expresiones son idénticas en ℝ. En float64 una es útil y la otra no.
Dos fórmulas algebraicamente iguales con precisión muy distinta.
python classes/part-01-aritmetica-computacional-y-representacion-numerica/032-cancelacion-catastrofica/lab.py
compmath run 032
xformula_ingenua_sqrt(x^2+1)-xformula_estable_1/(sqrt(x^2+1)+x)diferenciaerror_relativo_de_la_ingenuacausa{
"x": 100000000.0,
"formula_ingenua_sqrt(x^2+1)-x": 0.0,
"formula_estable_1/(sqrt(x^2+1)+x)": 5e-09,
"diferencia": 5e-09,
"error_relativo_de_la_ingenua": 1.0,
"causa": "restar dos números casi iguales destruye dígitos significativos"
}
Fórmula cuadrática, cálculo de varianza, diferencias finitas, funciones especiales y cualquier resta de magnitudes cercanas. expm1 y log1p existen exactamente por esto.
float32, bfloat16 y la cuantización a int8 son decisiones de representación. Los NaN en un entrenamiento casi siempre nacen aquí, no en la arquitectura.
9780898718027, pendiente de resolver.math.expm1 y math.log1p — documentación de la herramienta que ejecuta el laboratorio · URL de la fuente primaria comprobada en Python Software Foundation (2026-08-19).