Précision implicite des fonctions à virgule flottante

9

Lors de l'examen de l' implémentation d'une fonction par un autre programmeur pour calculer le CDF de distribution normale , j'ai suggéré de remplacer l'intégralité de l'implémentation par les fonctions intégrées de Python ou d'utiliser SciPy, une bibliothèque scientifique commune.

Un autre programmeur a souligné que ni math.erfc()ne scipy.stats.norm.cdf()fournit aucune garantie de précision dans leur documentation. Par conséquent, je devrais être plus prudent quant au remplacement d'un algorithme d'approximation (qui a été tiré d'une source respectée et qui a documenté des limites d'erreur ).

Pour être honnête, l'idée de douter de l'exactitude et de la précision d'une fonction intégrée ou d'une bibliothèque ne m'avait jamais traversé l'esprit. Après tout, j'appelle des fonctions comme sin()et sqrt()depuis des années sans trop réfléchir - pourquoi devrait-il math.erf()ou scipy.stats.norm.cdf()être différent?

Mais maintenant, je suis inquiet. Mes questions sont:

  1. En général, si la documentation ne fait aucune mention spéciale, cela implique-t-il que ces types de fonctions sont complètement précis à la dernière décimale, dans la précision offerte par la virgule flottante double précision IEEE?
  2. Est-ce vrai pour Python math.erf()ou SciPy scipy.stats.norm.cdf()en particulier? Comment pouvez-vous dire?
  3. Cette page de manuel poursin() dit…

    Ces fonctions peuvent perdre en précision lorsque leur argument est proche d'un multiple de pi ou est loin de 0,0.

    Pourquoi de telles mises en garde devraient-elles exister, alors que la fonction sinus est périodique et symétrique? Il semble y avoir un fardeau placé sur l'appelant pour canoniser l'entrée afin d'obtenir une précision optimale.

    D'un autre côté, la documentation de Mozilla Math.sin()ne dit rien sur l'exactitude ou la précision. Cela signifie-t-il qu'il est parfaitement exact ou s'agit-il d'une "notoriété publique" qui Math.sin()ne serait exacte que dans certaines circonstances en JavaScript, comme partout ailleurs?

200_success
la source
1
FYI concernant la question 1: Habituellement, les garanties de précision sont données en termes d'ULP (unités en dernier lieu) qui se réfère aux chiffres binaires du flotteur.

Réponses:

10

Si la documentation ne fait aucune mention spéciale, est-ce que cela implique que ces types de fonctions sont complètement précis à la dernière décimale, dans la précision offerte par la virgule flottante double précision IEEE?

Je ne ferais pas cette hypothèse.

Là où je travaille, nous traitons des données de télémétrie, et il est de notoriété publique que deux bibliothèques mathématiques différentes peuvent produire deux résultats différents, même si elles sont toutes deux conformes aux normes à virgule flottante IEEE. Cela a des implications lorsque vous essayez de répéter un calcul et de comparer deux résultats pour l'égalité.

Il semble y avoir un fardeau placé sur l'appelant pour canoniser l'entrée afin d'obtenir une précision optimale.

C'est une évaluation juste. Ce qui le rend acceptable, c'est que la documentation l'indique, afin qu'il n'y ait pas de surprise.

Par contre, la documentation de Mozilla ...

Je vous suggère d'essayer quelques calculs dans chaque bibliothèque ou langage de programmation (en particulier près des zones limites comme sin()près d'un multiple de pi) et de les comparer. Cela devrait vous donner une idée juste du type de comportement que vous pouvez attendre de chacun.

Robert Harvey
la source
2
Le test est une bonne idée. Il y a d'innombrables fois où la documentation dit une chose, mais les fonctions se comportent d'une autre manière. Et OP veut s'appuyer sur des hypothèses implicites qui ne sont même pas documentées.
Siyuan Ren