3

我想在 C++ 中实现等效的 matlab normcdf 函数,我已经找到了这篇有用的帖子:C/C++ 中的累积正态分布函数指向这个实现http://www.johndcook.com/cpp_phi.html。但我希望它带有可选的 mu 和 sigma 参数,就像在 matlab 中一样。

可以吗,当我改变这个时:

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

至:

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

还是我应该做其他事情?

4

2 回答 2

1

当心 - 你想保存 的符号x-mu,而不仅仅是x

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

否则你的缩放是正确的。

于 2014-04-14T12:15:04.223 回答
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,您无法复制和粘贴所有幻数,因此在检查是否正确复制它们时必须非常小心!

于 2014-04-14T19:15:11.723 回答