[section:normal_dist Normal (Gaussian) Distribution]

``#include <boost/math/distributions/normal.hpp>``

   namespace boost{ namespace math{ 
      
   template <class RealType = double, 
             class ``__Policy``   = ``__policy_class`` >
   class normal_distribution;
   
   typedef normal_distribution<> normal;
   
   template <class RealType, class ``__Policy``>
   class normal_distribution
   {
   public:
      typedef RealType value_type;
      typedef Policy   policy_type;
      // Construct:
      normal_distribution(RealType mean = 0, RealType sd = 1);
      // Accessors:
      RealType mean()const; // location.
      RealType standard_deviation()const; // scale.
      // Synonyms, provided to allow generic use of find_location and find_scale.
      RealType location()const;
      RealType scale()const;
   };
   
   }} // namespaces
   
The normal distribution is probably the most well known statistical 
distribution: it is also known as the Gaussian Distribution.
A normal distribution with mean zero and standard deviation one
is known as the ['Standard Normal Distribution].

Given mean [mu][space] and standard deviation [sigma][space] it has the PDF:

[equation normal_ref1]

The variation the PDF with its parameters is illustrated
in the following graph:

[graph normal_pdf]

[h4 Member Functions]

   normal_distribution(RealType mean = 0, RealType sd = 1);
   
Constructs a normal distribution with mean /mean/ and 
standard deviation /sd/.

Requires sd > 0, otherwise __domain_error is called.

   RealType mean()const;
   RealType location()const;   
   
both return the /mean/ of this distribution.
   
   RealType standard_deviation()const;
   RealType scale()const;
      
both return the /standard deviation/ of this distribution.
(Redundant location and scale function are provided to match other similar distributions,
allowing the functions find_location and find_scale to be used generically).

[h4 Non-member Accessors]

All the [link math_toolkit.dist.dist_ref.nmp usual non-member accessor functions] that are generic to all
distributions are supported: __usual_accessors.

The domain of the random variable is \[-[max_value], +[min_value]\].
However, the pdf of +[infin] and -[infin] = 0 is also supported,
and cdf at -[infin] = 0, cdf at +[infin] = 1,
and complement cdf -[infin] = 1 and +[infin] = 0,
if RealType permits.

[h4 Accuracy]

The normal distribution is implemented in terms of the 
[link math_toolkit.special.sf_erf.error_function error function], 
and as such should have very low error rates.

[h4 Implementation]

In the following table /m/ is the mean of the distribution,
and /s/ is its standard deviation.

[table
[[Function][Implementation Notes]]
[[pdf][Using the relation: pdf = e[super -(x-m)[super 2]\/(2s[super 2])] \/ (s * sqrt(2*pi)) ]]
[[cdf][Using the relation: p = 0.5 * __erfc(-(x-m)/(s*sqrt(2))) ]]
[[cdf complement][Using the relation: q = 0.5 * __erfc((x-m)/(s*sqrt(2))) ]]
[[quantile][Using the relation: x = m - s * sqrt(2) * __erfc_inv(2*p)]]
[[quantile from the complement][Using the relation: x = m + s * sqrt(2) * __erfc_inv(2*p)]]
[[mean and standard deviation][The same as `dist.mean()` and `dist.standard_deviation()`]]
[[mode][The same as the mean.]]
[[skewness][0]]
[[kurtosis][3]]
[[kurtosis excess][0]]
]

[endsect][/section:normal_dist Normal]

[/ normal.qbk
  Copyright 2006, 2007 John Maddock and Paul A. Bristow.
  Distributed under the Boost Software License, Version 1.0.
  (See accompanying file LICENSE_1_0.txt or copy at
  http://www.boost.org/LICENSE_1_0.txt).
]

