gamma.f 4.4 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138
  1. *DECK GAMMA
  2. FUNCTION GAMMA (X)
  3. C***BEGIN PROLOGUE GAMMA
  4. C***PURPOSE Compute the complete Gamma function.
  5. C***LIBRARY SLATEC (FNLIB)
  6. C***CATEGORY C7A
  7. C***TYPE SINGLE PRECISION (GAMMA-S, DGAMMA-D, CGAMMA-C)
  8. C***KEYWORDS COMPLETE GAMMA FUNCTION, FNLIB, SPECIAL FUNCTIONS
  9. C***AUTHOR Fullerton, W., (LANL)
  10. C***DESCRIPTION
  11. C
  12. C GAMMA computes the gamma function at X, where X is not 0, -1, -2, ....
  13. C GAMMA and X are single precision.
  14. C
  15. C***REFERENCES (NONE)
  16. C***ROUTINES CALLED CSEVL, GAMLIM, INITS, R1MACH, R9LGMC, XERMSG
  17. C***REVISION HISTORY (YYMMDD)
  18. C 770601 DATE WRITTEN
  19. C 890531 Changed all specific intrinsics to generic. (WRB)
  20. C 890531 REVISION DATE from Version 3.2
  21. C 891214 Prologue converted to Version 4.0 format. (BAB)
  22. C 900315 CALLs to XERROR changed to CALLs to XERMSG. (THJ)
  23. C***END PROLOGUE GAMMA
  24. DIMENSION GCS(23)
  25. LOGICAL FIRST
  26. SAVE GCS, PI, SQ2PIL, NGCS, XMIN, XMAX, DXREL, FIRST
  27. DATA GCS ( 1) / .0085711955 90989331E0/
  28. DATA GCS ( 2) / .0044153813 24841007E0/
  29. DATA GCS ( 3) / .0568504368 1599363E0/
  30. DATA GCS ( 4) /-.0042198353 96418561E0/
  31. DATA GCS ( 5) / .0013268081 81212460E0/
  32. DATA GCS ( 6) /-.0001893024 529798880E0/
  33. DATA GCS ( 7) / .0000360692 532744124E0/
  34. DATA GCS ( 8) /-.0000060567 619044608E0/
  35. DATA GCS ( 9) / .0000010558 295463022E0/
  36. DATA GCS (10) /-.0000001811 967365542E0/
  37. DATA GCS (11) / .0000000311 772496471E0/
  38. DATA GCS (12) /-.0000000053 542196390E0/
  39. DATA GCS (13) / .0000000009 193275519E0/
  40. DATA GCS (14) /-.0000000001 577941280E0/
  41. DATA GCS (15) / .0000000000 270798062E0/
  42. DATA GCS (16) /-.0000000000 046468186E0/
  43. DATA GCS (17) / .0000000000 007973350E0/
  44. DATA GCS (18) /-.0000000000 001368078E0/
  45. DATA GCS (19) / .0000000000 000234731E0/
  46. DATA GCS (20) /-.0000000000 000040274E0/
  47. DATA GCS (21) / .0000000000 000006910E0/
  48. DATA GCS (22) /-.0000000000 000001185E0/
  49. DATA GCS (23) / .0000000000 000000203E0/
  50. DATA PI /3.14159 26535 89793 24E0/
  51. C SQ2PIL IS LOG (SQRT (2.*PI) )
  52. DATA SQ2PIL /0.91893 85332 04672 74E0/
  53. DATA FIRST /.TRUE./
  54. C
  55. C LANL DEPENDENT CODE REMOVED 81.02.04
  56. C
  57. C***FIRST EXECUTABLE STATEMENT GAMMA
  58. IF (FIRST) THEN
  59. C
  60. C ---------------------------------------------------------------------
  61. C INITIALIZE. FIND LEGAL BOUNDS FOR X, AND DETERMINE THE NUMBER OF
  62. C TERMS IN THE SERIES REQUIRED TO ATTAIN AN ACCURACY TEN TIMES BETTER
  63. C THAN MACHINE PRECISION.
  64. C
  65. NGCS = INITS (GCS, 23, 0.1*R1MACH(3))
  66. C
  67. CALL GAMLIM (XMIN, XMAX)
  68. DXREL = SQRT (R1MACH(4))
  69. C
  70. C ---------------------------------------------------------------------
  71. C FINISH INITIALIZATION. START EVALUATING GAMMA(X).
  72. C
  73. ENDIF
  74. FIRST = .FALSE.
  75. C
  76. Y = ABS(X)
  77. IF (Y.GT.10.0) GO TO 50
  78. C
  79. C COMPUTE GAMMA(X) FOR ABS(X) .LE. 10.0. REDUCE INTERVAL AND
  80. C FIND GAMMA(1+Y) FOR 0. .LE. Y .LT. 1. FIRST OF ALL.
  81. C
  82. N = X
  83. IF (X.LT.0.) N = N - 1
  84. Y = X - N
  85. N = N - 1
  86. GAMMA = 0.9375 + CSEVL(2.*Y-1., GCS, NGCS)
  87. IF (N.EQ.0) RETURN
  88. C
  89. IF (N.GT.0) GO TO 30
  90. C
  91. C COMPUTE GAMMA(X) FOR X .LT. 1.
  92. C
  93. N = -N
  94. IF (X .EQ. 0.) CALL XERMSG ('SLATEC', 'GAMMA', 'X IS 0', 4, 2)
  95. IF (X .LT. 0. .AND. X+N-2 .EQ. 0.) CALL XERMSG ('SLATEC', 'GAMMA'
  96. 1, 'X IS A NEGATIVE INTEGER', 4, 2)
  97. IF (X .LT. (-0.5) .AND. ABS((X-AINT(X-0.5))/X) .LT. DXREL) CALL
  98. 1XERMSG ( 'SLATEC', 'GAMMA',
  99. 2'ANSWER LT HALF PRECISION BECAUSE X TOO NEAR NEGATIVE INTEGER'
  100. 3, 1, 1)
  101. C
  102. DO 20 I=1,N
  103. GAMMA = GAMMA / (X+I-1)
  104. 20 CONTINUE
  105. RETURN
  106. C
  107. C GAMMA(X) FOR X .GE. 2.
  108. C
  109. 30 DO 40 I=1,N
  110. GAMMA = (Y+I)*GAMMA
  111. 40 CONTINUE
  112. RETURN
  113. C
  114. C COMPUTE GAMMA(X) FOR ABS(X) .GT. 10.0. RECALL Y = ABS(X).
  115. C
  116. 50 IF (X .GT. XMAX) CALL XERMSG ('SLATEC', 'GAMMA',
  117. + 'X SO BIG GAMMA OVERFLOWS', 3, 2)
  118. C
  119. GAMMA = 0.
  120. IF (X .LT. XMIN) CALL XERMSG ('SLATEC', 'GAMMA',
  121. + 'X SO SMALL GAMMA UNDERFLOWS', 2, 1)
  122. IF (X.LT.XMIN) RETURN
  123. C
  124. GAMMA = EXP((Y-0.5)*LOG(Y) - Y + SQ2PIL + R9LGMC(Y) )
  125. IF (X.GT.0.) RETURN
  126. C
  127. IF (ABS((X-AINT(X-0.5))/X) .LT. DXREL) CALL XERMSG ('SLATEC',
  128. + 'GAMMA',
  129. + 'ANSWER LT HALF PRECISION, X TOO NEAR NEGATIVE INTEGER', 1, 1)
  130. C
  131. SINPIY = SIN (PI*Y)
  132. IF (SINPIY .EQ. 0.) CALL XERMSG ('SLATEC', 'GAMMA',
  133. + 'X IS A NEGATIVE INTEGER', 4, 2)
  134. C
  135. GAMMA = -PI / (Y*SINPIY*GAMMA)
  136. C
  137. RETURN
  138. END