00001
00002
00003
00004
00005
00006
00007
00008
00009
00010
00011
00012
00013
00014
00015
00016
00017
00018
00019 #ifndef INDRI_NORMALDISTRIBUTION_HPP
00020 #define INDRI_NORMALDISTRIBUTION_HPP
00021
00022
00023
00024
00025
00026
00027 class NormalDistribution {
00028 private:
00029 double _mu;
00030 double _sigma;
00031
00032 double _cdf( double x ) {
00033 const double a_1 = 0.4361836;
00034 const double a_2 = -0.1201676;
00035 const double a_3 = 0.9372980;
00036 const double p = 0.33267;
00037 const double pi = 3.1415926535;
00038
00039 double t = 1./(1.+p*x);
00040 double zx = ( 1. / sqrt(2*pi*_sigma) ) * exp( pow( -((x-_mu)/_sigma), 2 ) );
00041
00042 double cdf = 1 - zx * ( a_1*t + a_2*pow(t,2) + a_3*pow(t,3) );
00043 return cdf;
00044 }
00045
00046 public:
00047 NormalDistribution( double mu, double sigma ) {
00048 _mu = mu;
00049 _sigma = sigma;
00050 }
00051
00052
00053
00054
00055 double operator () ( INT64 value ) {
00056
00057 double low = _cdf( value-0.5 );
00058 double high = _cdf( value+0.5 );
00059 return high - low;
00060 }
00061 };
00062
00063 #endif // INDRI_NORMALDISTRIBUTION_HPP
00064