我想在C++中实现matlab normcdf函数的等价物,我已经发现了这个有用的帖子:C/C++中的累积正态分布函数指向这个实现http://www.johndcook.com/cpp_phi.html.但我希望它有可选的μ和西格玛参数,就像在matlab中一样。
可以吗,当我改变这个:
x = fabs(x)/sqrt(2.0);
至:
x = fabs(x - mu)/sqrt(2.0 * sigma * sigma);
或者我应该做点别的?
小心-您想要保存x-mu
的符号,而不仅仅是x
:的符号
int sign = 1;
if (x < mu)
sign = -1;
x = fabs(x-mu)/sqrt(2.0*sigma*sigma);
否则,缩放是正确的。
您可以添加
x = (x-mu)/fabs(sigma);
作为函数的第一行,在不改变符号检查的情况下获得正确的结果。理想情况下,应该为sigma<=0.0
抛出一个异常,而不是在此处使用fabs
。
与此无关的是,您链接到的实现实际上是一个单精度近似,只是将float
替换为double
(因此最大误差为惊人的7e-8;-)
如果您对从VB进行翻译感到满意,West将在http://www.wilmott.com/pdfs/090721_west.pdf.
不幸的是,作为PDF,您无法复制和粘贴所有的幻数,因此在检查是否正确复制时,您必须非常小心!