OpenLibm/slatec/dgamlm.f
Viral B. Shah c977aa998f Add Makefile.extras to build libopenlibm-extras.
Replace amos with slatec
2012-12-31 16:37:05 -05:00

62 lines
2.1 KiB
Fortran

*DECK DGAMLM
SUBROUTINE DGAMLM (XMIN, XMAX)
C***BEGIN PROLOGUE DGAMLM
C***PURPOSE Compute the minimum and maximum bounds for the argument in
C the Gamma function.
C***LIBRARY SLATEC (FNLIB)
C***CATEGORY C7A, R2
C***TYPE DOUBLE PRECISION (GAMLIM-S, DGAMLM-D)
C***KEYWORDS COMPLETE GAMMA FUNCTION, FNLIB, LIMITS, SPECIAL FUNCTIONS
C***AUTHOR Fullerton, W., (LANL)
C***DESCRIPTION
C
C Calculate the minimum and maximum legal bounds for X in gamma(X).
C XMIN and XMAX are not the only bounds, but they are the only non-
C trivial ones to calculate.
C
C Output Arguments --
C XMIN double precision minimum legal value of X in gamma(X). Any
C smaller value of X might result in underflow.
C XMAX double precision maximum legal value of X in gamma(X). Any
C larger value of X might cause overflow.
C
C***REFERENCES (NONE)
C***ROUTINES CALLED D1MACH, XERMSG
C***REVISION HISTORY (YYMMDD)
C 770601 DATE WRITTEN
C 890531 Changed all specific intrinsics to generic. (WRB)
C 890531 REVISION DATE from Version 3.2
C 891214 Prologue converted to Version 4.0 format. (BAB)
C 900315 CALLs to XERROR changed to CALLs to XERMSG. (THJ)
C***END PROLOGUE DGAMLM
DOUBLE PRECISION XMIN, XMAX, ALNBIG, ALNSML, XLN, XOLD, D1MACH
C***FIRST EXECUTABLE STATEMENT DGAMLM
ALNSML = LOG(D1MACH(1))
XMIN = -ALNSML
DO 10 I=1,10
XOLD = XMIN
XLN = LOG(XMIN)
XMIN = XMIN - XMIN*((XMIN+0.5D0)*XLN - XMIN - 0.2258D0 + ALNSML)
1 / (XMIN*XLN+0.5D0)
IF (ABS(XMIN-XOLD).LT.0.005D0) GO TO 20
10 CONTINUE
CALL XERMSG ('SLATEC', 'DGAMLM', 'UNABLE TO FIND XMIN', 1, 2)
C
20 XMIN = -XMIN + 0.01D0
C
ALNBIG = LOG (D1MACH(2))
XMAX = ALNBIG
DO 30 I=1,10
XOLD = XMAX
XLN = LOG(XMAX)
XMAX = XMAX - XMAX*((XMAX-0.5D0)*XLN - XMAX + 0.9189D0 - ALNBIG)
1 / (XMAX*XLN-0.5D0)
IF (ABS(XMAX-XOLD).LT.0.005D0) GO TO 40
30 CONTINUE
CALL XERMSG ('SLATEC', 'DGAMLM', 'UNABLE TO FIND XMAX', 2, 2)
C
40 XMAX = XMAX - 0.01D0
XMIN = MAX (XMIN, -XMAX+1.D0)
C
RETURN
END