/*							cbrtq.c
 *
 *	Cube root, __float128 precision
 *
 *
 *
 * SYNOPSIS:
 *
 * __float128 x, y, cbrtq();
 *
 * y = cbrtq( x );
 *
 *
 *
 * DESCRIPTION:
 *
 * Returns the cube root of the argument, which may be negative.
 *
 * Range reduction involves determining the power of 2 of
 * the argument.  A polynomial of degree 2 applied to the
 * mantissa, and multiplication by the cube root of 1, 2, or 4
 * approximates the root to within about 0.1%.  Then Newton's
 * iteration is used three times to converge to an accurate
 * result.
 *
 *
 *
 * ACCURACY:
 *
 *                      Relative error:
 * arithmetic   domain     # trials      peak         rms
 *    IEEE       -8,8       100000      1.3e-34     3.9e-35
 *    IEEE    exp(+-707)    100000      1.3e-34     4.3e-35
 *
 */

/*
Cephes Math Library Release 2.2: January, 1991
Copyright 1984, 1991 by Stephen L. Moshier
Adapted for glibc October, 2001.

    This library is free software; you can redistribute it and/or
    modify it under the terms of the GNU Lesser General Public
    License as published by the Free Software Foundation; either
    version 2.1 of the License, or (at your option) any later version.

    This library is distributed in the hope that it will be useful,
    but WITHOUT ANY WARRANTY; without even the implied warranty of
    MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the GNU
    Lesser General Public License for more details.

    You should have received a copy of the GNU Lesser General Public
    License along with this library; if not, see
    <http://www.gnu.org/licenses/>.  */


#include "quadmath-imp.h"

static const long double CBRT2 = 1.259921049894873164767210607278228350570251Q;
static const long double CBRT4 = 1.587401051968199474751705639272308260391493Q;
static const long double CBRT2I = 0.7937005259840997373758528196361541301957467Q;
static const long double CBRT4I = 0.6299605249474365823836053036391141752851257Q;


__float128
cbrtq ( __float128 x)
{
  int e, rem, sign;
  __float128 z;

  if (!finiteq (x))
    return x + x;

  if (x == 0)
    return (x);

  if (x > 0)
    sign = 1;
  else
    {
      sign = -1;
      x = -x;
    }

  z = x;
 /* extract power of 2, leaving mantissa between 0.5 and 1  */
  x = frexpq (x, &e);

  /* Approximate cube root of number between .5 and 1,
     peak relative error = 1.2e-6  */
  x = ((((1.3584464340920900529734e-1Q * x
	  - 6.3986917220457538402318e-1Q) * x
	 + 1.2875551670318751538055e0Q) * x
	- 1.4897083391357284957891e0Q) * x
       + 1.3304961236013647092521e0Q) * x + 3.7568280825958912391243e-1Q;

  /* exponent divided by 3 */
  if (e >= 0)
    {
      rem = e;
      e /= 3;
      rem -= 3 * e;
      if (rem == 1)
	x *= CBRT2;
      else if (rem == 2)
	x *= CBRT4;
    }
  else
    {				/* argument less than 1 */
      e = -e;
      rem = e;
      e /= 3;
      rem -= 3 * e;
      if (rem == 1)
	x *= CBRT2I;
      else if (rem == 2)
	x *= CBRT4I;
      e = -e;
    }

  /* multiply by power of 2 */
  x = ldexpq (x, e);

  /* Newton iteration */
  x -= (x - (z / (x * x))) * 0.3333333333333333333333333333333333333333Q;
  x -= (x - (z / (x * x))) * 0.3333333333333333333333333333333333333333Q;
  x -= (x - (z / (x * x))) * 0.3333333333333333333333333333333333333333Q;

  if (sign < 0)
    x = -x;
  return (x);
}
