🧮 Computational Mathematics

Inicio · Parte 01 — Aritmética computacional y representación numérica

032 — Cancelación catastrófica

basico-computacional clase 12 de 20 4 horas demostración catastrophic_cancellation

Restar dos números casi iguales destruye dígitos significativos sin producir ningún error visible.

Fórmulas

forma ingenua:  √(x²+1) − x
forma estable:  1 / (√(x²+1) + x)

Desarrollo

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.

Ejemplo trabajado

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.

Qué calcula el laboratorio

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

Salidas del laboratorio (6)

Muestra de la ejecución real

{
  "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"
}

Errores comunes

Dónde se usa

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.

Idea rectora de la parte

El error relativo, no el absoluto, es la magnitud que se propaga.

Error a evitar

Usar float para dinero en vez de Decimal o enteros de centavos.

Conexión con IA

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.

Bibliografía de la clase

Archivos de la clase