atan2.c 822 B

12345678910111213141516171819202122232425262728293031323334353637383940414243444546
  1. /*
  2. * (c) copyright 1988 by the Vrije Universiteit, Amsterdam, The Netherlands.
  3. * See the copyright notice in the ACK home directory, in the file "Copyright".
  4. *
  5. * Author: Ceriel J.H. Jacobs
  6. */
  7. /* $Id$ */
  8. #include <math.h>
  9. #include <errno.h>
  10. extern int errno;
  11. double
  12. atan2(y, x)
  13. double x, y;
  14. {
  15. extern double atan();
  16. double absx, absy, val;
  17. if (x == 0 && y == 0) {
  18. errno = EDOM;
  19. return 0;
  20. }
  21. absy = y < 0 ? -y : y;
  22. absx = x < 0 ? -x : x;
  23. if (absy - absx == absy) {
  24. /* x negligible compared to y */
  25. return y < 0 ? -M_PI_2 : M_PI_2;
  26. }
  27. if (absx - absy == absx) {
  28. /* y negligible compared to x */
  29. val = 0.0;
  30. }
  31. else val = atan(y/x);
  32. if (x > 0) {
  33. /* first or fourth quadrant; already correct */
  34. return val;
  35. }
  36. if (y < 0) {
  37. /* third quadrant */
  38. return val - M_PI;
  39. }
  40. return val + M_PI;
  41. }