Cálculo de reales: coma flotante vs TTE vs teoría de dominio vs etc.
19
Actualmente, el cálculo de los reales en los idiomas más populares todavía se realiza a través de operaciones de coma flotante. Por otro lado, teorías como la efectividad de tipo dos (TTE) y la teoría de dominios han prometido durante mucho tiempo el cálculo exacto de los reales. Claramente, el problema de la precisión del punto flotante no ha disminuido en relevancia, entonces, ¿por qué estas teorías no se han vuelto más convencionales y por qué no hay implementaciones más visibles de ellas?
Por ejemplo, ¿existen dominios de aplicaciones donde no nos importan mucho los errores de coma flotante? ¿Hay preocupaciones significativas de complejidad?
Las personas que lo hacen tienen la programación necesaria mojo no tienen la base teórica necesaria. Sin una base teórica sólida, es difícil diseñar correctamente la aritmética real exacta. Por ejemplo, es un error agregar muchos números reales en un forbucle, ya que obtendrá un rendimiento inaceptable debido a la pérdida de precisión. Si desea agregar montones y montones de reales, debe hacerlo con una estructura similar a un árbol, teniendo en cuenta las magnitudes de las sumas parciales. Otra cosa que es difícil de transmitir es que, <y =como la función booleana total en los reales simplemente no existe (puede tenerla, =pero regresa falseo diverge, y <diverge cuando se le dan dos reales iguales).
Por último, no está nada claro que sepamos cómo implementar bibliotecas para la aritmética real exacta. No son las bibliotecas habituales que solo definen algunos tipos de datos y algunas funciones en ellas. A menudo, la aritmética real exacta requiere modos especiales de control. Por ejemplo, iRRAM se hace cargo de la ejecución principal del programa (literalmente secuestra main), así como de la entrada y salida estándar, para que pueda volver a ejecutar el programa cuando se produce una pérdida de precisión. Mi biblioteca de aritmética real en Haskell ocurre en una Stagedmónada (que es esencialmente la Readermónada). La mayoría de la gente espera que los números reales sean "solo otro tipo de datos", pero tengo mis dudas al respecto.
Soy casi completamente ignorante en la aritmética real exacta, pero ¿no podría uno implementar la suma de Kahan en ella?
jjg
1
Hmm, no lo creo. Piense en la aritmética real exacta como la aritmética de intervalo que se ajusta automáticamente a la precisión intermedia para lograr la precisión de salida deseada.
Andrej Bauer
3
Además de la falta de comprensión por parte de los programadores sobre el hecho de que los números reales son objetos infinitos y sus consecuencias para lo que se puede hacer mediante programación, creo que la falta de soporte de hardware también es importante. Es difícil convencer a las personas de que usen algo con un tiempo considerable y una sobrecarga de memoria solo por su corrección.
Kaveh
1
Vi que hay cierta actividad en la implementación de computación real con tipos coinductivos. Me parece que los tipos coinductores siguen siendo bastante difíciles de entender (ciertamente no soy un experto en ello), pero ¿crees que esto es prometedor para un uso más extendido de la computación real exacta?
SorcererofDM
3
Cualquier implementación que use flujos de dígitos, o cualquier otra cosa que tenga una tasa de convergencia fija, se ve obstaculizada desde el principio porque convergerá muy lentamente. Además, las implementaciones basadas en secuencias tienden a obligarlo a calcular todas las aproximaciones anteriores para obtener la siguiente, que también es un error de diseño.
Andrej Bauer
10
En general, las personas siempre se preocupan por los errores de coma flotante. Sin embargo, no estoy de acuerdo con Andrej, y no creo que se prefieran los flotadores a los reales de precisión arbitrarios (en su mayor parte) por razones sociológicas.
Creo que el argumento principal contra el cálculo exacto de los reales es el del rendimiento . Entonces, la respuesta corta es que siempre que el rendimiento sea más importante que la precisión, querrás usar números de coma flotante .
La aplicación que me viene a la mente es el uso de la dinámica de fluidos computacional para diseñar la aerodinámica de automóviles o aviones, donde los pequeños errores en la computación se compensan fácilmente con las ganancias astronómicas del uso de unidades dedicadas de punto flotante que se encuentran en muchos procesadores generalizados.
En particular, el problema de representar una amplia gama de números reales usando un número fijo de bits no es tan trivial como puede parecer a primera vista. En la simulación numérica, los valores pueden variar ampliamente (por ejemplo, cuando hay turbulencia), por lo que los cálculos de punto fijo no son apropiados.
Incluso cuando el hardware no fija la precisión, el uso de números de precisión arbitrarios puede ser varios órdenes de magnitud más lento que el uso de números de coma flotante. De hecho, incluso en el buen caso en que todos los números son racionales, operaciones simples como invertir una matriz pueden dar como resultado denominadores grandes y difíciles de controlar (vea aquí un ejemplo). Muchos paquetes grandes de optimización lineal utilizan puntos flotantes con modos de redondeo apropiados para encontrar soluciones aproximadas debido a este problema exacto (ver, por ejemplo, la mayoría de los programas que se encuentran aquí ).
¿Hay alguna brecha comprobada entre alguna forma de cálculo real exacto y cálculo de coma flotante?
SorcererofDM
1
No que yo sepa, me temo. Sean Gao tiene algunos resultados interesantes sobre la complejidad de los procedimientos de decisión aproximados sobre los reales (ver su resumen de tesis ) y, por supuesto, el denominador en el inverso de una matriz crece en el peor de los casos como su determinante .
cody
-6
π
Mi punto es que si va a calcular exactamente, debe tener marcadores de posición para los nombres especiales, así como los nombres familiares de los naturales. En algún momento, querrás aproximar el valor exacto para aplicarlo a algo en el mundo real. Como resultado, es mucho más eficiente tratar el problema completo como aproximaciones desde el principio, a menos que tenga necesidades muy especializadas.
En general, las personas siempre se preocupan por los errores de coma flotante. Sin embargo, no estoy de acuerdo con Andrej, y no creo que se prefieran los flotadores a los reales de precisión arbitrarios (en su mayor parte) por razones sociológicas.
Creo que el argumento principal contra el cálculo exacto de los reales es el del rendimiento . Entonces, la respuesta corta es que siempre que el rendimiento sea más importante que la precisión, querrás usar números de coma flotante .
La aplicación que me viene a la mente es el uso de la dinámica de fluidos computacional para diseñar la aerodinámica de automóviles o aviones, donde los pequeños errores en la computación se compensan fácilmente con las ganancias astronómicas del uso de unidades dedicadas de punto flotante que se encuentran en muchos procesadores generalizados.
En particular, el problema de representar una amplia gama de números reales usando un número fijo de bits no es tan trivial como puede parecer a primera vista. En la simulación numérica, los valores pueden variar ampliamente (por ejemplo, cuando hay turbulencia), por lo que los cálculos de punto fijo no son apropiados.
Incluso cuando el hardware no fija la precisión, el uso de números de precisión arbitrarios puede ser varios órdenes de magnitud más lento que el uso de números de coma flotante. De hecho, incluso en el buen caso en que todos los números son racionales, operaciones simples como invertir una matriz pueden dar como resultado denominadores grandes y difíciles de controlar (vea aquí un ejemplo). Muchos paquetes grandes de optimización lineal utilizan puntos flotantes con modos de redondeo apropiados para encontrar soluciones aproximadas debido a este problema exacto (ver, por ejemplo, la mayoría de los programas que se encuentran aquí ).
fuente
Mi punto es que si va a calcular exactamente, debe tener marcadores de posición para los nombres especiales, así como los nombres familiares de los naturales. En algún momento, querrás aproximar el valor exacto para aplicarlo a algo en el mundo real. Como resultado, es mucho más eficiente tratar el problema completo como aproximaciones desde el principio, a menos que tenga necesidades muy especializadas.
fuente