1234567891011121314151617181920212223242526272829303132333435363738394041424344454647484950515253 |
- *DECK CEXPRL
- COMPLEX FUNCTION CEXPRL (Z)
- C***BEGIN PROLOGUE CEXPRL
- C***PURPOSE Calculate the relative error exponential (EXP(X)-1)/X.
- C***LIBRARY SLATEC (FNLIB)
- C***CATEGORY C4B
- C***TYPE COMPLEX (EXPREL-S, DEXPRL-D, CEXPRL-C)
- C***KEYWORDS ELEMENTARY FUNCTIONS, EXPONENTIAL, FIRST ORDER, FNLIB
- C***AUTHOR Fullerton, W., (LANL)
- C***DESCRIPTION
- C
- C Evaluate (EXP(Z)-1)/Z . For small ABS(Z), we use the Taylor
- C series. We could instead use the expression
- C CEXPRL(Z) = (EXP(X)*EXP(I*Y)-1)/Z
- C = (X*EXPREL(X) * (1 - 2*SIN(Y/2)**2) - 2*SIN(Y/2)**2
- C + I*SIN(Y)*(1+X*EXPREL(X))) / Z
- C
- C***REFERENCES (NONE)
- C***ROUTINES CALLED R1MACH
- C***REVISION HISTORY (YYMMDD)
- C 770801 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***END PROLOGUE CEXPRL
- COMPLEX Z
- LOGICAL FIRST
- SAVE NTERMS, RBND, FIRST
- DATA FIRST / .TRUE. /
- C***FIRST EXECUTABLE STATEMENT CEXPRL
- IF (FIRST) THEN
- ALNEPS = LOG(R1MACH(3))
- XN = 3.72 - 0.3*ALNEPS
- XLN = LOG((XN+1.0)/1.36)
- NTERMS = XN - (XN*XLN+ALNEPS)/(XLN+1.36) + 1.5
- RBND = R1MACH(3)
- ENDIF
- FIRST = .FALSE.
- C
- R = ABS(Z)
- IF (R.GT.0.5) CEXPRL = (EXP(Z) - 1.0) / Z
- IF (R.GT.0.5) RETURN
- C
- CEXPRL = (1.0, 0.0)
- IF (R.LT.RBND) RETURN
- C
- CEXPRL = (0.0, 0.0)
- DO 20 I=1,NTERMS
- CEXPRL = 1.0 + CEXPRL*Z/(NTERMS+2-I)
- 20 CONTINUE
- C
- RETURN
- END
|