/* origin: FreeBSD /usr/src/lib/msun/src/e_atan2.c */
/*
 * ====================================================
 * Copyright (C) 1993 by Sun Microsystems, Inc. All rights reserved.
 *
 * Developed at SunSoft, a Sun Microsystems, Inc. business.
 * Permission to use, copy, modify, and distribute this
 * software is freely granted, provided that this notice
 * is preserved.
 * ====================================================
 *
 */
/* atan2(y,x)
 * Method :
 *      1. Reduce y to positive by atan2(y,x)=-atan2(-y,x).
 *      2. Reduce x to positive by (if x and y are unexceptional):
 *              ARG (x+iy) = arctan(y/x)           ... if x > 0,
 *              ARG (x+iy) = pi - arctan[y/(-x)]   ... if x < 0,
 *
 * Special cases:
 *
 *      ATAN2((anything), NaN ) is NaN;
 *      ATAN2(NAN , (anything) ) is NaN;
 *      ATAN2(+-0, +(anything but NaN)) is +-0  ;
 *      ATAN2(+-0, -(anything but NaN)) is +-pi ;
 *      ATAN2(+-(anything but 0 and NaN), 0) is +-pi/2;
 *      ATAN2(+-(anything but INF and NaN), +INF) is +-0 ;
 *      ATAN2(+-(anything but INF and NaN), -INF) is +-pi;
 *      ATAN2(+-INF,+INF ) is +-pi/4 ;
 *      ATAN2(+-INF,-INF ) is +-3pi/4;
 *      ATAN2(+-INF, (anything but,0,NaN, and INF)) is +-pi/2;
 *
 * Constants:
 * The hexadecimal values are the intended ones for the following
 * constants. The decimal values may be used, provided that the
 * compiler will convert from decimal to binary accurately enough
 * to produce the hexadecimal values shown.
 */

#include "libm.h"

static const double pi = 3.1415926535897931160E+00, /* 0x400921FB, 0x54442D18 */
    pi_lo = 1.2246467991473531772E-16;              /* 0x3CA1A626, 0x33145C07 */

double atan2(double y, double x) {
  double z;
  uint32_t m, lx, ly, ix, iy;

  if (isnan(x) || isnan(y))
    return x + y;
  EXTRACT_WORDS(ix, lx, x);
  EXTRACT_WORDS(iy, ly, y);
  if ((ix - 0x3ff00000 | lx) == 0) /* x = 1.0 */
    return atan(y);
  m = ((iy >> 31) & 1) | ((ix >> 30) & 2); /* 2*sign(x)+sign(y) */
  ix = ix & 0x7fffffff;
  iy = iy & 0x7fffffff;

  /* when y = 0 */
  if ((iy | ly) == 0) {
    switch (m) {
      case 0:
      case 1:
        return y; /* atan(+-0,+anything)=+-0 */
      case 2:
        return pi; /* atan(+0,-anything) = pi */
      case 3:
        return -pi; /* atan(-0,-anything) =-pi */
    }
  }
  /* when x = 0 */
  if ((ix | lx) == 0)
    return m & 1 ? -pi / 2 : pi / 2;
  /* when x is INF */
  if (ix == 0x7ff00000) {
    if (iy == 0x7ff00000) {
      switch (m) {
        case 0:
          return pi / 4; /* atan(+INF,+INF) */
        case 1:
          return -pi / 4; /* atan(-INF,+INF) */
        case 2:
          return 3 * pi / 4; /* atan(+INF,-INF) */
        case 3:
          return -3 * pi / 4; /* atan(-INF,-INF) */
      }
    } else {
      switch (m) {
        case 0:
          return 0.0; /* atan(+...,+INF) */
        case 1:
          return -0.0; /* atan(-...,+INF) */
        case 2:
          return pi; /* atan(+...,-INF) */
        case 3:
          return -pi; /* atan(-...,-INF) */
      }
    }
  }
  /* |y/x| > 0x1p64 */
  if (ix + (64 << 20) < iy || iy == 0x7ff00000)
    return m & 1 ? -pi / 2 : pi / 2;

  /* z = atan(|y/x|) without spurious underflow */
  if ((m & 2) && iy + (64 << 20) < ix) /* |y/x| < 0x1p-64, x<0 */
    z = 0;
  else
    z = atan(fabs(y / x));
  switch (m) {
    case 0:
      return z; /* atan(+,+) */
    case 1:
      return -z; /* atan(-,+) */
    case 2:
      return pi - (z - pi_lo); /* atan(+,-) */
    default:                   /* case 3 */
      return (z - pi_lo) - pi; /* atan(-,-) */
  }
}
