00001
00002 DOUBLE PRECISION FUNCTION DGAMIT (A, X)
00003
00004
00005
00006
00007
00008
00009
00010
00011
00012
00013
00014
00015
00016
00017
00018
00019
00020
00021
00022
00023
00024
00025
00026
00027
00028
00029
00030
00031
00032
00033
00034
00035
00036
00037
00038
00039
00040
00041
00042
00043
00044
00045
00046
00047
00048
00049
00050
00051 DOUBLE PRECISION A, X, AEPS, AINTA, ALGAP1, ALNEPS, ALNG, ALX,
00052 1 BOT, H, SGA, SGNGAM, SQEPS, T, D1MACH, DGAMR, D9GMIT, D9LGIT,
00053 2 DLNGAM, D9LGIC
00054 LOGICAL FIRST
00055 SAVE ALNEPS, SQEPS, BOT, FIRST
00056 DATA FIRST /.TRUE./
00057
00058 IF (FIRST) THEN
00059 ALNEPS = -LOG (D1MACH(3))
00060 SQEPS = SQRT(D1MACH(4))
00061 BOT = LOG (D1MACH(1))
00062 ENDIF
00063 FIRST = .FALSE.
00064
00065 IF (X .LT. 0.D0) CALL XERMSG ('SLATEC', 'DGAMIT', 'X IS NEGATIVE'
00066 + , 2, 2)
00067
00068 IF (X.NE.0.D0) ALX = LOG (X)
00069 SGA = 1.0D0
00070 IF (A.NE.0.D0) SGA = SIGN (1.0D0, A)
00071 AINTA = AINT (A + 0.5D0*SGA)
00072 AEPS = A - AINTA
00073
00074 IF (X.GT.0.D0) GO TO 20
00075 DGAMIT = 0.0D0
00076 IF (AINTA.GT.0.D0 .OR. AEPS.NE.0.D0) DGAMIT = DGAMR(A+1.0D0)
00077 RETURN
00078
00079 20 IF (X.GT.1.D0) GO TO 30
00080 IF (A.GE.(-0.5D0) .OR. AEPS.NE.0.D0) CALL DLGAMS (A+1.0D0, ALGAP1,
00081 1 SGNGAM)
00082 DGAMIT = D9GMIT (A, X, ALGAP1, SGNGAM, ALX)
00083 RETURN
00084
00085 30 IF (A.LT.X) GO TO 40
00086 T = D9LGIT (A, X, DLNGAM(A+1.0D0))
00087 IF (T.LT.BOT) CALL XERCLR
00088 DGAMIT = EXP (T)
00089 RETURN
00090
00091 40 ALNG = D9LGIC (A, X, ALX)
00092
00093
00094
00095 H = 1.0D0
00096 IF (AEPS.EQ.0.D0 .AND. AINTA.LE.0.D0) GO TO 50
00097
00098 CALL DLGAMS (A+1.0D0, ALGAP1, SGNGAM)
00099 T = LOG (ABS(A)) + ALNG - ALGAP1
00100 IF (T.GT.ALNEPS) GO TO 60
00101
00102 IF (T.GT.(-ALNEPS)) H = 1.0D0 - SGA * SGNGAM * EXP(T)
00103 IF (ABS(H).GT.SQEPS) GO TO 50
00104
00105 CALL XERCLR
00106 CALL XERMSG ('SLATEC', 'DGAMIT', 'RESULT LT HALF PRECISION', 1,
00107 + 1)
00108
00109 50 T = -A*ALX + LOG(ABS(H))
00110 IF (T.LT.BOT) CALL XERCLR
00111 DGAMIT = SIGN (EXP(T), H)
00112 RETURN
00113
00114 60 T = T - A*ALX
00115 IF (T.LT.BOT) CALL XERCLR
00116 DGAMIT = -SGA * SGNGAM * EXP(T)
00117 RETURN
00118
00119 END