r9atn1.f 3.2 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687
  1. *DECK R9ATN1
  2. FUNCTION R9ATN1 (X)
  3. C***BEGIN PROLOGUE R9ATN1
  4. C***SUBSIDIARY
  5. C***PURPOSE Evaluate ATAN(X) from first order relative accuracy so that
  6. C ATAN(X) = X + X**3*R9ATN1(X).
  7. C***LIBRARY SLATEC (FNLIB)
  8. C***CATEGORY C4A
  9. C***TYPE SINGLE PRECISION (R9ATN1-S, D9ATN1-D)
  10. C***KEYWORDS ARC TANGENT, ELEMENTARY FUNCTIONS, FIRST ORDER, FNLIB,
  11. C TRIGONOMETRIC
  12. C***AUTHOR Fullerton, W., (LANL)
  13. C***DESCRIPTION
  14. C
  15. C Evaluate ATAN(X) from first order, that is, evaluate
  16. C (ATAN(X)-X)/X**3 with relative error accuracy so that
  17. C ATAN(X) = X + X**3*R9ATN1(X).
  18. C
  19. C Series for ATN1 on the interval 0. to 1.00000D+00
  20. C with weighted error 2.21E-17
  21. C log weighted error 16.66
  22. C significant figures required 15.44
  23. C decimal places required 17.32
  24. C
  25. C***REFERENCES (NONE)
  26. C***ROUTINES CALLED CSEVL, INITS, R1MACH, XERMSG
  27. C***REVISION HISTORY (YYMMDD)
  28. C 780401 DATE WRITTEN
  29. C 890206 REVISION DATE from Version 3.2
  30. C 891214 Prologue converted to Version 4.0 format. (BAB)
  31. C 900315 CALLs to XERROR changed to CALLs to XERMSG. (THJ)
  32. C 900720 Routine changed from user-callable to subsidiary. (WRB)
  33. C***END PROLOGUE R9ATN1
  34. DIMENSION ATN1CS(21)
  35. LOGICAL FIRST
  36. SAVE ATN1CS, NTATN1, XSML, XBIG, XMAX, FIRST
  37. DATA ATN1CS( 1) / -.0328399753 5355202E0 /
  38. DATA ATN1CS( 2) / .0583343234 3172412E0 /
  39. DATA ATN1CS( 3) / -.0074003696 9671964E0 /
  40. DATA ATN1CS( 4) / .0010097841 9933728E0 /
  41. DATA ATN1CS( 5) / -.0001439787 1635652E0 /
  42. DATA ATN1CS( 6) / .0000211451 2648992E0 /
  43. DATA ATN1CS( 7) / -.0000031723 2107425E0 /
  44. DATA ATN1CS( 8) / .0000004836 6203654E0 /
  45. DATA ATN1CS( 9) / -.0000000746 7746546E0 /
  46. DATA ATN1CS(10) / .0000000116 4800896E0 /
  47. DATA ATN1CS(11) / -.0000000018 3208837E0 /
  48. DATA ATN1CS(12) / .0000000002 9019082E0 /
  49. DATA ATN1CS(13) / -.0000000000 4623885E0 /
  50. DATA ATN1CS(14) / .0000000000 0740552E0 /
  51. DATA ATN1CS(15) / -.0000000000 0119135E0 /
  52. DATA ATN1CS(16) / .0000000000 0019240E0 /
  53. DATA ATN1CS(17) / -.0000000000 0003118E0 /
  54. DATA ATN1CS(18) / .0000000000 0000506E0 /
  55. DATA ATN1CS(19) / -.0000000000 0000082E0 /
  56. DATA ATN1CS(20) / .0000000000 0000013E0 /
  57. DATA ATN1CS(21) / -.0000000000 0000002E0 /
  58. DATA FIRST /.TRUE./
  59. C***FIRST EXECUTABLE STATEMENT R9ATN1
  60. IF (FIRST) THEN
  61. EPS = R1MACH(3)
  62. NTATN1 = INITS (ATN1CS, 21, 0.1*EPS)
  63. C
  64. XSML = SQRT (0.1*EPS)
  65. XBIG = 1.571/SQRT(EPS)
  66. XMAX = 1.571/EPS
  67. ENDIF
  68. FIRST = .FALSE.
  69. C
  70. Y = ABS(X)
  71. IF (Y.GT.1.0) GO TO 20
  72. C
  73. IF (Y.LE.XSML) R9ATN1 = -1.0/3.0
  74. IF (Y.LE.XSML) RETURN
  75. C
  76. R9ATN1 = -0.25 + CSEVL (2.0*Y*Y-1., ATN1CS, NTATN1)
  77. RETURN
  78. C
  79. 20 IF (Y .GT. XMAX) CALL XERMSG ('SLATEC', 'R9ATN1',
  80. + 'NO PRECISION IN ANSWER BECAUSE X IS TOO BIG', 2, 2)
  81. IF (Y .GT. XBIG) CALL XERMSG ('SLATEC', 'R9ATN1',
  82. + 'ANSWER LT HALF PRECISION BECAUSE X IS TOO BIG', 1, 1)
  83. C
  84. R9ATN1 = (ATAN(X) - X) / X**3
  85. RETURN
  86. C
  87. END