mirror of
https://git.planet-casio.com/Lephenixnoir/OpenLibm.git
synced 2025-01-01 06:23:39 +01:00
c977aa998f
Replace amos with slatec
62 lines
2.1 KiB
Fortran
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
|