1: static char Sccsid[] = "gamma.c @(#)gamma.c	1.1	10/1/82 Berkeley ";
   2: /*
   3: 	C program for floating point log gamma function
   4: 
   5: 	gamma(x) computes the log of the absolute
   6: 	value of the gamma function.
   7: 	The sign of the gamma function is returned in the
   8: 	external quantity signgam.
   9: 
  10: 	The coefficients for expansion around zero
  11: 	are #5243 from Hart & Cheney; for expansion
  12: 	around infinity they are #5404.
  13: 
  14: 	Calls log and sin.
  15: */
  16: 
  17: #include <errno.h>
  18: #include <math.h>
  19: 
  20: int errno;
  21: int signgam = 0;
  22: static double goobie    = 0.9189385332046727417803297;
  23: static double pi    = 3.1415926535897932384626434;
  24: 
  25: #define M 6
  26: #define N 8
  27: static double p1[] = {
  28:     0.83333333333333101837e-1,
  29:     -.277777777735865004e-2,
  30:     0.793650576493454e-3,
  31:     -.5951896861197e-3,
  32:     0.83645878922e-3,
  33:     -.1633436431e-2,
  34: };
  35: static double p2[] = {
  36:     -.42353689509744089647e5,
  37:     -.20886861789269887364e5,
  38:     -.87627102978521489560e4,
  39:     -.20085274013072791214e4,
  40:     -.43933044406002567613e3,
  41:     -.50108693752970953015e2,
  42:     -.67449507245925289918e1,
  43:     0.0,
  44: };
  45: static double q2[] = {
  46:     -.42353689509744090010e5,
  47:     -.29803853309256649932e4,
  48:     0.99403074150827709015e4,
  49:     -.15286072737795220248e4,
  50:     -.49902852662143904834e3,
  51:     0.18949823415702801641e3,
  52:     -.23081551524580124562e2,
  53:     0.10000000000000000000e1,
  54: };
  55: 
  56: double
  57: gamma(arg)
  58: double arg;
  59: {
  60:     double log(), pos(), neg(), asym();
  61: 
  62:     signgam = 1.;
  63:     if(arg <= 0.) return(neg(arg));
  64:     if(arg > 8.) return(asym(arg));
  65:     return(log(pos(arg)));
  66: }
  67: 
  68: static double
  69: asym(arg)
  70: double arg;
  71: {
  72:     double log();
  73:     double n, argsq;
  74:     int i;
  75: 
  76:     argsq = 1./(arg*arg);
  77:     for(n=0,i=M-1; i>=0; i--){
  78:         n = n*argsq + p1[i];
  79:     }
  80:     return((arg-.5)*log(arg) - arg + goobie + n/arg);
  81: }
  82: 
  83: static double
  84: neg(arg)
  85: double arg;
  86: {
  87:     double temp;
  88:     double log(), sin(), pos();
  89: 
  90:     arg = -arg;
  91:     temp = sin(pi*arg);
  92:     if(temp == 0.) {
  93:         errno = EDOM;
  94:         return(HUGE);
  95:     }
  96:     if(temp < 0.) temp = -temp;
  97:     else signgam = -1;
  98:     return(-log(arg*pos(arg)*temp/pi));
  99: }
 100: 
 101: static double
 102: pos(arg)
 103: double arg;
 104: {
 105:     double n, d, s;
 106:     register i;
 107: 
 108:     if(arg < 2.) return(pos(arg+1.)/arg);
 109:     if(arg > 3.) return((arg-1.)*pos(arg-1.));
 110: 
 111:     s = arg - 2.;
 112:     for(n=0,d=0,i=N-1; i>=0; i--){
 113:         n = n*s + p2[i];
 114:         d = d*s + q2[i];
 115:     }
 116:     return(n/d);
 117: }

Defined functions

asym defined in line 68; used 2 times
gamma defined in line 56; used 5 times
neg defined in line 83; used 2 times
pos defined in line 101; used 6 times

Defined variables

Sccsid defined in line 1; never used
errno defined in line 20; used 1 times
  • in line 93
goobie defined in line 22; used 1 times
  • in line 80
p1 defined in line 27; used 1 times
  • in line 78
p2 defined in line 35; used 1 times
pi defined in line 23; used 2 times
q2 defined in line 45; used 1 times
signgam defined in line 21; used 2 times

Defined macros

M defined in line 25; used 1 times
  • in line 77
N defined in line 26; used 1 times
Last modified: 1983-06-22
Generated: 2016-12-26
Generated by src2html V0.67
page hit count: 3077
Valid CSS Valid XHTML 1.0 Strict