(C++) GetCumulativeDensityNormal

February 24, 2017 · View on GitHub

 

 

 

 

 

(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); }