Precisão implícita de funções de ponto flutuante

9

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:

  1. 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?
  2. Isso é verdade para o Python math.erf()ou o SciPy scipy.stats.norm.cdf()em particular? Como você sabe?
  3. Esta página de manual parasin() 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" que Math.sin()só seria preciso em determinadas circunstâncias no JavaScript, como em qualquer outro lugar?

200_success
fonte
1
FYI referente à pergunta 1: Normalmente, garantias de precisão são dadas em termos de ULP (unidades em último lugar), que se refere aos dígitos binários do flutuador.

Respostas:

10

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?

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.

Parece haver um ônus colocado no chamador para canonizar a entrada para obter a precisão ideal.

Essa é uma avaliação justa. O que o torna aceitável é que a documentação declare isso, para que não haja surpresas.

Por outro lado, a documentação do Mozilla ...

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 de pi), e compare-os. Isso deve lhe dar uma boa idéia de que tipo de comportamento você pode esperar de cada um.

Robert Harvey
fonte
2
Teste é uma boa ideia. Existem inúmeras vezes em que a documentação diz uma coisa, mas as funções se comportam de outra maneira. E o OP quer confiar em suposições implícitas que nem sequer são documentadas.
Siyuan Ren