//
//用梯形法生成服从标准正态分布的累积函数from Dain//
//
#include 'iostream.h '
#include 'fstream.h '
#include 'math.h '
#include 'errno.h '
const double PI=3.1415926;
双精度(双精度z )。
{
双主题;
temp=exp((-1 ) *z*z/2 )/sqrt )2*pi );
返回时间;
}
/* * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * *。
/*返回标准正态分布的累积函数。 该分布的平均值为0,标准偏差为1。 */
/* * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * *。
双精度(连续双精度z ) )。
{
//this guards against overflow
if(z6 )返回1;
if(z-6 )返回0;
staticconstdoublegamma=0.231641900,
a1=0.319381530,
a2=-0.356563782,
a3=1.781477973,
a4=-1.821255978,
a5=1.330274429;
doublek=1.0/(1Fabs(z ) *伽玛);
doublen=k*(a1k*(a2k* ) a3k * (a4k * a5 ) ) )
n=1-normal(z ) * n;
是if(z0 )
返回1.0-n;
返回n;
}
/* * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * *。
返回/*标准正态分布累积函数的反函数。 该分布的平均值为0,标准偏差为1。 */
/* * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * *。
双精度(constdoublep ) )。
{
static const double LOW=0.02425;
static const double HIGH=0.97575;
/* coefficientsinrationalapproximations.* /
静态const double a [ ]=
{
-3.969683028665376e 01、
2.209460984245205e 02、
-2.759285104469687e 02、
1.383577518672690e 02、
-3.066479806614716e 01、
2.506628277459239e 00
(;
静态const double b [ ]=
{
-5.447609879822406e 01、
1.615858368580409e 02、
-1.556989798598866e 02、
6.680131188771972e 01、
-1.328068155288572e 01
(;
静态const double c [ ]=
{
-7.784894002430293e-03,
-3.223964580411365e-01,
-2.400758277161838e 00,
-2.549732539343734e 00、
4.374664141464968e 00、
2.938163982698783e 00
(;
静态const double d [ ]=
{
7.784695709041462e-03、
3.224671290700398e-01、
2.445134137142996e 00、
3.754408661907416e 00
(;
双精度q,r;
if(p0|||p1 ) )。
{
返回0.0;
}
ELSEif(p==0) ) )。
{
return-huge _ val/* MINUS ' infinity ' * /;
}
ELSEif(p==1) )。
{
return HUGE_VAL /* 'infinity' */;
}
elseif(Plow ) ) ) ) ) ) ) ) )。
{
/* rationalapproximationforlowerregion * /
q=sqrt(-2*log ) ) p );
return () () ) c[0]*qc[1] ) *q c[2] ) *q c[3] ) *q c[4] ) *q c[5] ) /
() ) d[0]*q d[1] ) *q d[2] ) *q d[3] ) q1 );
}
elseif(phigh ) )。
{
/* rationalapproximationforupperregion * /
q=sqrt(-2*log )1-p );
return-() () () c[0]*qc[1] ) *q c[2] ) *q c[3] ) *q c[4] ) *q c[5] ) /
() ) d[0]*q d[1] ) *q d[2] ) *q d[3] ) q1 );
}
else
{
/* rationalapproximationforcentralregion * /
q=p - 0.5;
r=q*q;
return () () ) a[0]*ra[1] ) *r a[2] ) *r a[3] ) *r a[4] ) *r a[5] ) q/
() ) b[0]*r b[1] ) *r b[2] ) *r b[3] ) *r b[4] ) r1 );
}
}
void main () )
{
ofstream out1;
out1.open (正态分布累积函数. xls );
for(intI=0; i1200; I )
out1
out1.close (;
out1.open (正态分布累积函数的反函数. xls );
for(I=0; i1000; I )
out10.001*i
out1.close (;
}