cexprl.f 1.6 KB

1234567891011121314151617181920212223242526272829303132333435363738394041424344454647484950515253
  1. *DECK CEXPRL
  2. COMPLEX FUNCTION CEXPRL (Z)
  3. C***BEGIN PROLOGUE CEXPRL
  4. C***PURPOSE Calculate the relative error exponential (EXP(X)-1)/X.
  5. C***LIBRARY SLATEC (FNLIB)
  6. C***CATEGORY C4B
  7. C***TYPE COMPLEX (EXPREL-S, DEXPRL-D, CEXPRL-C)
  8. C***KEYWORDS ELEMENTARY FUNCTIONS, EXPONENTIAL, FIRST ORDER, FNLIB
  9. C***AUTHOR Fullerton, W., (LANL)
  10. C***DESCRIPTION
  11. C
  12. C Evaluate (EXP(Z)-1)/Z . For small ABS(Z), we use the Taylor
  13. C series. We could instead use the expression
  14. C CEXPRL(Z) = (EXP(X)*EXP(I*Y)-1)/Z
  15. C = (X*EXPREL(X) * (1 - 2*SIN(Y/2)**2) - 2*SIN(Y/2)**2
  16. C + I*SIN(Y)*(1+X*EXPREL(X))) / Z
  17. C
  18. C***REFERENCES (NONE)
  19. C***ROUTINES CALLED R1MACH
  20. C***REVISION HISTORY (YYMMDD)
  21. C 770801 DATE WRITTEN
  22. C 890531 Changed all specific intrinsics to generic. (WRB)
  23. C 890531 REVISION DATE from Version 3.2
  24. C 891214 Prologue converted to Version 4.0 format. (BAB)
  25. C***END PROLOGUE CEXPRL
  26. COMPLEX Z
  27. LOGICAL FIRST
  28. SAVE NTERMS, RBND, FIRST
  29. DATA FIRST / .TRUE. /
  30. C***FIRST EXECUTABLE STATEMENT CEXPRL
  31. IF (FIRST) THEN
  32. ALNEPS = LOG(R1MACH(3))
  33. XN = 3.72 - 0.3*ALNEPS
  34. XLN = LOG((XN+1.0)/1.36)
  35. NTERMS = XN - (XN*XLN+ALNEPS)/(XLN+1.36) + 1.5
  36. RBND = R1MACH(3)
  37. ENDIF
  38. FIRST = .FALSE.
  39. C
  40. R = ABS(Z)
  41. IF (R.GT.0.5) CEXPRL = (EXP(Z) - 1.0) / Z
  42. IF (R.GT.0.5) RETURN
  43. C
  44. CEXPRL = (1.0, 0.0)
  45. IF (R.LT.RBND) RETURN
  46. C
  47. CEXPRL = (0.0, 0.0)
  48. DO 20 I=1,NTERMS
  49. CEXPRL = 1.0 + CEXPRL*Z/(NTERMS+2-I)
  50. 20 CONTINUE
  51. C
  52. RETURN
  53. END