Punto flotante y número de condición
Hasta ahora hemos tratado el error como algo que viene del método. El paso es demasiado grande, el grado es demasiado bajo. Bajo todos esos métodos yace un límite más básico. Una computadora no puede guardar un número real con exactitud. Ni siquiera 0.1. Un número de punto flotante de 64 bits recuerda solo unas 15 a 16 cifras y redondea el resto. De ordinario este error diminuto queda enterrado e invisible, pero salta cuando restas dos números casi iguales, o apilas un error pequeño millones de veces, o encuentras un problema mal condicionado cuya respuesta es sensible a la entrada. Esta lección mira el suelo del análisis numérico, el modo en que una computadora maneja los números y el error que se escapa de ahí. Es lo que realmente es el suelo del error (roundoff floor), y de dónde viene.
Las marcas doradas sobre la recta numérica son los números que una computadora puede guardar con exactitud. Se ve raro al principio. Cerca de 0 las marcas son densas, y se aclaran al ir a la derecha. El punto flotante escribe un número como la notación científica, unas cifras significativas con un exponente. Así cada vez que el tamaño se dobla, la separación entre valores representables vecinos se dobla también. Esa separación mínima se llama un ulp(units in the last place). Mueve x y ves el ulp crecer cuando el número se hace grande. Los números grandes se guardan en grueso y los pequeños en fino. Todo error de redondeo empieza aquí.
Mide cuán pequeña es de verdad esa separación, cerca de 1. Suma ε = 2k a 1 mientras bajas k, y en algún momento 1+ε se vuelve solo 1. Cuando el ε sumado es menor que la mitad de la separación por encima de 1, se redondea al valor representable más cercano, que es 1 mismo. Mientras sobrevive la barra es verde, y cuando desaparece la barra es roja. La línea dorada es esa media separación. Este límite es el épsilon de máquina, y en float64 es 2⁻⁵² ≈ 2.2×10⁻¹⁶. Eso son unas 15 a 16 cifras significativas. No es un comentario abstracto. Es un cálculo real. Para una computadora, 1 más un número muy pequeño puede ser solo 1. La primera evidencia de que la precisión tiene un suelo.
Un error es del orden de 10⁻¹⁶, así que parece seguro ignorarlo. Pero 0.1 no sale exacto en binario, así que en el momento en que se guarda ya carga un error diminuto. Cada vez que lo sumas, ese error se apila un poco también. Sube el número de sumas con el deslizador y el error respecto al valor verdadero n/10 crece de forma constante. Lo que no ves una vez se vuelve claro tras unos cientos, y en un cálculo que se repite miles de millones de veces, como una simulación, puede arruinar el resultado. Así un programador numérico cambia el orden de la suma, lo pequeño primero, o usa una suma compensada como la de Kahan para tener a mano esta acumulación.
Lo más temible está aparte. Es restar dos números casi iguales. Calcula (1−cos x)/x² en un x pequeño. El valor verdadero debería ir a 0.5 cuando x se hace pequeño. Pero la curva dorada, calculada al pie de la letra, se derrumba a 0 en algún momento. Cuando x es pequeño, cos x es casi 1, así que 1−cos x pierde casi todas sus cifras significativas. Las cifras de delante coinciden y se cancelan, y solo queda una cola en la que no se puede confiar. Esa es la cancelación catastrófica. La curva azul calcula el mismo valor reescrito como 1−cos x = 2 sin²(x/2). Nunca resta, así que sostiene 0.5 hasta el final. Las fórmulas son las mismas, y el orden del cálculo salva o mata la precisión.
Lo último no es un error. Es el carácter del problema mismo. Resolver un sistema lineal es hallar la intersección de dos rectas. Cuando la recta dorada y la recta azul se cruzan con holgura, la intersección es nítida. Cuando son casi paralelas, empujar una recta un pelo manda la intersección muy lejos. Ese salto se dibuja como una línea roja. Baja la pendiente con el deslizador hasta que las dos rectas son paralelas, y el mismo empujón del 10% mueve la solución cada vez más. Esa amplificación es el número de condición. Un número de condición grande es una mala condición, donde un error pequeño en la entrada se hincha en la respuesta. Lo temible es que, a diferencia del error de redondeo, una computadora mejor no puede arreglarlo. El problema mismo es delicado. Así un buen análisis numérico cuida las dos cosas, un algoritmo estable y un problema bien condicionado.