/* origin: FreeBSD /usr/src/lib/msun/src/e_asin.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.
 * ====================================================
 */
/* asin(x)
 * Method :
 *      Since  asin(x) = x + x^3/6 + x^5*3/40 + x^7*15/336 + ...
 *      we approximate asin(x) on [0,0.5] by
 *              asin(x) = x + x*x^2*R(x^2)
 *      where
 *              R(x^2) is a rational approximation of (asin(x)-x)/x^3
 *      and its remez error is bounded by
 *              |(asin(x)-x)/x^3 - R(x^2)| < 2^(-58.75)
 *
 *      For x in [0.5,1]
 *              asin(x) = pi/2-2*asin(sqrt((1-x)/2))
 *      Let y = (1-x), z = y/2, s := sqrt(z), and pio2_hi+pio2_lo=pi/2;
 *      then for x>0.98
 *              asin(x) = pi/2 - 2*(s+s*z*R(z))
 *                      = pio2_hi - (2*(s+s*z*R(z)) - pio2_lo)
 *      For x<=0.98, let pio4_hi = pio2_hi/2, then
 *              f = hi part of s;
 *              c = sqrt(z) - f = (z-f*f)/(s+f)         ...f+c=sqrt(z)
 *      and
 *              asin(x) = pi/2 - 2*(s+s*z*R(z))
 *                      = pio4_hi+(pio4-2s)-(2s*z*R(z)-pio2_lo)
 *                      = pio4_hi+(pio4-2f)-(2s*z*R(z)-(pio2_lo+2c))
 *
 * Special cases:
 *      if x is NaN, return x itself;
 *      if |x|>1, return NaN with invalid signal.
 *
 */

#include "libm.h"

static const double pio2_hi =
                        1.57079632679489655800e+00, /* 0x3FF921FB, 0x54442D18 */
    pio2_lo = 6.12323399573676603587e-17,           /* 0x3C91A626, 0x33145C07 */
    /* coefficients for R(x^2) */
    pS0 = 1.66666666666666657415e-01,  /* 0x3FC55555, 0x55555555 */
    pS1 = -3.25565818622400915405e-01, /* 0xBFD4D612, 0x03EB6F7D */
    pS2 = 2.01212532134862925881e-01,  /* 0x3FC9C155, 0x0E884455 */
    pS3 = -4.00555345006794114027e-02, /* 0xBFA48228, 0xB5688F3B */
    pS4 = 7.91534994289814532176e-04,  /* 0x3F49EFE0, 0x7501B288 */
    pS5 = 3.47933107596021167570e-05,  /* 0x3F023DE1, 0x0DFDF709 */
    qS1 = -2.40339491173441421878e+00, /* 0xC0033A27, 0x1C8A2D4B */
    qS2 = 2.02094576023350569471e+00,  /* 0x40002AE5, 0x9C598AC8 */
    qS3 = -6.88283971605453293030e-01, /* 0xBFE6066C, 0x1B8D0159 */
    qS4 = 7.70381505559019352791e-02;  /* 0x3FB3B8C5, 0xB12E9282 */

static double R(double z) {
  double_t p, q;
  p = z * (pS0 + z * (pS1 + z * (pS2 + z * (pS3 + z * (pS4 + z * pS5)))));
  q = 1.0 + z * (qS1 + z * (qS2 + z * (qS3 + z * qS4)));
  return p / q;
}

double asin(double x) {
  double z, r, s;
  uint32_t hx, ix;

  GET_HIGH_WORD(hx, x);
  ix = hx & 0x7fffffff;
  /* |x| >= 1 or nan */
  if (ix >= 0x3ff00000) {
    uint32_t lx;
    GET_LOW_WORD(lx, x);
    if ((ix - 0x3ff00000 | lx) == 0)
      /* asin(1) = +-pi/2 with inexact */
      return x * pio2_hi + 0x1p-120f;
    return 0 / (x - x);
  }
  /* |x| < 0.5 */
  if (ix < 0x3fe00000) {
    /* if 0x1p-1022 <= |x| < 0x1p-26, avoid raising underflow */
    if (ix < 0x3e500000 && ix >= 0x00100000)
      return x;
    return x + x * R(x * x);
  }
  /* 1 > |x| >= 0.5 */
  z = (1 - fabs(x)) * 0.5;
  s = sqrt(z);
  r = R(z);
  if (ix >= 0x3fef3333) { /* if |x| > 0.975 */
    x = pio2_hi - (2 * (s + s * r) - pio2_lo);
  } else {
    double f, c;
    /* f+c = sqrt(z) */
    f = s;
    SET_LOW_WORD(f, 0);
    c = (z - f * f) / (s + f);
    x = 0.5 * pio2_hi -
        (2 * s * r - (pio2_lo - 2 * c) - (0.5 * pio2_hi - 2 * f));
  }
  if (hx >> 31)
    return -x;
  return x;
}
