使用之前先找几个数试试,在下不保证绝对准确!!!
#include
//N(0,1)的分布函数;
double Normcdf (const double &x)
{
double y=x*x;
double fai=1/(exp(0.5*y)*2.50662827463100050);//sqrt(2*π)=2.506628274631000502415765284811;
double sum=0;
double result;
if (x>=0)
{
if (x>3.0)
{
for (int i=28;i>=1;i--) sum=i/(x+sum);
result=1-fai/(x+sum);
}
else
{
for (int i=28;i>=1;i--) sum=(0.5-i%2)*2*i*y/(2*i+1+sum);
result=0.5+fai*x/(1+sum);
}
}
else
result=1-Normcdf(-x);
return result;
}
//N(0,1)的密度函数;
double Normpdf (const double &x)
{
return 1/(exp(0.5*x*x)*2.50662827463100050);
}
//N(0,1)的分位数;
double Norminv (double const &x)
{
double *b=new double [11];
b[0]=0.1570796288e1;
b[1]=0.3706987906e-1;
b[2]=-0.8364353589e-3;
b[3]=-0.2250947176e-3;
b[4]=0.6841218299e-5;
b[5]=0.5824238515e-5;
b[6]=-0.1045274970e-5;
b[7]=0.8360937017e-7;
b[8]=-0.3231081277e-8;
b[9]=0.3657763036e-10;
b[10]=0.6936233982e-12;
double y=-log(4*x*(1-x));
double u=b[10];
if (x==0.5) return 0;
else
{
for (int i=9;i>=0;i--) u=u*y+b[i];
return (x-0.5)/abs(x-0.5)*sqrt(y*u);
}
delete[] b;
}