3

C++ で matlab の normcdf 関数に相当するものを実装したいのですが、この便利な投稿を既に見つけました: 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);

または私は何か他のことをすることになっていますか?

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 に答える