Precisión implícita de funciones de punto flotante

9

Al revisar de otro programador implementación de una función para calcular la CDF distribución normal , hice una sugerencia para reemplazar toda la implementación de Python con funciones integradas o utilizar SciPy, una biblioteca científica común.

Otro programador señaló que math.erfc()ni scipy.stats.norm.cdf()proporciona garantías de precisión en su documentación. Por lo tanto, debería ser más cauteloso al reemplazar un algoritmo de aproximación (que fue tomado de una fuente respetada y que tenía límites de error documentados ).

Para ser sincero, nunca pensé en dudar de la exactitud y precisión de una función incorporada o de biblioteca. Después de todo, he estado llamando a funciones como sin()y sqrt()durante años sin mucho pensamiento - ¿por qué debería math.erf()o scipy.stats.norm.cdf()debe ser diferente?

Pero ahora estoy preocupado. Mis preguntas son:

  1. En general, si la documentación no hace mención especial, ¿está implícito que este tipo de funciones son completamente precisas hasta el último decimal, dentro de la precisión ofrecida por el punto flotante de doble precisión IEEE?
  2. ¿Es eso cierto para Python math.erf()o SciPy's scipy.stats.norm.cdf()en particular? Como puedes saber
  3. Esta página de manualsin() dice ...

    Estas funciones pueden perder precisión cuando su argumento está cerca de un múltiplo de pi o está lejos de 0.0.

    ¿Por qué deberían existir tales advertencias, cuando la función seno es periódica y simétrica? Parece haber una carga sobre la persona que llama para canonizar la entrada para obtener una precisión óptima.

    Por otro lado, la documentación de Mozilla Math.sin()no dice nada sobre exactitud o precisión. ¿Significa eso que es completamente exacto o es "conocimiento común" que Math.sin()solo sería exacto en ciertas circunstancias en JavaScript, como en cualquier otro lugar?

200_success
fuente
1
FYI con respecto a la pregunta 1: por lo general, las garantías de precisión se dan en términos de ULP (unidades en último lugar) que se refiere a los dígitos binarios del flotador.

Respuestas:

10

Si la documentación no hace mención especial, ¿está implícito que este tipo de funciones son completamente precisas hasta el último decimal, dentro de la precisión ofrecida por el punto flotante de precisión doble IEEE?

No haría esa suposición.

Donde trabajo, tratamos con datos de telemetría, y es de conocimiento común que dos bibliotecas matemáticas diferentes pueden producir dos resultados diferentes, incluso si ambos se ajustan a los estándares de punto flotante IEEE. Esto tiene implicaciones cuando intentas repetir un cálculo y comparar dos resultados para la igualdad.

Parece haber una carga sobre la persona que llama para canonizar la entrada para obtener una precisión óptima.

Esa es una evaluación justa. Lo que lo hace aceptable es que la documentación lo indique, para que no haya sorpresas.

Por otro lado, la documentación de Mozilla ...

Le sugiero que pruebe algunos cálculos en cada biblioteca o lenguaje de programación (especialmente cerca de las áreas límite, como sin()cerca de un múltiplo de pi), y compárelos. Esto debería darle una idea justa de qué tipo de comportamiento puede esperar de cada uno.

Robert Harvey
fuente
2
La prueba es una buena idea. Hay innumerables veces en que la documentación dice una cosa, pero las funciones se comportan de otra manera. Y OP quiere confiar en suposiciones implícitas que ni siquiera están documentadas.
Siyuan Ren el