GNU Octave 10.1.0
A high-level interpreted language, primarily intended for numerical computations, mostly compatible with Matlab
 
Loading...
Searching...
No Matches
dlngam.f
Go to the documentation of this file.
1*DECK DLNGAM
2 DOUBLE PRECISION FUNCTION dlngam (X)
3C***BEGIN PROLOGUE DLNGAM
4C***PURPOSE Compute the logarithm of the absolute value of the Gamma
5C function.
6C***LIBRARY SLATEC (FNLIB)
7C***CATEGORY C7A
8C***TYPE DOUBLE PRECISION (ALNGAM-S, DLNGAM-D, CLNGAM-C)
9C***KEYWORDS ABSOLUTE VALUE, COMPLETE GAMMA FUNCTION, FNLIB, LOGARITHM,
10C SPECIAL FUNCTIONS
11C***AUTHOR Fullerton, W., (LANL)
12C***DESCRIPTION
13C
14C DLNGAM(X) calculates the double precision logarithm of the
15C absolute value of the Gamma function for double precision
16C argument X.
17C
18C***REFERENCES (NONE)
19C***ROUTINES CALLED D1MACH, D9LGMC, DGAMMA, XERMSG
20C***REVISION HISTORY (YYMMDD)
21C 770601 DATE WRITTEN
22C 890531 Changed all specific intrinsics to generic. (WRB)
23C 890531 REVISION DATE from Version 3.2
24C 891214 Prologue converted to Version 4.0 format. (BAB)
25C 900315 CALLs to XERROR changed to CALLs to XERMSG. (THJ)
26C 900727 Added EXTERNAL statement. (WRB)
27C***END PROLOGUE DLNGAM
28 DOUBLE PRECISION x, dxrel, pi, sinpiy, sqpi2l, sq2pil, xmax,
29 1 y, dgamma, d9lgmc, d1mach, temp
30 LOGICAL first
31 EXTERNAL dgamma
32 SAVE sq2pil, sqpi2l, pi, xmax, dxrel, first
33 DATA sq2pil / 0.9189385332 0467274178 0329736405 62 d0 /
34 DATA sqpi2l / +.2257913526 4472743236 3097614947 441 d+0 /
35 DATA pi / 3.1415926535 8979323846 2643383279 50 d0 /
36 DATA first /.true./
37C***FIRST EXECUTABLE STATEMENT DLNGAM
38 IF (first) THEN
39 temp = 1.d0/log(d1mach(2))
40 xmax = temp*d1mach(2)
41 dxrel = sqrt(d1mach(4))
42 ENDIF
43 first = .false.
44C
45 y = abs(x)
46 IF (y.GT.10.d0) GO TO 20
47C
48C LOG (ABS (DGAMMA(X)) ) FOR ABS(X) .LE. 10.0
49C
50 dlngam = log(abs(dgamma(x)) )
51 RETURN
52C
53C LOG ( ABS (DGAMMA(X)) ) FOR ABS(X) .GT. 10.0
54C
55 20 IF (y .GT. xmax) CALL xermsg ('SLATEC', 'DLNGAM',
56 + 'ABS(X) SO BIG DLNGAM OVERFLOWS', 2, 2)
57C
58 IF (x.GT.0.d0) dlngam = sq2pil + (x-0.5d0)*log(x) - x + d9lgmc(y)
59 IF (x.GT.0.d0) RETURN
60C
61 sinpiy = abs(sin(pi*y))
62 IF (sinpiy .EQ. 0.d0) CALL xermsg ('SLATEC', 'DLNGAM',
63 + 'X IS A NEGATIVE INTEGER', 3, 2)
64C
65 IF (abs((x-aint(x-0.5d0))/x) .LT. dxrel) CALL xermsg ('SLATEC',
66 + 'DLNGAM',
67 + 'ANSWER LT HALF PRECISION BECAUSE X TOO NEAR NEGATIVE INTEGER',
68 + 1, 1)
69C
70 dlngam = sqpi2l + (x-0.5d0)*log(y) - x - log(sinpiy) - d9lgmc(y)
71 RETURN
72C
73 END
double precision function d1mach(i)
Definition d1mach.f:23
double precision function d9lgmc(x)
Definition d9lgmc.f:3
double precision function dgamma(x)
Definition dgamma.f:3
double precision function dlngam(x)
Definition dlngam.f:3
octave_int< T > xmax(const octave_int< T > &x, const octave_int< T > &y)
subroutine xermsg(librar, subrou, messg, nerr, level)
Definition xermsg.f:3