Veo muy pocas bibliotecas / paquetes de computación de punto no flotante. Dadas las diversas imprecisiones de la representación de punto flotante, surge la pregunta de por qué no hay al menos algunos campos en los que esta mayor precisión pueda valer las complejidades de trabajar con punto fijo.
¿Hay dificultades importantes en el uso, por ejemplo, de un solucionador de valor propio de punto fijo? ¿Qué tan lentos / rápidos, inexactos / precisos serían?
floating-point
numerics
Milind R
fuente
fuente
Respuestas:
El uso de la aritmética de punto fijo puede ser apropiado bajo ciertas circunstancias. En general, para la computación científica (al menos en el sentido en que la mayoría de la gente piensa en ella) no es apropiado debido a la necesidad de expresar los grandes rangos dinámicos encontrados. Usted menciona problemas de valores propios como ejemplo, pero muy a menudo en la ciencia, uno está interesado en los valores propios más pequeños de una matriz (por ejemplo, en el cálculo del estado fundamental de un sistema cuántico). La precisión de los valores propios pequeños generalmente se deteriorará bastante en relación con los valores propios grandes si utiliza un punto fijo. Si su matriz contiene entradas que varían en proporciones grandes, los valores propios pequeños pueden ser completamente inexpresables en la precisión de trabajo. Este es un problema con la representación de números; estos argumentos se mantienen independientemente de cómo se realizan los cálculos intermedios. Posiblemente podría calcular una escala para aplicar a los resultados calculados, pero ahora acaba de inventar el punto flotante. Es fácil construir matrices cuyos elementos se comporten bien, pero cuyos valores propios se comporten extremadamente mal (comoMatrices de Wilkinson , o incluso matrices con entradas enteramente enteras ). Estos ejemplos no son tan patológicos como podrían parecer, y muchos problemas a la vanguardia de la ciencia involucran matrices con un comportamiento muy pobre, por lo que usar un punto fijo en este contexto es una mala idea (TM).
Podría argumentar que conoce la magnitud de los resultados y que no quiere desperdiciar bits en el exponente, así que hablemos de los intermedios. El uso de un punto fijo generalmente exacerbará los efectos de cancelaciones y redondeos catastróficos a menos que realmente se esfuercen mucho para trabajar con mayor precisión. La penalización de rendimiento sería enorme, y supongo que usar una representación de coma flotante con el mismo ancho de bit de mantisa sería más rápido y más preciso.
Un área donde el punto fijo puede brillar es en ciertas áreas de la computación geométrica. Especialmente si necesita una aritmética exacta o conoce el rango dinámico de todos los números de antemano, el punto fijo le permite aprovechar todos los bits en su representación. Por ejemplo, suponga que desea calcular la intersección de dos líneas, y de alguna manera los puntos finales de las dos líneas están normalizados para sentarse en el cuadrado de la unidad. En este caso, el punto de intersección se puede representar con más bits de precisión que el uso de un número de coma flotante equivalente (que desperdiciará bits en el exponente). Ahora, es casi seguro que los números intermedios requeridos en este cálculo deben calcularse con mayor precisión, o al menos hacerse con mucho cuidado (como al dividir el producto de dos números por otro número, debes tener mucho cuidado al respecto ). A este respecto, el punto fijo es más ventajoso desde el punto de vista de la representación que desde el punto de vista computacional, y diría que esto es generalmente cierto cuando puede establecer límites superiores e inferiores definidos en el rango dinámico de las salidas de su algoritmo . Esto sucede raramente.
Solía pensar que las representaciones de coma flotante eran crudas o inexactas (¿por qué desperdiciar bits en un exponente?). Pero con el tiempo me he dado cuenta de que realmente es una de las mejores representaciones posibles para números reales. Las cosas en la naturaleza aparecen en escalas logarítmicas, por lo que los datos reales terminan abarcando una amplia gama de exponentes. Además, para lograr la mayor precisión relativa posible se requiere trabajar en escalas logarítmicas, lo que hace que el seguimiento de un exponente sea más natural. El único otro contendiente para una representación "natural" es el índice de nivel simétrico . Sin embargo, la suma y la resta son mucho más lentas en esa representación, y carece del soporte de hardware de IEEE 754. Se puso una gran cantidad de pensamiento en los estándares de coma flotante, por un pilar de álgebra lineal numérica. Creo que él sabe cuál es la representación "correcta" de los números.
fuente
Como ejemplo de por qué la aritmética exacta / aritmética de punto fijo se usa tan raramente, considere esto:
En el método de elementos finitos, como en casi cualquier otro método utilizado en informática científica, llegamos a sistemas lineales o no lineales que son solo aproximaciones al mundo real. Por ejemplo, en el FEM, el sistema lineal para resolver es solo una aproximación a la ecuación diferencial parcial original (que, en sí misma, solo puede ser una aproximación del mundo real). Entonces, ¿por qué hacer un esfuerzo enorme para resolver algo que es solo una aproximación?
La mayoría de los algoritmos que usamos hoy en día son de naturaleza iterativa: el método de Newton, los gradientes conjugados, etc. Terminamos estas iteraciones siempre que estamos convencidos de que la precisión de la aproximación iterativa a la solución del problema es suficiente. En otras palabras, terminamos antes de tener la solución exacta. Como antes, ¿por qué usar aritmética exacta para un esquema iterativo cuando sabemos que solo estamos calculando aproximaciones?
fuente
float
pronto.Si observa esta biblioteca para el redondeo correcto: CRlibm , verá en la documentación que, en general, los algoritmos deben probarse con precisión (con pruebas razonadas). ¿Por qué? La estabilidad y la velocidad de convergencia de un resultado de una función no tienen una respuesta de "talla única". En resumen, "no hay almuerzo gratis": debe trabajar para demostrar que su razonamiento es correcto. Esto se debe al comportamiento de las funciones que se están modelando, no al hardware subyacente (ya sea que use unidades enteras o de coma flotante, aunque sí, ambas tienen "problemas", como desbordamiento / subflujo, números denormales, etc.) Incluso si el resultado Si busca converge a un número entero, el algoritmo utilizado para encontrar el resultado no es necesariamente muy estable.
Eigen es una biblioteca de C ++ que tiene una variedad de algoritmos para resolver matrices, cada una con diferentes propiedades. Esta página contiene una tabla que analiza las compensaciones de velocidad frente a precisión para los diversos algoritmos utilizados para resolver una matriz. Sospecho que la biblioteca Eigen puede hacer lo que quieras. :-)
fuente
Para algunos buenos ejemplos de dónde la aritmética de alta precisión ha sido útil en matemáticas, eche un vistazo al libro Matemáticas por experimento de Jonathan Borwein y David Bailey. También está esta secuela , que no he leído.
fuente