Go back to Richel Bilderbeek's homepage.

Go back to Richel Bilderbeek's C++ page.

 

 

 

 

 

(C++) GetCumulativeDensityNormal

 

GetCumulativeDensityNormal is a normal distribution code snippets that calculates the cumulative density at a certain x of a normal distribution with a mean of 0.0 and standard deviation of 1.0.

 

#include <cmath>

//From http://www.richelbilderbeek.nl/CppGetCumulativeDensityNormal.htm
//Adapted from http://www.ma.ic.ac.uk/~mdavis/course_material/MOP/CumNormDist.txt
double GetCumulativeDensityNormal(const double x)
{
  const double c0 = 0.2316419;
  const double c1 = 1.330274429;
  const double c2 = 1.821255978;
  const double c3 = 1.781477937;
  const double c4 = 0.356563782;
  const double c5 = 0.319381530;
  const double c6 = 0.398942280401;
  const double negative = (x < 0 ? 1.0 : 0.0);
  const double xPos = (x < 0.0 ? -x : x);
  const double k = 1.0 / ( 1.0 + (c0 * xPos));
  const double y1 = (((((((c1*k-c2)*k)+c3)*k)-c4)*k)+c5)*k;
  const double y2 = 1.0 - (c6*std::exp(-0.5*xPos*xPos)*y1);
  return ((1.0-negative)*y2) + (negative*(1.0-y2));
}

//From http://www.richelbilderbeek.nl/CppGetCumulativeDensityNormal.htm
double GetCumulativeDensityNormal(
  const double x,
  const double mean,
  const double stddev)
{
  return GetCumulativeDensityNormal(
    (x - mean) / stddev);
}

 

 

 

 

 

GetCumulativeDensityNormal test

 

#include <cmath>

//From http://www.richelbilderbeek.nl/CppGetCumulativeDensityNormal.htm
//Adapted from http://www.ma.ic.ac.uk/~mdavis/course_material/MOP/CumNormDist.txt
double GetCumulativeDensityNormal(const double x)
{
  const double c0 = 0.2316419;
  const double c1 = 1.330274429;
  const double c2 = 1.821255978;
  const double c3 = 1.781477937;
  const double c4 = 0.356563782;
  const double c5 = 0.319381530;
  const double c6 = 0.398942280401;
  const double negative = (x < 0 ? 1.0 : 0.0);
  const double xPos = (x < 0.0 ? -x : x);
  const double k = 1.0 / ( 1.0 + (c0 * xPos));
  const double y1 = (((((((c1*k-c2)*k)+c3)*k)-c4)*k)+c5)*k;
  const double y2 = 1.0 - (c6*std::exp(-0.5*xPos*xPos)*y1);
  return ((1.0-negative)*y2) + (negative*(1.0-y2));
}

//From http://www.richelbilderbeek.nl/CppGetCumulativeDensityNormal.htm
double GetCumulativeDensityNormal(
  const double x,
  const double mean,
  const double stddev)
{
  return GetCumulativeDensityNormal(
    (x - mean) / stddev);
}

#include <iostream>

