alnrel.f 3.2 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778
  1. *DECK ALNREL
  2. FUNCTION ALNREL (X)
  3. C***BEGIN PROLOGUE ALNREL
  4. C***PURPOSE Evaluate ln(1+X) accurate in the sense of relative error.
  5. C***LIBRARY SLATEC (FNLIB)
  6. C***CATEGORY C4B
  7. C***TYPE SINGLE PRECISION (ALNREL-S, DLNREL-D, CLNREL-C)
  8. C***KEYWORDS ELEMENTARY FUNCTIONS, FNLIB, LOGARITHM
  9. C***AUTHOR Fullerton, W., (LANL)
  10. C***DESCRIPTION
  11. C
  12. C ALNREL(X) evaluates ln(1+X) accurately in the sense of relative
  13. C error when X is very small. This routine must be used to
  14. C maintain relative error accuracy whenever X is small and
  15. C accurately known.
  16. C
  17. C Series for ALNR on the interval -3.75000D-01 to 3.75000D-01
  18. C with weighted error 1.93E-17
  19. C log weighted error 16.72
  20. C significant figures required 16.44
  21. C decimal places required 17.40
  22. C
  23. C***REFERENCES (NONE)
  24. C***ROUTINES CALLED CSEVL, INITS, R1MACH, XERMSG
  25. C***REVISION HISTORY (YYMMDD)
  26. C 770401 DATE WRITTEN
  27. C 890531 Changed all specific intrinsics to generic. (WRB)
  28. C 890531 REVISION DATE from Version 3.2
  29. C 891214 Prologue converted to Version 4.0 format. (BAB)
  30. C 900315 CALLs to XERROR changed to CALLs to XERMSG. (THJ)
  31. C 900326 Removed duplicate information from DESCRIPTION section.
  32. C (WRB)
  33. C***END PROLOGUE ALNREL
  34. DIMENSION ALNRCS(23)
  35. LOGICAL FIRST
  36. SAVE ALNRCS, NLNREL, XMIN, FIRST
  37. DATA ALNRCS( 1) / 1.0378693562 743770E0 /
  38. DATA ALNRCS( 2) / -.1336430150 4908918E0 /
  39. DATA ALNRCS( 3) / .0194082491 35520563E0 /
  40. DATA ALNRCS( 4) / -.0030107551 12753577E0 /
  41. DATA ALNRCS( 5) / .0004869461 47971548E0 /
  42. DATA ALNRCS( 6) / -.0000810548 81893175E0 /
  43. DATA ALNRCS( 7) / .0000137788 47799559E0 /
  44. DATA ALNRCS( 8) / -.0000023802 21089435E0 /
  45. DATA ALNRCS( 9) / .0000004164 04162138E0 /
  46. DATA ALNRCS(10) / -.0000000735 95828378E0 /
  47. DATA ALNRCS(11) / .0000000131 17611876E0 /
  48. DATA ALNRCS(12) / -.0000000023 54670931E0 /
  49. DATA ALNRCS(13) / .0000000004 25227732E0 /
  50. DATA ALNRCS(14) / -.0000000000 77190894E0 /
  51. DATA ALNRCS(15) / .0000000000 14075746E0 /
  52. DATA ALNRCS(16) / -.0000000000 02576907E0 /
  53. DATA ALNRCS(17) / .0000000000 00473424E0 /
  54. DATA ALNRCS(18) / -.0000000000 00087249E0 /
  55. DATA ALNRCS(19) / .0000000000 00016124E0 /
  56. DATA ALNRCS(20) / -.0000000000 00002987E0 /
  57. DATA ALNRCS(21) / .0000000000 00000554E0 /
  58. DATA ALNRCS(22) / -.0000000000 00000103E0 /
  59. DATA ALNRCS(23) / .0000000000 00000019E0 /
  60. DATA FIRST /.TRUE./
  61. C***FIRST EXECUTABLE STATEMENT ALNREL
  62. IF (FIRST) THEN
  63. NLNREL = INITS (ALNRCS, 23, 0.1*R1MACH(3))
  64. XMIN = -1.0 + SQRT(R1MACH(4))
  65. ENDIF
  66. FIRST = .FALSE.
  67. C
  68. IF (X .LE. (-1.0)) CALL XERMSG ('SLATEC', 'ALNREL', 'X IS LE -1',
  69. + 2, 2)
  70. IF (X .LT. XMIN) CALL XERMSG ('SLATEC', 'ALNREL',
  71. + 'ANSWER LT HALF PRECISION BECAUSE X TOO NEAR -1', 1, 1)
  72. C
  73. IF (ABS(X).LE.0.375) ALNREL = X*(1. -
  74. 1 X*CSEVL (X/.375, ALNRCS, NLNREL))
  75. IF (ABS(X).GT.0.375) ALNREL = LOG (1.0+X)
  76. C
  77. RETURN
  78. END