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?