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