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:
- 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?
- ¿Es eso cierto para Python
math.erf()
o SciPy'sscipy.stats.norm.cdf()
en particular? Como puedes saber Esta página de manual
sin()
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" queMath.sin()
solo sería exacto en ciertas circunstancias en JavaScript, como en cualquier otro lugar?
fuente
Respuestas:
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.
Esa es una evaluación justa. Lo que lo hace aceptable es que la documentación lo indique, para que no haya sorpresas.
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 depi
), y compárelos. Esto debería darle una idea justa de qué tipo de comportamiento puede esperar de cada uno.fuente