🧮 Computational Mathematics

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

033 — Overflow y underflow flotante

basico-computacional clase 13 de 20 4 horas demostración float_overflow_underflow

Los subnormales extienden el rango hacia el cero a costa de precisión; el overflow produce infinito y no error.

Fórmulas

float64: max ≈ 1.797e308,  min normal ≈ 2.225e−308,  min subnormal = 5e−324
inf − inf = NaN,  0/0 = NaN,  NaN != NaN

Desarrollo

El rango de float64 tiene tres zonas. Los normales van de 2.2·10⁻³⁰⁸ a 1.8·10³⁰⁸ con la precisión completa de 53 bits. Por debajo del mínimo normal están los subnormales, que renuncian al bit implícito para poder acercarse más al cero: llegan hasta 5·10⁻³²⁴ pero con precisión progresivamente menor. Por encima del máximo está el infinito.

Los subnormales existen para que la resta de dos números cercanos nunca dé cero cuando los números son distintos, propiedad conocida como gradual underflow. Sin ellos, a − b == 0 podría ser cierto con a != b, lo que rompe algoritmos que dividen por esa diferencia. La contrapartida es de rendimiento: en muchas CPU las operaciones con subnormales son órdenes de magnitud más lentas, y por eso los frameworks de deep learning ofrecen el modo flush-to-zero.

El desbordamiento no lanza excepción: produce inf, y el cálculo continúa. Esto es deliberado —permite terminar una operación vectorizada y detectar el problema al final— pero exige comprobar los resultados. El NaN aparece en las operaciones indeterminadas (inf − inf, 0/0, √(−1)) y tiene una propiedad que sorprende: no es igual a sí mismo. nan == nan es False, y por eso hay que usar math.isnan.

En entrenamiento de redes, la secuencia típica es: un gradiente crece, produce inf, el inf participa en una resta y produce NaN, y el NaN contamina todos los pesos en una sola actualización. Detectarlo exige comprobar explícitamente; el programa no avisa.

Ejemplo trabajado

Los tres límites y la propiedad del NaN.

max float64        1.7976931348623157e+308
max × 2            inf                      ← sin excepción

min normal         2.2250738585072014e−308
min subnormal      5e−324
min subnormal / 2  0.0                      ← underflow a cero

inf − inf          nan
nan == nan         False                    ← usar math.isnan

Un inf en un cálculo no detiene nada. Se propaga en silencio hasta que alguien comprueba.

Qué calcula el laboratorio

Límites del float64 y el paso por subnormales.

python classes/part-01-aritmetica-computacional-y-representacion-numerica/033-overflow-y-underflow-flotante/lab.py
compmath run 033

Salidas del laboratorio (7)

Muestra de la ejecución real

{
  "max_float": 1.7976931348623157e+308,
  "max*2_da_inf": Infinity,
  "min_normal": 2.2250738585072014e-308,
  "min_subnormal": 5e-324,
  "min_subnormal/2": 0.0,
  "underflow_a_cero": true
}

Errores comunes

Dónde se usa

Depuración de entrenamientos que producen NaN, control de estabilidad en softmax y logaritmos, y validación de pipelines numéricos. La estabilización de softmax (clase 321) existe para evitar exactamente este overflow.

Idea rectora de la parte

Condicionamiento es del problema; estabilidad es del algoritmo.

Error a evitar

Comparar floats con `==` en lugar de una tolerancia razonada.

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