gamrn.f 3.3 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105
  1. *DECK GAMRN
  2. REAL FUNCTION GAMRN (X)
  3. C***BEGIN PROLOGUE GAMRN
  4. C***SUBSIDIARY
  5. C***PURPOSE Subsidiary to BSKIN
  6. C***LIBRARY SLATEC
  7. C***TYPE SINGLE PRECISION (GAMRN-S, DGAMRN-D)
  8. C***AUTHOR Amos, D. E., (SNLA)
  9. C***DESCRIPTION
  10. C
  11. C Abstract
  12. C GAMRN computes the GAMMA function ratio GAMMA(X)/GAMMA(X+0.5)
  13. C for real X.gt.0. If X.ge.XMIN, an asymptotic expansion is
  14. C evaluated. If X.lt.XMIN, an integer is added to X to form a
  15. C new value of X.ge.XMIN and the asymptotic expansion is eval-
  16. C uated for this new value of X. Successive application of the
  17. C recurrence relation
  18. C
  19. C W(X)=W(X+1)*(1+0.5/X)
  20. C
  21. C reduces the argument to its original value. XMIN and comp-
  22. C utational tolerances are computed as a function of the number
  23. C of digits carried in a word by calls to I1MACH and R1MACH.
  24. C However, the computational accuracy is limited to the max-
  25. C imum of unit roundoff (=R1MACH(4)) and 1.0E-18 since critical
  26. C constants are given to only 18 digits.
  27. C
  28. C Input
  29. C X - Argument, X.gt.0.0
  30. C
  31. C OUTPUT
  32. C GAMRN - Ratio GAMMA(X)/GAMMA(X+0.5)
  33. C
  34. C***SEE ALSO BSKIN
  35. C***REFERENCES Y. L. Luke, The Special Functions and Their
  36. C Approximations, Vol. 1, Math In Sci. And
  37. C Eng. Series 53, Academic Press, New York, 1969,
  38. C pp. 34-35.
  39. C***ROUTINES CALLED I1MACH, R1MACH
  40. C***REVISION HISTORY (YYMMDD)
  41. C 820601 DATE WRITTEN
  42. C 890531 Changed all specific intrinsics to generic. (WRB)
  43. C 891214 Prologue converted to Version 4.0 format. (BAB)
  44. C 900328 Added TYPE section. (WRB)
  45. C 910722 Updated AUTHOR section. (ALS)
  46. C 920520 Added REFERENCES section. (WRB)
  47. C***END PROLOGUE GAMRN
  48. INTEGER I, I1M11, K, MX, NX
  49. INTEGER I1MACH
  50. REAL FLN, GR, RLN, S, TOL, TRM, X, XDMY, XINC, XM, XMIN, XP, XSQ
  51. REAL R1MACH
  52. DIMENSION GR(12)
  53. SAVE GR
  54. C
  55. DATA GR(1), GR(2), GR(3), GR(4), GR(5), GR(6), GR(7), GR(8),
  56. * GR(9), GR(10), GR(11), GR(12) /1.00000000000000000E+00,
  57. * -1.56250000000000000E-02,2.56347656250000000E-03,
  58. * -1.27983093261718750E-03,1.34351104497909546E-03,
  59. * -2.43289663922041655E-03,6.75423753364157164E-03,
  60. * -2.66369606131178216E-02,1.41527455519564332E-01,
  61. * -9.74384543032201613E-01,8.43686251229783675E+00,
  62. * -8.97258321640552515E+01/
  63. C
  64. C***FIRST EXECUTABLE STATEMENT GAMRN
  65. NX = INT(X)
  66. TOL = MAX(R1MACH(4),1.0E-18)
  67. I1M11 = I1MACH(11)
  68. RLN = R1MACH(5)*I1M11
  69. FLN = MIN(RLN,20.0E0)
  70. FLN = MAX(FLN,3.0E0)
  71. FLN = FLN - 3.0E0
  72. XM = 2.0E0 + FLN*(0.2366E0+0.01723E0*FLN)
  73. MX = INT(XM) + 1
  74. XMIN = MX
  75. XDMY = X - 0.25E0
  76. XINC = 0.0E0
  77. IF (X.GE.XMIN) GO TO 10
  78. XINC = XMIN - NX
  79. XDMY = XDMY + XINC
  80. 10 CONTINUE
  81. S = 1.0E0
  82. IF (XDMY*TOL.GT.1.0E0) GO TO 30
  83. XSQ = 1.0E0/(XDMY*XDMY)
  84. XP = XSQ
  85. DO 20 K=2,12
  86. TRM = GR(K)*XP
  87. IF (ABS(TRM).LT.TOL) GO TO 30
  88. S = S + TRM
  89. XP = XP*XSQ
  90. 20 CONTINUE
  91. 30 CONTINUE
  92. S = S/SQRT(XDMY)
  93. IF (XINC.NE.0.0E0) GO TO 40
  94. GAMRN = S
  95. RETURN
  96. 40 CONTINUE
  97. NX = INT(XINC)
  98. XP = 0.0E0
  99. DO 50 I=1,NX
  100. S = S*(1.0E0+0.5E0/(X+XP))
  101. XP = XP + 1.0E0
  102. 50 CONTINUE
  103. GAMRN = S
  104. RETURN
  105. END