Muchas veces necesitamos precisión en los cálculos matemáticos que por alguna razón tenemos que hacer, particularmente si nos dedicamos a la programación. Existen una serie de bibliotecas de precisión “infinita”, lo cual en términos reales quiere decir que los números no están supeditados al formato de números enteros o de punto flotante dentro de la computadora, sino que tienen tanta precisión como queramos, aunque el costo es un uso mucho mayor de la memoria y lo sabemos bien, esta es una de las partes más críticas de todo equipo de cómputo. Por ello, es interesante saber que hay una nueva herramienta, que es de la Universidad de Washington y que toma las expresiones que tengamos de punto flotante y las convierte en algo que permite hacer los mismos cálculos, pero con una mayor precisión.
La aritmética de punto flotante no es natural en los equipos de cómputo y tiene que manejarse a través de rutinas que nos hacen esta tarea de expresar nuestros números con decimales de forma tal que para nosotros, los seres humanos, nos parezcan naturales. Sin embargo, sabemos que este tipo de cálculos tiene siempre la posibilidad de un pequeño error debido al redondeo. Por ejemplo, si se quiere añadir un pequeño número a uno muy grande, el primero podría redondearse a cero y obtendríamos que A + 0 = A y no A + algo muy pequeño. Este tipo de problemas puede incluso modificar cómo funcionan algunos algoritmos o bien, perdernos en la lógica porque esperamos que un condicional se cumpla o no y a la hora de la verdad, precisamente por este redondeo, el programa no funciona como esperábamos.
Sin embargo, si uno ordena los valores de forma que los más pequeños estén juntos y después se sume al número más grande, se puede tener un error más pequeño que el que ocurre por redondeo. En la aritmética de punto flotante se puede frecuentemente mejorar la precisión de un cálculo reacomodando los términos de la expresión a calcular.
En la programación esto es cosa de todos los día y cuando se trabaja con números de punto flotante (reales), usamos normalmente una serie de criterios simples para protegernos de los errores arriba mencionados. Por ejemplo, nunca evaluamos la igualdad de las variables que nos interesan, solamente si son mayores o menores. No añadimos pequeñas cosas a grandes cosas, etcétera. El problema es que no sabemos a priori si una expresión de punto flotante requiere reordenar los valores para evitarnos los problemas de redondeo. Y es aquí donde entra HERBIE, que puede encontrar una expresión alternativa que reduce los errores de redondeo. Se le da una expresión a HERBIE y se usa una serie de técnicas de búsqueda heurísticas, (las cuales quieren decir que en general son reglas que suelen funcionar bien aunque podrían existir quizás excepciones a las mismas), y entonces el sistema prueba la expresión y empíricamente determina el posible error. Para probar las capacidades de HERBIE, los desarrolladores aplicaron el sistema a unos 28 casos de prueba del libro de Richard Hamming, “Numerical Methods for Scientist and Engineers”, con resultados impresionantes.
Hay una demostración en la web pero no es comparable con tener el programa completo, el cual se puede bajar e instalar.
Referencias: