¿Qué afirmaciones, si las hay, se pueden hacer sobre la exactitud/precisión de los cálculos de punto flotante?

StackOverflow https://stackoverflow.com/questions/2263690

  •  20-09-2019
  •  | 
  •  

Pregunta

Estoy trabajando en una aplicación que realiza muchos cálculos de punto flotante.Usamos VC++ en Intel x86 con valores de punto flotante de doble precisión.Afirmamos que nuestros cálculos son precisos para norte dígitos decimales (ahora mismo 7, pero intentando reclamar 15).

Nos esforzamos mucho en validar nuestros resultados con otras fuentes cuando nuestros resultados cambian ligeramente (debido a la refactorización del código, la limpieza, etc.).Sé que muchos factores influyen en la precisión general, como el estado de control de la FPU, el compilador/optimizador, el modelo de punto flotante y el orden general de las operaciones en sí (es decir, el algoritmo en sí), pero dada la incertidumbre inherente en los cálculos de FP (por ejemplo, no se puede representar 0,1), parece inválido reclamar algún grado específico de precisión para todos los cálculos.

Mi pregunta es esta:¿Es válido hacer afirmaciones sobre la precisión de los cálculos de FP en general sin realizar ningún tipo de análisis (como un análisis de intervalos)?Si es así, ¿qué afirmaciones se pueden hacer y por qué?

EDITAR:

Entonces, dado que los datos de entrada son precisos para, digamos, norte decimales, ¿se puede ofrecer alguna garantía sobre el resultado de cualquier cálculo arbitrario, dado que se utiliza doble precisión?Por ejemplo, si los datos de entrada tienen 8 dígitos decimales significativos, la salida tendrá al menos 5 dígitos decimales significativos...?

Estamos utilizando bibliotecas de matemáticas y desconocemos las garantías que puedan ofrecer o no.Los algoritmos que utilizamos no necesariamente se analizan para determinar su precisión de ninguna manera.Pero incluso dado un algoritmo específico, la implementación afectará los resultados (simplemente cambiando el orden de dos operaciones de suma, por ejemplo).¿Existe alguna garantía inherente al utilizar, por ejemplo, doble precisión?

OTRA EDICIÓN:

Validamos empíricamente nuestros resultados frente a otras fuentes.Entonces, ¿estamos teniendo suerte cuando logramos, digamos, una precisión de 10 dígitos?

¿Fue útil?

Solución

A menos que su código utiliza sólo las operaciones básicas especificadas en la norma IEEE 754 (+, -, *, / y la raíz cuadrada), que ni siquiera sabe la cantidad de pérdida de precisión cada llamada a funciones de biblioteca fuera de su control (funciones trigonométricas, exp / log, ...) introducir. Funciones fuera de la 5 base no están garantizados para ser, y son por lo general no, preciso en 1ULP.

Puede hacer comprobaciones empíricas, pero eso es lo que se mantienen ... empírica. No se olvide de la parte acerca de que hay ninguna garantía en el EULA de su software!

Si su software era crítico para la seguridad, y no llamó a funciones matemáticas biblioteca implementada, usted podría considerar http://www-list.cea.fr/labos/gb/LSL/fluctuat/index.html . Pero el software sólo es fundamental vale la pena el esfuerzo y tiene la oportunidad de encajar en los análisis de las limitaciones de esta herramienta.

Parece, después de su edición, sobre todo preocupados por su compilador hacer las cosas en su espalda. Es un miedo natural a tener (porque al igual que para las funciones matemáticas, que no está en control). Pero es bastante poco probable que sea el problema. Su compilador puede calcular con una precisión superior a la que pidió (Extendeds de 80 bits cuando se le preguntó en dobles de 64 bits o de 64 bits se duplica cuando se le preguntó por los flotadores de 32 bits). Esto está permitido por la norma C99. En la ronda-a-más cercano, esto puede introducir errores de redondeo dobles. Pero es sólo 1ULP que está perdiendo, y con tan poca frecuencia que no es necesario preocuparse. Esto puede causar comportamientos desconcertantes, como en:

float x=1.0;
float y=7.0;
float z=x/y;
if (z == x/y) 
...
else
... /* the else branch is taken */

, pero estabas buscando problemas cuando se utiliza == entre los números de punto flotante.

