dexprl.f 1.7 KB

12345678910111213141516171819202122232425262728293031323334353637383940414243444546474849505152535455
  1. *DECK DEXPRL
  2. DOUBLE PRECISION FUNCTION DEXPRL (X)
  3. C***BEGIN PROLOGUE DEXPRL
  4. C***PURPOSE Calculate the relative error exponential (EXP(X)-1)/X.
  5. C***LIBRARY SLATEC (FNLIB)
  6. C***CATEGORY C4B
  7. C***TYPE DOUBLE PRECISION (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 EXPREL(X) = (EXP(X) - 1.0) / X. For small ABS(X) the
  13. C Taylor series is used. If X is negative the reflection formula
  14. C EXPREL(X) = EXP(X) * EXPREL(ABS(X))
  15. C may be used. This reflection formula will be of use when the
  16. C evaluation for small ABS(X) is done by Chebyshev series rather than
  17. C Taylor series.
  18. C
  19. C***REFERENCES (NONE)
  20. C***ROUTINES CALLED D1MACH
  21. C***REVISION HISTORY (YYMMDD)
  22. C 770801 DATE WRITTEN
  23. C 890531 Changed all specific intrinsics to generic. (WRB)
  24. C 890911 Removed unnecessary intrinsics. (WRB)
  25. C 890911 REVISION DATE from Version 3.2
  26. C 891214 Prologue converted to Version 4.0 format. (BAB)
  27. C***END PROLOGUE DEXPRL
  28. DOUBLE PRECISION X, ABSX, ALNEPS, XBND, XLN, XN, D1MACH
  29. LOGICAL FIRST
  30. SAVE NTERMS, XBND, FIRST
  31. DATA FIRST /.TRUE./
  32. C***FIRST EXECUTABLE STATEMENT DEXPRL
  33. IF (FIRST) THEN
  34. ALNEPS = LOG(D1MACH(3))
  35. XN = 3.72D0 - 0.3D0*ALNEPS
  36. XLN = LOG((XN+1.0D0)/1.36D0)
  37. NTERMS = XN - (XN*XLN+ALNEPS)/(XLN+1.36D0) + 1.5D0
  38. XBND = D1MACH(3)
  39. ENDIF
  40. FIRST = .FALSE.
  41. C
  42. ABSX = ABS(X)
  43. IF (ABSX.GT.0.5D0) DEXPRL = (EXP(X)-1.0D0)/X
  44. IF (ABSX.GT.0.5D0) RETURN
  45. C
  46. DEXPRL = 1.0D0
  47. IF (ABSX.LT.XBND) RETURN
  48. C
  49. DEXPRL = 0.0D0
  50. DO 20 I=1,NTERMS
  51. DEXPRL = 1.0D0 + DEXPRL*X/(NTERMS+2-I)
  52. 20 CONTINUE
  53. C
  54. RETURN
  55. END