Fonction de distribution normale cumulative en C/C++ avec paramètres
Question
Je souhaite implémenter l'équivalent de la fonction matlab normcdf en C++, j'ai déjà trouvé cet article utile : Fonction de distribution normale cumulative en C/C++ soulignant cette mise en œuvre http://www.johndcook.com/cpp_phi.html.Mais je le veux avec les paramètres mu et sigma facultatifs comme dans Matlab.
Est-ce que ça va, quand je change ceci :
x = fabs(x)/sqrt(2.0);
à:
x = fabs(x - mu)/sqrt(2.0 * sigma * sigma);
ou je suis censé faire autre chose ?
La solution
Attention, vous voulez conserver le signe de x-mu
, pas seulement de x
:
int sign = 1;
if (x < mu)
sign = -1;
x = fabs(x-mu)/sqrt(2.0*sigma*sigma);
Sinon votre mise à l'échelle est correcte.
Autres conseils
Vous pourriez plutôt ajouter
x = (x-mu)/fabs(sigma);
comme première ligne de la fonction pour le résultat correct sans changer la vérification du signe.Idéalement, vous devriez lancer une exception pour sigma<=0.0
plutôt que d'utiliser fabs
ici.
Sur une note sans rapport, l'implémentation à laquelle vous avez lié est en fait une approximation à simple précision qui vient d'avoir float
remplacé par double
(d'où l'erreur maximale étant un énorme 7e-8 ;-).
Si vous êtes à l'aise avec la traduction à partir de VB, West donne une implémentation de Hart's beaucoup approximation plus précise dans la figure 2 de http://www.wilmott.com/pdfs/090721_west.pdf.
Malheureusement, en tant que PDF, vous ne pouvez pas copier et coller tous les nombres magiques, vous devrez donc très soyez prudent lorsque vous vérifiez que vous les avez copiés correctement !