Doxygen Source Code Documentation
cdf_62.c File Reference
#include "cdflib.h"Go to the source code of this file.
Functions | |
| double | Xgamm (double *a) |
Function Documentation
|
|
Definition at line 2 of file cdf_62.c. References a, exparg(), fifidint(), fifmod(), i, p, q, spmpar(), top, and Xgamm(). Referenced by gaminv(), gratio(), rcomp(), and Xgamm().
00019 {
00020 static double d = .41893853320467274178e0;
00021 static double pi = 3.1415926535898e0;
00022 static double r1 = .820756370353826e-03;
00023 static double r2 = -.595156336428591e-03;
00024 static double r3 = .793650663183693e-03;
00025 static double r4 = -.277777777770481e-02;
00026 static double r5 = .833333333333333e-01;
00027 static double p[7] = {
00028 .539637273585445e-03,.261939260042690e-02,.204493667594920e-01,
00029 .730981088720487e-01,.279648642639792e+00,.553413866010467e+00,1.0e0
00030 };
00031 static double q[7] = {
00032 -.832979206704073e-03,.470059485860584e-02,.225211131035340e-01,
00033 -.170458969313360e+00,-.567902761974940e-01,.113062953091122e+01,1.0e0
00034 };
00035 static int K2 = 3;
00036 static int K3 = 0;
00037 static double Xgamm,bot,g,lnx,s,t,top,w,x,z;
00038 static int i,j,m,n,T1;
00039 /*
00040 ..
00041 .. Executable Statements ..
00042 */
00043 Xgamm = 0.0e0;
00044 x = *a;
00045 if(fabs(*a) >= 15.0e0) goto S110;
00046 /*
00047 -----------------------------------------------------------------------
00048 EVALUATION OF GAMMA(A) FOR ABS(A) .LT. 15
00049 -----------------------------------------------------------------------
00050 */
00051 t = 1.0e0;
00052 m = fifidint(*a)-1;
00053 /*
00054 LET T BE THE PRODUCT OF A-J WHEN A .GE. 2
00055 */
00056 T1 = m;
00057 if(T1 < 0) goto S40;
00058 else if(T1 == 0) goto S30;
00059 else goto S10;
00060 S10:
00061 for(j=1; j<=m; j++) {
00062 x -= 1.0e0;
00063 t = x*t;
00064 }
00065 S30:
00066 x -= 1.0e0;
00067 goto S80;
00068 S40:
00069 /*
00070 LET T BE THE PRODUCT OF A+J WHEN A .LT. 1
00071 */
00072 t = *a;
00073 if(*a > 0.0e0) goto S70;
00074 m = -m-1;
00075 if(m == 0) goto S60;
00076 for(j=1; j<=m; j++) {
00077 x += 1.0e0;
00078 t = x*t;
00079 }
00080 S60:
00081 x += (0.5e0+0.5e0);
00082 t = x*t;
00083 if(t == 0.0e0) return Xgamm;
00084 S70:
00085 /*
00086 THE FOLLOWING CODE CHECKS IF 1/T CAN OVERFLOW. THIS
00087 CODE MAY BE OMITTED IF DESIRED.
00088 */
00089 if(fabs(t) >= 1.e-30) goto S80;
00090 if(fabs(t)*spmpar(&K2) <= 1.0001e0) return Xgamm;
00091 Xgamm = 1.0e0/t;
00092 return Xgamm;
00093 S80:
00094 /*
00095 COMPUTE GAMMA(1 + X) FOR 0 .LE. X .LT. 1
00096 */
00097 top = p[0];
00098 bot = q[0];
00099 for(i=1; i<7; i++) {
00100 top = p[i]+x*top;
00101 bot = q[i]+x*bot;
00102 }
00103 Xgamm = top/bot;
00104 /*
00105 TERMINATION
00106 */
00107 if(*a < 1.0e0) goto S100;
00108 Xgamm *= t;
00109 return Xgamm;
00110 S100:
00111 Xgamm /= t;
00112 return Xgamm;
00113 S110:
00114 /*
00115 -----------------------------------------------------------------------
00116 EVALUATION OF GAMMA(A) FOR ABS(A) .GE. 15
00117 -----------------------------------------------------------------------
00118 */
00119 if(fabs(*a) >= 1.e3) return Xgamm;
00120 if(*a > 0.0e0) goto S120;
00121 x = -*a;
00122 n = x;
00123 t = x-(double)n;
00124 if(t > 0.9e0) t = 1.0e0-t;
00125 s = sin(pi*t)/pi;
00126 if(fifmod(n,2) == 0) s = -s;
00127 if(s == 0.0e0) return Xgamm;
00128 S120:
00129 /*
00130 COMPUTE THE MODIFIED ASYMPTOTIC SUM
00131 */
00132 t = 1.0e0/(x*x);
00133 g = ((((r1*t+r2)*t+r3)*t+r4)*t+r5)/x;
00134 /*
00135 ONE MAY REPLACE THE NEXT STATEMENT WITH LNX = ALOG(X)
00136 BUT LESS ACCURACY WILL NORMALLY BE OBTAINED.
00137 */
00138 lnx = log(x);
00139 /*
00140 FINAL ASSEMBLY
00141 */
00142 z = x;
00143 g = d+g+(z-0.5e0)*(lnx-1.e0);
00144 w = g;
00145 t = g-w;
00146 if(w > 0.99999e0*exparg(&K3)) return Xgamm;
00147 Xgamm = exp(w)*(1.0e0+t);
00148 if(*a < 0.0e0) Xgamm = 1.0e0/(Xgamm*s)/x;
00149 return Xgamm;
00150 } /* END */
|