Я хочу реализовать эквивалент функции matlab normcdf в C ++, я уже нашел этот полезный пост: Кумулятивная функция нормального распределения в 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);
или я должен сделать что-то еще?
Берегись — ты хочешь сохранить знак x-mu
не только x
:
int sign = 1;
if (x < mu)
sign = -1;
x = fabs(x-mu)/sqrt(2.0*sigma*sigma);
В противном случае ваше масштабирование является правильным.
Вы могли бы вместо этого добавить
x = (x-mu)/fabs(sigma);
в качестве первой строки функции для правильного результата без изменения знака проверки. В идеале вы должны бросить исключение для sigma<=0.0
а не использовать fabs
Вот.
На несвязанной ноте, реализация, с которой вы связаны, на самом деле является приближением с одинарной точностью, просто имея float
заменено на double
(следовательно, максимальная ошибка является огромный 7е-8 ;-).
Если вам удобно переводить с VB, Вест дает реализацию Харта. много Более точное приближение на рисунке 2 http://www.wilmott.com/pdfs/090721_west.pdf.
К сожалению, как PDF, вы не можете скопировать и вставить все магические числа, поэтому вам придется очень будьте внимательны при проверке правильности их копирования!