Inicio · Parte 01
Qué es realmente un número dentro de una máquina: bits, complemento a dos, IEEE 754, error, condicionamiento y estabilidad.
Esta es la parte que más cambia la forma de programar de quien la estudia, y la que casi ningún curso de matemáticas incluye. La pregunta central es incómoda: ¿qué es realmente un número dentro de una máquina? La respuesta —una cadena finita de bits con una interpretación acordada— tiene consecuencias que aparecen en producción a las tres de la mañana.
El recorrido va de lo discreto a lo continuo. Las clases 021 a 026 tratan los enteros: cuántos valores caben en un ancho de palabra, cómo se representan los negativos con complemento a dos y qué ocurre cuando una suma se sale del rango. Python oculta este problema porque sus enteros son de precisión arbitraria, pero NumPy, C, Rust y cualquier base de datos no lo hacen, y el desbordamiento silencioso es un error de seguridad clásico.
Las clases 027 a 033 son el núcleo: IEEE 754. Un float64 no es un número real: es un racional binario con 53 bits de mantisa. De ahí se derivan, con necesidad lógica, los fenómenos que parecen fallos y no lo son: 0.1 + 0.2 != 0.3, la suma que deja de ser asociativa, el epsilon de máquina, los subnormales y el NaN. Goldberg escribió en 1991 el artículo que sigue siendo la referencia; esta parte es su versión ejecutable.
Las clases 034 a 036 introducen la distinción que separa a quien depura numéricamente de quien adivina: condicionamiento es una propiedad del problema, estabilidad es una propiedad del algoritmo. Un problema mal condicionado no tiene algoritmo estable que lo salve; un algoritmo inestable estropea un problema bien condicionado. Confundirlos lleva a buscar el error en el sitio equivocado.
El cierre (037 a 039) da las salidas: Decimal cuando hace falta exactitud decimal, Fraction cuando hace falta exactitud racional, y las condiciones bajo las que un resultado numérico es reproducible entre máquinas. El capstone construye un auditor que mide cuántos dígitos significativos pierde cada forma de escribir una expresión.
En IA esta parte es cotidiana aunque nadie la nombre: float32, bfloat16, la cuantización a int8, los NaN que aparecen en la época 3, el epsilon dentro de cada LayerNorm y el motivo por el que dos entrenamientos con la misma semilla dan resultados distintos en GPU. Todo eso es esta parte.
compmath run --part 01
| Término | Definición | Clase |
|---|---|---|
| Bit | Unidad mínima de información: dos estados posibles. n bits codifican 2ⁿ valores distintos. | 021 |
| Base posicional | Sistema en el que el valor de un dígito depende de su posición. Cambiar de base no cambia la cantidad, solo su escritura. | 023 |
| Complemento a dos | Codificación de enteros con signo en la que el negativo de x es 2ⁿ − x. Permite sumar positivos y negativos con el mismo circuito. | 025 |
| Overflow | Resultado que excede el rango representable. En ancho fijo produce wraparound silencioso, no una excepción. | 026 |
| Punto fijo | Representación con número fijo de decimales, típicamente enteros de la unidad mínima (centavos). Exacta dentro de su rango. | 027 |
| Mantisa | Parte significativa de un número en punto flotante. Determina la precisión relativa, no el rango. | 028 |
| Exponente sesgado | Exponente almacenado con un desplazamiento (1023 en float64) para poder representarlo sin signo. | 028 |
| Error absoluto | Diferencia |aproximado − exacto|. Depende de la escala y no es comparable entre magnitudes distintas. | 030 |
| Error relativo | Error absoluto dividido por el valor exacto. Es la magnitud que se propaga y la que define la precisión. | 030 |
| ULP | Unit in the Last Place: distancia entre un float y su vecino. Depende de la magnitud del número. | 031 |
| Epsilon de máquina | Menor ε tal que 1 + ε ≠ 1. En float64 vale 2⁻⁵² ≈ 2.22e−16. | 031 |
| Cancelación catastrófica | Pérdida masiva de dígitos significativos al restar dos números casi iguales. No lanza excepción. | 032 |
| Subnormal | Número flotante menor que el mínimo normal, representado con mantisa desnormalizada y precisión reducida. | 033 |
| Suma compensada | Técnica (Kahan, o math.fsum) que arrastra el error de redondeo para que la suma de muchos términos conserve precisión. | 034 |
| Número de condición | Factor por el que un problema amplifica el error relativo de la entrada. Es propiedad del problema. | 035 |
| Estabilidad numérica | Propiedad de un algoritmo que no amplifica los errores de redondeo más allá de lo que el problema exige. | 036 |
| Precisión arbitraria | Aritmética cuya precisión se declara y no está limitada por el hardware, a cambio de velocidad. | 037 |
| Reproducibilidad numérica | Propiedad de un cálculo que devuelve bit a bit el mismo resultado. Exige fijar el orden de las operaciones, no solo la semilla. | 039 |