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?
fonte
Respostas:
Eu não faria essa suposição.
Onde trabalho, lidamos com dados de telemetria, e é de conhecimento geral que duas bibliotecas matemáticas diferentes podem produzir dois resultados diferentes, mesmo que ambas estejam em conformidade com os padrões de ponto flutuante do IEEE. Isso tem implicações quando você está tentando repetir um cálculo e comparar dois resultados para igualdade.
Essa é uma avaliação justa. O que o torna aceitável é que a documentação declare isso, para que não haja surpresas.
Sugiro que você tente alguns cálculos em cada biblioteca ou linguagem de programação (especialmente perto das áreas de fronteira, como
sin()
perto de um múltiplo depi
), e compare-os. Isso deve lhe dar uma boa idéia de que tipo de comportamento você pode esperar de cada um.fonte