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:
- 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?
- Est-ce vrai pour Python
math.erf()
ou SciPyscipy.stats.norm.cdf()
en particulier? Comment pouvez-vous dire? Cette page de manuel pour
sin()
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" quiMath.sin()
ne serait exacte que dans certaines circonstances en JavaScript, comme partout ailleurs?
la source
Réponses:
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é.
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.
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 depi
) et de les comparer. Cela devrait vous donner une idée juste du type de comportement que vous pouvez attendre de chacun.la source