Ao revisar a implementação de uma função de outro programador para calcular a CDF de distribuição normal , sugeri substituir a implementação inteira pelas funções internas do Python ou usar o SciPy, uma biblioteca científica comum.
Outro programador apontou que math.erfc()
nem scipy.stats.norm.cdf()
fornece garantias de precisão em sua documentação. Portanto, eu deveria ser mais cauteloso ao substituir um algoritmo de aproximação (que foi retirado de uma fonte respeitada e que tinha limites de erro documentados ).
Para ser sincero, o pensamento de duvidar da exatidão e precisão de uma função interna ou de uma biblioteca nunca me passou pela cabeça. Afinal, venho chamando funções como sin()
e sqrt()
há anos sem muita reflexão - por que deveria math.erf()
ou scipy.stats.norm.cdf()
ser diferente?
Mas agora estou preocupado. Minhas perguntas são:
- Em geral, se a documentação não faz menção especial, está implícito que esses tipos de funções são completamente precisas até a última casa decimal, dentro da precisão oferecida pelo ponto flutuante de precisão dupla IEEE?
- Isso é verdade para o Python
math.erf()
ou o SciPyscipy.stats.norm.cdf()
em particular? Como você sabe? Esta página de manual para
sin()
diz…Essas funções podem perder precisão quando o argumento está próximo de um múltiplo de pi ou está longe de 0,0.
Por que essas advertências deveriam existir, quando a função senoidal é periódica e simétrica? Parece haver um ônus colocado no chamador para canonizar a entrada para obter a precisão ideal.
Por outro lado, a documentação da Mozilla para
Math.sin()
nada diz sobre exatidão ou precisão. Isso significa que é totalmente preciso ou é "conhecimento comum" queMath.sin()
só seria preciso em determinadas circunstâncias no JavaScript, como em qualquer outro lugar?