在C/C++中使用参数的累积正态分布函数

3
我希望实现一个C++版本的matlab normcdf函数,已经找到这篇有用的帖子:Cumulative Normal Distribution Function in C/C++ ,指向了这个实现 http://www.johndcook.com/cpp_phi.html。但是我想要可选的mu和sigma参数,就像matlab中一样。

当我更改以下内容时,这样可以吗?

x = fabs(x)/sqrt(2.0);

to:

x = fabs(x - mu)/sqrt(2.0 * sigma * sigma);

还是我应该做其他事情?
2个回答

1

注意 - 你想要保存x-mu的符号,而不仅仅是x的符号:

int sign = 1;
if (x < mu)
    sign = -1;
x = fabs(x-mu)/sqrt(2.0*sigma*sigma);

否则你的缩放是正确的。

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格式,您无法复制和粘贴所有的魔术数字,因此在检查是否正确复制它们时必须非常小心!

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接