带参数的C / C ++中的累积正态分布函数

时间:2014-04-14 11:59:11

标签: c++ matlab cdf

我想在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);

或者我应该做别的事情?

2 个答案:

答案 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,您无法复制并粘贴所有幻数,因此在检查您是否已正确复制它们时,您必须非常 小心!