77 if((x<0.0) || (a<=0.0))
return(nan(
""));
79 if((x<1.0) || (x<a))
return(1.0-
igam(a, x));
81 double ans, ax, c, yc, r, t, y, z;
82 double pk, pkm1, pkm2, qk, qkm1, qkm2;
83 double big=4.503599627370496E+015;
84 double biginv=2.22044604925031308085E-016;
86 ax = a*log(x) - x - lgamma(a);
87 if(ax < -DBL_MAX_10_EXP)
return(0.0);
91 y=1.0-a; z=x+y+1.0; c=0.0;
92 pkm2=1.0; qkm2=x; pkm1=x+1.0; qkm1=z*x;
95 c+=1.0; y+=1.0; z+=2.0;
96 yc=y*c; pk=pkm1*z - pkm2*yc; qk=qkm1*z - qkm2*yc;
97 if(qk!=0.0) {r=pk/qk; t=fabs((ans-r)/r); ans=r;}
99 pkm2=pkm1; pkm1=pk; qkm2=qkm1; qkm1=qk;
100 if(fabs(pk)>big) {pkm2*=biginv; pkm1*=biginv; qkm2*=biginv; qkm1*=biginv;}
101 }
while(t>DBL_EPSILON);