/****************************************************/
/*                 Нормальное распределение         */
/****************************************************/

#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*/