int main()
{
  std::cout
  << "\nx: -4.0, mean: 0.0, stdDev: 1.0, CDN: "
  << GetCumulativeDensityNormal(-4.0)
  << "\nx: -3.0, mean: 0.0, stdDev: 1.0, CDN: "
  << GetCumulativeDensityNormal(-3.0)
  << "\nx: -2.0, mean: 0.0, stdDev: 1.0, CDN: "
  << GetCumulativeDensityNormal(-2.0)
  << "\nx: -1.0, mean: 0.0, stdDev: 1.0, CDN: "
  << GetCumulativeDensityNormal(-1.0)
  << "\nx: 0.0, mean: 0.0, stdDev: 1.0, CDN: "
  << GetCumulativeDensityNormal( 0.0)
  << "\nx: 1.0, mean: 0.0, stdDev: 1.0, CDN: "
  << GetCumulativeDensityNormal( 1.0)
  << "\nx: 2.0, mean: 0.0, stdDev: 1.0, CDN: "
  << GetCumulativeDensityNormal( 2.0)
  << "\nx: 3.0, mean: 0.0, stdDev: 1.0, CDN: "
  << GetCumulativeDensityNormal( 3.0)
  << "\nx: 4.0, mean: 0.0, stdDev: 1.0, CDN: "
  << GetCumulativeDensityNormal( 4.0)
  << "\n"
  << "\nx: -4.0, mean: 0.0, stdDev: 1.0, CDN: "
  << GetCumulativeDensityNormal(-4.0,0.0,1.0)
  << "\nx: -3.0, mean: 0.0, stdDev: 1.0, CDN: "
  << GetCumulativeDensityNormal(-3.0,0.0,1.0)
  << "\nx: -2.0, mean: 0.0, stdDev: 1.0, CDN: "
  << GetCumulativeDensityNormal(-2.0,0.0,1.0)
  << "\nx: -1.0, mean: 0.0, stdDev: 1.0, CDN: "
  << GetCumulativeDensityNormal(-1.0,0.0,1.0)
  << "\nx: 0.0, mean: 0.0, stdDev: 1.0, CDN: "
  << GetCumulativeDensityNormal( 0.0,0.0,1.0)
  << "\nx: 1.0, mean: 0.0, stdDev: 1.0, CDN: "
  << GetCumulativeDensityNormal( 1.0,0.0,1.0)
  << "\nx: 2.0, mean: 0.0, stdDev: 1.0, CDN: "
  << GetCumulativeDensityNormal( 2.0,0.0,1.0)
  << "\nx: 3.0, mean: 0.0, stdDev: 1.0, CDN: "
  << GetCumulativeDensityNormal( 3.0,0.0,1.0)
  << "\nx: 4.0, mean: 0.0, stdDev: 1.0, CDN: "
  << GetCumulativeDensityNormal( 4.0,0.0,1.0)
  << "\n"
  << "\nx: -4.0, mean: 0.0, stdDev: 2.0, CDN: "
  << GetCumulativeDensityNormal(-4.0,0.0,2.0)
  << "\nx: -3.0, mean: 0.0, stdDev: 2.0, CDN: "
  << GetCumulativeDensityNormal(-3.0,0.0,2.0)
  << "\nx: -2.0, mean: 0.0, stdDev: 2.0, CDN: "
  << GetCumulativeDensityNormal(-2.0,0.0,2.0)
  << "\nx: -1.0, mean: 0.0, stdDev: 2.0, CDN: "
  << GetCumulativeDensityNormal(-1.0,0.0,2.0)
  << "\nx: 0.0, mean: 0.0, stdDev: 2.0, CDN: "
  << GetCumulativeDensityNormal( 0.0,0.0,2.0)
  << "\nx: 1.0, mean: 0.0, stdDev: 2.0, CDN: "
  << GetCumulativeDensityNormal( 1.0,0.0,2.0)
  << "\nx: 2.0, mean: 0.0, stdDev: 2.0, CDN: "
  << GetCumulativeDensityNormal( 2.0,0.0,2.0)
  << "\nx: 3.0, mean: 0.0, stdDev: 2.0, CDN: "
  << GetCumulativeDensityNormal( 3.0,0.0,2.0)
  << "\nx: 4.0, mean: 0.0, stdDev: 2.0, CDN: "
  << GetCumulativeDensityNormal( 4.0,0.0,2.0)
  << "\n"
  << "\nx: -4.0, mean: 1.0, stdDev: 1.0, CDN: "
  << GetCumulativeDensityNormal(-4.0,1.0,1.0)
  << "\nx: -3.0, mean: 1.0, stdDev: 1.0, CDN: "
  << GetCumulativeDensityNormal(-3.0,1.0,1.0)
  << "\nx: -2.0, mean: 1.0, stdDev: 1.0, CDN: "
  << GetCumulativeDensityNormal(-2.0,1.0,1.0)
  << "\nx: -1.0, mean: 1.0, stdDev: 1.0, CDN: "
  << GetCumulativeDensityNormal(-1.0,1.0,1.0)
  << "\nx: 0.0, mean: 1.0, stdDev: 1.0, CDN: "
  << GetCumulativeDensityNormal( 0.0,1.0,1.0)
  << "\nx: 1.0, mean: 1.0, stdDev: 1.0, CDN: "
  << GetCumulativeDensityNormal( 1.0,1.0,1.0)
  << "\nx: 2.0, mean: 1.0, stdDev: 1.0, CDN: "
  << GetCumulativeDensityNormal( 2.0,1.0,1.0)
  << "\nx: 3.0, mean: 1.0, stdDev: 1.0, CDN: "
  << GetCumulativeDensityNormal( 3.0,1.0,1.0)
  << "\nx: 4.0, mean: 1.0, stdDev: 1.0, CDN: "
  << GetCumulativeDensityNormal( 4.0,1.0,1.0);
}

 

