我想在C ++中实现matlab normcdf函数的等价物,我已经找到了这个有用的帖子:Cumulative Normal Distribution Function in C/C++指向这个实现http://www.johndcook.com/cpp_phi.html。但我希望它与matlab中的可选mu和sigma参数一样。
没关系,当我改变这个时:
x = fabs(x)/sqrt(2.0);
为:
x = fabs(x - mu)/sqrt(2.0 * sigma * sigma);
或者我应该做别的事情?
答案 0 :(得分:1)
注意 - 您要保存x-mu
的标志,而不仅仅是x
:
int sign = 1;
if (x < mu)
sign = -1;
x = fabs(x-mu)/sqrt(2.0*sigma*sigma);
否则您的缩放是正确的。
答案 1 :(得分:1)
您可以改为添加
x = (x-mu)/fabs(sigma);
作为正确结果的函数的第一行而不更改符号检查。理想情况下,您应该为sigma<=0.0
抛出异常,而不是在此使用fabs
。
在一个不相关的说明中,您链接到的实现实际上只是将float
替换为double
的单精度近似(因此最大错误是高达 7e-8 ;-)。
如果您对VB的翻译感到满意,West会在http://www.wilmott.com/pdfs/090721_west.pdf的图2中给出Hart的很多更准确的近似值。
不幸的是,作为PDF,您无法复制并粘贴所有幻数,因此在检查您是否已正确复制它们时,您必须非常 小心!