atan.c 1.5 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778
  1. /*
  2. floating-point arctangent
  3. atan returns the value of the arctangent of its
  4. argument in the range [-pi/2,pi/2].
  5. atan2 returns the arctangent of arg1/arg2
  6. in the range [-pi,pi].
  7. there are no error returns.
  8. coefficients are #5077 from Hart & Cheney. (19.56D)
  9. */
  10. #include <u.h>
  11. #include <libc.h>
  12. #define sq2p1 2.414213562373095048802e0
  13. #define sq2m1 .414213562373095048802e0
  14. #define p4 .161536412982230228262e2
  15. #define p3 .26842548195503973794141e3
  16. #define p2 .11530293515404850115428136e4
  17. #define p1 .178040631643319697105464587e4
  18. #define p0 .89678597403663861959987488e3
  19. #define q4 .5895697050844462222791e2
  20. #define q3 .536265374031215315104235e3
  21. #define q2 .16667838148816337184521798e4
  22. #define q1 .207933497444540981287275926e4
  23. #define q0 .89678597403663861962481162e3
  24. /*
  25. xatan evaluates a series valid in the
  26. range [-0.414...,+0.414...]. (tan(pi/8))
  27. */
  28. static
  29. double
  30. xatan(double arg)
  31. {
  32. double argsq, value;
  33. argsq = arg*arg;
  34. value = ((((p4*argsq + p3)*argsq + p2)*argsq + p1)*argsq + p0);
  35. value = value/(((((argsq + q4)*argsq + q3)*argsq + q2)*argsq + q1)*argsq + q0);
  36. return value*arg;
  37. }
  38. /*
  39. satan reduces its argument (known to be positive)
  40. to the range [0,0.414...] and calls xatan.
  41. */
  42. static
  43. double
  44. satan(double arg)
  45. {
  46. if(arg < sq2m1)
  47. return xatan(arg);
  48. if(arg > sq2p1)
  49. return PIO2 - xatan(1/arg);
  50. return PIO2/2 + xatan((arg-1)/(arg+1));
  51. }
  52. /*
  53. atan makes its argument positive and
  54. calls the inner routine satan.
  55. */
  56. double
  57. atan(double arg)
  58. {
  59. if(arg > 0)
  60. return satan(arg);
  61. return -satan(-arg);
  62. }