Screen output:

 

Starting /MyFolder/MyProject...

x: -4.0, mean: 0.0, stdDev: 1.0, CDN: 3.1686e-05
x: -3.0, mean: 0.0, stdDev: 1.0, CDN: 0.00134997
x: -2.0, mean: 0.0, stdDev: 1.0, CDN: 0.0227501
x: -1.0, mean: 0.0, stdDev: 1.0, CDN: 0.158655
x: 0.0, mean: 0.0, stdDev: 1.0, CDN: 0.5
x: 1.0, mean: 0.0, stdDev: 1.0, CDN: 0.841345
x: 2.0, mean: 0.0, stdDev: 1.0, CDN: 0.97725
x: 3.0, mean: 0.0, stdDev: 1.0, CDN: 0.99865
x: 4.0, mean: 0.0, stdDev: 1.0, CDN: 0.999968

x: -4.0, mean: 0.0, stdDev: 1.0, CDN: 3.1686e-05
x: -3.0, mean: 0.0, stdDev: 1.0, CDN: 0.00134997
x: -2.0, mean: 0.0, stdDev: 1.0, CDN: 0.0227501
x: -1.0, mean: 0.0, stdDev: 1.0, CDN: 0.158655
x: 0.0, mean: 0.0, stdDev: 1.0, CDN: 0.5
x: 1.0, mean: 0.0, stdDev: 1.0, CDN: 0.841345
x: 2.0, mean: 0.0, stdDev: 1.0, CDN: 0.97725
x: 3.0, mean: 0.0, stdDev: 1.0, CDN: 0.99865
x: 4.0, mean: 0.0, stdDev: 1.0, CDN: 0.999968

x: -4.0, mean: 0.0, stdDev: 2.0, CDN: 0.0227501
x: -3.0, mean: 0.0, stdDev: 2.0, CDN: 0.0668072
x: -2.0, mean: 0.0, stdDev: 2.0, CDN: 0.158655
x: -1.0, mean: 0.0, stdDev: 2.0, CDN: 0.308538
x: 0.0, mean: 0.0, stdDev: 2.0, CDN: 0.5
x: 1.0, mean: 0.0, stdDev: 2.0, CDN: 0.691462
x: 2.0, mean: 0.0, stdDev: 2.0, CDN: 0.841345
x: 3.0, mean: 0.0, stdDev: 2.0, CDN: 0.933193
x: 4.0, mean: 0.0, stdDev: 2.0, CDN: 0.97725

x: -4.0, mean: 1.0, stdDev: 1.0, CDN: 2.87105e-07
x: -3.0, mean: 1.0, stdDev: 1.0, CDN: 3.1686e-05
x: -2.0, mean: 1.0, stdDev: 1.0, CDN: 0.00134997
x: -1.0, mean: 1.0, stdDev: 1.0, CDN: 0.0227501
x: 0.0, mean: 1.0, stdDev: 1.0, CDN: 0.158655
x: 1.0, mean: 1.0, stdDev: 1.0, CDN: 0.5
x: 2.0, mean: 1.0, stdDev: 1.0, CDN: 0.841345
x: 3.0, mean: 1.0, stdDev: 1.0, CDN: 0.97725
x: 4.0, mean: 1.0, stdDev: 1.0, CDN: 0.99865
/MyFolder/MyProject exited with code 0

 

 

 

 

 

Original code

 

GetCumulativeDensityNormal is adapted from the code snippet below:

 

//Original code from http://www.ma.ic.ac.uk/~mdavis/course_material/MOP/CumNormDist.txt
double N(double x)
{
  int neg = (x<0);
  if(neg) x *= -1;
  double k(1/(1+0.2316419*x));
  double y=((((1.330274429*k-1.821255978)*k+1.781477937)*k-0.356563782)*k+0.319381530)*k;
  y = 1.0 - 0.398942280401*exp(-0.5*x*x)*y;
  return (1-neg)*y + neg*(1-y);
}

 

 

 

 

 

Go back to Richel Bilderbeek's C++ page.

Go back to Richel Bilderbeek's homepage.

 

Valid XHTML 1.0 Strict