Cuando se tiene el código que hace cancelaciones a propósito, como por ejemplo en el algoritmo de la suma Kahan:

d = (a+b)-a-b;

y el compilador optimiza eso en d=0;, tiene un problema. Y sí, esta optimización "como si la operación flotadores eran asociativo" se ha visto en los compiladores generales. Es no permitido por C99. Sin embargo, la situación ha mejorado, creo. autores del compilador se han vuelto más conscientes de los peligros de punto flotante y ya no tratar de optimizar de manera tan agresiva. Además, si estuviera haciendo esto en su código no estaría haciendo esta pregunta.

Otros consejos

Al igual que con todas estas preguntas, tengo que responder simplemente con el artículo lo que todo informático debe saber sobre la aritmética de punto flotante . Es absolutamente indispensable para el tipo de trabajo que está hablando.

Respuesta corta:. No

Motivo: ¿Ha probado (sí resultado ) que no están perdiendo precisión a medida que avanza? ¿Estás seguro? ¿Usted entiende la precisión intrínseca de las funciones de la biblioteca que se está usando para las funciones trascendentales? ¿Ha calculado los límites de errores aditivos? Si está utilizando un algoritmo iterativo, sabes lo bien que ha convergido cuando salga? Este material es duro.

Dado que sus proveedores de máquinas, compiladores, bibliotecas de tiempo de ejecución, y los sistemas de operación no hacen tal afirmación acerca de coma flotante exactitud , debe tomar que ser una advertencia de que su grupo debe ser recelosos de hacer afirmaciones que podrían venir bajo escrutinio severo si los clientes cada vez que llevaron a los tribunales.

Sin hacer la verificación formal de todo el sistema, yo evitaría este tipo de reclamaciones. Yo trabajo en software científico que tiene implicaciones de seguridad humana indirectos, por lo que tenemos en cuenta este tipo de cosas en el pasado, y no hacemos este tipo de reclamaciones.

Se puede hacer afirmaciones inútiles sobre precisión de la doble (longitud) los cálculos de punto flotante, pero sería básicamente inútil.

Ref: las trampas de la verificación de los cálculos de punto flotante de ACM Las transacciones en los lenguajes de programación y sistemas de 30, 3 (2008) 12

No, no se puede hacer cualquier reclamación. Si quería hacerlo, lo que tendría que hacer lo siguiente:

  • contratar a un experto en computación numérica para analizar sus algoritmos.
  • Cualquiera de obtener su biblioteca y compilador vendedores para abrir sus fuentes a dicho experto para el análisis, o hacer que firmar en la semántica duros y cotas de error.

Haga doble precisión de punto flotante general lleva cerca de 15 dígitos de precisión decimal, pero hay demasiadas maneras para algunos o todos los que la precisión que se pierdan, que son demasiado sutiles para una no experto para diagnosticar, para hacer cualquier reclamo como lo que le gustaría a reclamar.

Hay formas relativamente simples para seguir funcionando límites de error que le permiten hacer una precisión afirma acerca de cualquier específica computación, pero hacer afirmaciones acerca de la exactitud de los cálculos realizados con el software es un orden mucho más alto .

Un número de doble precisión en una CPU Intel tiene un poco mejor que 15 dígitos significativos (decimal).

El error potencial para un cálculo simple está en el parámetro de n/1.0e15, donde n es el orden de magnitud de los números con los que está trabajando.Sospecho que Intel tiene especificaciones para la precisión de los cálculos de FP basados ​​en CPU.

El posible error en las funciones de la biblioteca (como cos y log) suele estar documentado.Si no, puedes mirar el código fuente (p.ej.a través de la fuente GNU) y calcularlo.

Calcularía barras de error para sus cálculos tal como lo haría para los cálculos manuales.

Una vez hecho esto, podrá reducir el error ordenando juiciosamente los cálculos.

Ya que parece estar preocupado por la precisión de los cálculos arbitrarios, aquí es un enfoque que puede probar: ejecutar el código con diferentes modos de redondeo para cálculos de punto flotante. Si los resultados son bastante cerca uno del otro, es probable que bien. Si los resultados no están cerca, tiene que empezar a preocuparse.

La máxima diferencia en los resultados le dará una cota inferior de la precisión de los cálculos.

Licenciado bajo: CC-BY-SA con atribución
No afiliado a StackOverflow
scroll top