Relevancia de los cálculos de precisión de punto fijo y arbitrario


10

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?

Relacionado: esto y esto


Milind R, gracias por tu pregunta. Creo que su pregunta es interesante, pero probablemente inapropiada para el sitio. Le insto a que consulte las preguntas frecuentes del sitio para obtener orientación. Cuando miro su pregunta, tengo la impresión de que es el comienzo de una queja, aunque creo que los elementos de una pregunta apropiada para el sitio están presentes. Vale la pena preguntar si hay muchas aplicaciones de la aritmética de enteros y la aritmética de punto fijo en la ciencia computacional, y pedir una comparación de esas aritméticas con el punto flotante. Te recomiendo editar tu publicación.
Geoff Oxberry

Sí, nació de una diatriba, pero lo expresé en busca de una justificación para el status quo. Mi pregunta, como pueden suponer, es acerca de por qué no podemos tener un cambio importante hacia las matemáticas de enteros y de punto fijo en números intensivos. ¿Puedes editarlo en mi nombre? Realmente lo intenté, pero no sé cómo mi pregunta no es apropiada.
Milind R

55
Creo que hay una respuesta técnica objetiva a esto: si ejecuta casi cualquier cálculo científico (por ejemplo, una solución lineal), el número de bits necesarios para el almacenamiento exacto aumenta exponencialmente en el tiempo. Por lo tanto, se requiere un fuerte apoyo para la inexactitud para un trabajo útil.
Geoffrey Irving

@MilindR: La comunidad de geometría computacional ha estado interesada en cálculos de números reales que son altamente efectivos y exactos al mismo tiempo. Yo supongo que todas las cuestiones prácticas pertinentes a que se pueden observar en esta área de investigación. Un ejemplo que podría buscar es la biblioteca LEDA.
shuhalo

@GeoffreyIrving ¿Qué pasa con los ceros en las matrices triangulares? ¿No pueden almacenarse como otra cosa que no sea un punto flotante propenso a errores inexactos?
Milind R

Respuestas:


5

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.


4

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?


Es frustrante admitirlo, pero sí, su respuesta básicamente crucifica el uso a gran escala del cálculo exacto. Supongo que no volveré a ver la parte de atrás floatpronto.
Milind R

@MilindR: No estoy muy seguro de a qué estás apuntando. Parece que tiene un martillo y está frustrado porque nadie tiene un clavo o piensa que un martillo es una herramienta útil. Pero no es porque no nos gustes, hemos pensado en estos problemas durante mucho tiempo y simplemente hemos decidido que el destornillador que tenemos es la herramienta adecuada. No encuentro nada frustrante al respecto (a menos que tenga un martillo) ya que es solo un enfoque pragmático: ¿por qué usar aritmética exacta cuando solo hacemos aproximaciones?
Wolfgang Bangerth

Es frustrante porque un problema perfectamente normal podría estar tan mal condicionado que es efectivamente insoluble. También porque el ideal de precisión arbitraria parecía tan prometedor, en comparación con la naturaleza inexacta del punto flotante desde el almacenamiento del valor hasta su salida.
Milind R

El problema es que los errores de redondeo son extremadamente difíciles de analizar. Me di cuenta de esto el día que comencé a aprender análisis numérico y álgebra lineal numérica. Entonces, un sistema que evita por completo el problema, haciendo que el acondicionamiento no sea un problema, debería estar arrasando con el mundo, ¿verdad? Fue el pensamiento. Por supuesto, entiendo las limitaciones, pero parecían más irritantes que negociadores. Algo así como la mayor dificultad para reducir los transistores en los procesadores. Sí, es difícil de analizar, pero Intel aún lo hace.
Milind R

1
Si un problema está tan mal acondicionado que es difícil de resolver, entonces su solución no es estable a las perturbaciones. Ese es un problema con el problema original, no con la representación de punto flotante. Sí, tal vez pueda obtener una solución al problema utilizando una representación exacta. Pero la solución no es estable y, por lo tanto, es probable que no tenga nada que ver con lo que realmente está buscando. Estás ladrando al árbol equivocado si crees que la representación de los números es el problema.
Wolfgang Bangerth

3

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. :-)


Gracias .. Muy informativo, y buen enlace. ¿Pero el uso de un punto fijo junto con un alcance limitado de redondeo no da como resultado resultados más precisos? Dado que la representación en sí es exacta para empezar, a diferencia del punto flotante?
Milind R

1
Le sugiero que ataque su problema desde otro punto de vista. En la introducción a la lógica, aprende que hay tres partes en la solución de un problema: definiciones, razonamiento y conclusión / resultado. Probablemente (como la mayoría de nosotros) estamos muy acostumbrados a trabajar principalmente en el paso de "definiciones" de la resolución de problemas; por lo general, puede "definir" su problema; sin embargo, si se frustra, ocasionalmente se encuentra con un tipo de problema más difícil que requiere más trabajo en la parte de "razonamiento".
mda

Solo te entiendo vagamente ... No puedo ver dónde puedo "definir" este problema, el razonamiento es esencial.
Milind R

Varios años después, realmente te entiendo :-)
Milind R

Al usar nuestro sitio, usted reconoce que ha leído y comprende nuestra Política de Cookies y Política de Privacidad.
Licensed under cc by-sa 3.0 with attribution required.