/****************************************************/ /* Нормальное распределение */ /****************************************************/ #include "gammaDF.h" ENTRY double normalDF(double x) /* Вычисляет вероятность того, что случайная величина, * подчиняющаяся стандартному нормальному распределению, * принимает значение, не превосходящее x. */ { double dfg; if (x == zero) return 0.5; dfg = gammaDF(0.5, x * x / 2) / 2; return 0.5 + (x > zero ? dfg : -dfg); }/*normalDF*/ ENTRY double inv_normalDF(double level) /* Вычисляется квантиль уровня level, * который, согласно определению, является корнем уравнения * N(x) = level, * где N(x) - стандартное нормальное распределение. * Решение уклоняется от точного значения не более, чем на 0.00045. * Конечно, значение level должно быть заключено между 0 и 1. */ { double q, t; assert((level > zero) && (level < one)); t = level < 0.5 ? level : one - level; t = sqrt(-2 * log(t)); q = t - ((0.010328 * t + 0.802853) * t + 2.515517) / (((0.001308 * t + 0.189269) * t + 1.432788) * t + 1); return level > 0.5 ? q : -q; }/*inv_normalDF*/