Inicio · Parte 01 — Aritmética computacional y representación numérica
error de la suma ingenua: O(n·ε)
error de la suma compensada (Kahan): O(ε)
Cada operación en punto flotante introduce un error de a lo sumo medio ULP. Al sumar n términos, esos errores se acumulan, y en el peor caso el error total crece proporcionalmente a n·ε. Con un millón de sumandos y ε ≈ 2·10⁻¹⁶, el error relativo puede llegar a 2·10⁻¹⁰: se han perdido seis dígitos por el simple hecho de sumar muchas veces.
La suma compensada de Kahan (1965) resuelve el problema arrastrando explícitamente el error de cada paso: guarda en una variable auxiliar lo que se perdió al redondear y lo reinyecta en la siguiente suma. El coste es cuatro operaciones en lugar de una, y el error pasa a ser independiente de n. Python ofrece math.fsum, que usa un algoritmo aún más preciso y devuelve la suma correctamente redondeada.
El orden de la suma también importa. Sumar de menor a mayor magnitud reduce el error, porque evita que los términos pequeños caigan por debajo del ULP del acumulado. Es el motivo por el que algunas bibliotecas ordenan antes de sumar en cálculos críticos.
En deep learning esto aparece al acumular la pérdida sobre un lote grande o al reducir gradientes entre dispositivos. Los frameworks acumulan en float32 aunque el cálculo sea en float16 precisamente para que el acumulador tenga más precisión que los sumandos.
Acumular un millón de veces 0.1.
Suma ingenua de 1e6 términos de 0.1:
resultado 99999.99999808663
exacto 100000.0
error abs 1.91e−03
error rel 1.91e−08 ← se perdieron ~8 dígitos
math.fsum([0.1]*1000) − 100.0 = 0.0
(correctamente redondeada)
Coste: fsum es más lento, pero el error no crece con n.
Cómo crece el error al sumar 10^6 veces un valor no representable.
python classes/part-01-aritmetica-computacional-y-representacion-numerica/034-propagacion-de-errores/lab.py
compmath run 034
n_sumassuma_acumuladavalor_exactoerror_absolutoerror_relativosuma_compensada_fsumrecomendacion{
"n_sumas": 1000000,
"suma_acumulada": 100000.00000133288,
"valor_exacto": 100000.0,
"error_absoluto": 1.3328826753422618e-06,
"error_relativo": 1.3328826753422619e-11,
"suma_compensada_fsum": 0.0
}
Sumas de grandes conjuntos de datos, integración numérica, acumulación de pérdida y reducción de gradientes. math.fsum, numpy.sum con dtype ampliado y la acumulación en float32 responden a este problema.
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.
10.1145/363707.363723 verificado en Crossref (2026-08-19).math.fsum — documentación de la herramienta que ejecuta el laboratorio · URL de la fuente primaria comprobada en Python Software Foundation (2026-08-19).