function [ p, q, pdf ] = nprob ( z )

%*****************************************************************************80
%
%% nprob() computes the cumulative density of the standard normal distribution.
%
%  Licensing:
%
%    This code is distributed under the MIT license.
%
%  Modified:
%
%    17 January 2008
%
%  Author:
%
%    Original FORTRAN77 version by AG Adams.
%    MATLAB version by John Burkardt.
%
%  Reference:
%
%    AG Adams,
%    Algorithm 39:
%    Areas Under the Normal Curve,
%    Computer Journal,
%    Volume 12, Number 2, May 1969, pages 197-198.
%
%  Input:
%
%    real Z, divides the real line into
%    two semi-infinite intervals, over each of which the standard normal
%    distribution is to be integrated.
%
%  Output:
%
%    real P, Q, the integrals of the standard normal
%    distribution over the intervals ( - Infinity, Z] and
%    [Z, + Infinity ), respectively.
%
%    real PDF, the value of the standard normal distribution at Z.
%
  a0 = 0.5;
  a1 = 0.398942280444;
  a2 = 0.399903438504;
  a3 = 5.75885480458;
  a4 = 29.8213557808;
  a5 = 2.62433121679;
  a6 = 48.6959930692;
  a7 = 5.92885724438;
  b0 = 0.398942280385;
  b1 = 0.000000038052;
  b2 = 1.00000615302;
  b3 = 0.000398064794;
  b4 = 1.98615381364;
  b5 = 0.151679116635;
  b6 = 5.29330324926;
  b7 = 4.8385912808;
  b8 = 15.1508972451;
  b9 = 0.742380924027;
  b10 = 30.789933034;
  b11 = 3.99019417011;

  zabs = abs ( z );
%
%  |Z| between 0 and 1.28
%
  if ( abs ( z ) <= 1.28 )

    y = a0 * z * z;
    pdf = exp ( - y ) * b0;

    q = a0 - zabs * ( a1 - a2 * y ...
      / ( y + a3 - a4 ...
      / ( y + a5 + a6 ...
      / ( y + a7 ))));
%
%  |Z| between 1.28 and 12.7
%
  elseif ( abs ( z ) <= 12.7 )

    y = a0 * z * z;
    pdf = exp ( - y ) * b0;

    q = pdf ...
      / ( zabs - b1 + b2 ...
      / ( zabs + b3 + b4 ...
      / ( zabs - b5 + b6 ...
      / ( zabs + b7 - b8 ...
      / ( zabs + b9 + b10 ...
      / ( zabs + b11 ))))));
%
%  Z far out in tail.
%
  else

    q = 0.0;
    pdf = 0.0;

  end

  if ( z < 0.0 )
    p = q;
    q = 1.0 - p;
  else
    p = 1.0 - q;
  end

  return
end
