/*                                                      log2q.c
 *      Base 2 logarithm for __float128 precision
 *
 *
 *
 * SYNOPSIS:
 *
 * __float128 x, y, log2q();
 *
 * y = log2q( x );
 *
 *
 *
 * DESCRIPTION:
 *
 * Returns the base 2 logarithm of x.
 *
 * The argument is separated into its exponent and fractional
 * parts.  If the exponent is between -1 and +1, the (natural)
 * logarithm of the fraction is approximated by
 *
 *     log(1+x) = x - 0.5 x^2 + x^3 P(x)/Q(x).
 *
 * Otherwise, setting  z = 2(x-1)/x+1),
 *
 *     log(x) = z + z^3 P(z)/Q(z).
 *
 *
 *
 * ACCURACY:
 *
 *                      Relative error:
 * arithmetic   domain     # trials      peak         rms
 *    IEEE      0.5, 2.0     100,000    2.6e-34     4.9e-35
 *    IEEE     exp(+-10000)  100,000    9.6e-35     4.0e-35
 *
 * In the tests over the interval exp(+-10000), the logarithms
 * of the random arguments were uniformly distributed over
 * [-10000, +10000].
 *
 */

/*
   Cephes Math Library Release 2.2:  January, 1991
   Copyright 1984, 1991 by Stephen L. Moshier
   Adapted for glibc November, 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, write to the Free Software
    Foundation, Inc., 59 Temple Place, Suite 330, Boston, MA 02111-1307  USA 
 */

#include "quadmath-imp.h"

/* Coefficients for ln(1+x) = x - x**2/2 + x**3 P(x)/Q(x)
 * 1/sqrt(2) <= x < sqrt(2)
 * Theoretical peak relative error = 5.3e-37,
 * relative peak error spread = 2.3e-14
 */
static const __float128 P[13] =
{
  1.313572404063446165910279910527789794488E4Q,
  7.771154681358524243729929227226708890930E4Q,
  2.014652742082537582487669938141683759923E5Q,
  3.007007295140399532324943111654767187848E5Q,
  2.854829159639697837788887080758954924001E5Q,
  1.797628303815655343403735250238293741397E5Q,
  7.594356839258970405033155585486712125861E4Q,
  2.128857716871515081352991964243375186031E4Q,
  3.824952356185897735160588078446136783779E3Q,
  4.114517881637811823002128927449878962058E2Q,
  2.321125933898420063925789532045674660756E1Q,
  4.998469661968096229986658302195402690910E-1Q,
  1.538612243596254322971797716843006400388E-6Q
};
static const __float128 Q[12] =
{
  3.940717212190338497730839731583397586124E4Q,
  2.626900195321832660448791748036714883242E5Q,
  7.777690340007566932935753241556479363645E5Q,
  1.347518538384329112529391120390701166528E6Q,
  1.514882452993549494932585972882995548426E6Q,
  1.158019977462989115839826904108208787040E6Q,
  6.132189329546557743179177159925690841200E5Q,
  2.248234257620569139969141618556349415120E5Q,
  5.605842085972455027590989944010492125825E4Q,
  9.147150349299596453976674231612674085381E3Q,
  9.104928120962988414618126155557301584078E2Q,
  4.839208193348159620282142911143429644326E1Q
/* 1.000000000000000000000000000000000000000E0Q, */
};

/* Coefficients for log(x) = z + z^3 P(z^2)/Q(z^2),
 * where z = 2(x-1)/(x+1)
 * 1/sqrt(2) <= x < sqrt(2)
 * Theoretical peak relative error = 1.1e-35,
 * relative peak error spread 1.1e-9
 */
static const __float128 R[6] =
{
  1.418134209872192732479751274970992665513E5Q,
 -8.977257995689735303686582344659576526998E4Q,
  2.048819892795278657810231591630928516206E4Q,
 -2.024301798136027039250415126250455056397E3Q,
  8.057002716646055371965756206836056074715E1Q,
 -8.828896441624934385266096344596648080902E-1Q
};
static const __float128 S[6] =
{
  1.701761051846631278975701529965589676574E6Q,
 -1.332535117259762928288745111081235577029E6Q,
  4.001557694070773974936904547424676279307E5Q,
 -5.748542087379434595104154610899551484314E4Q,
  3.998526750980007367835804959888064681098E3Q,
 -1.186359407982897997337150403816839480438E2Q
/* 1.000000000000000000000000000000000000000E0Q, */
};

static const __float128
/* log2(e) - 1 */
LOG2EA = 4.4269504088896340735992468100189213742664595E-1Q,
/* sqrt(2)/2 */
SQRTH = 7.071067811865475244008443621048490392848359E-1Q;


/* Evaluate P[n] x^n  +  P[n-1] x^(n-1)  +  ...  +  P[0] */

static __float128
neval (__float128 x, const __float128 *p, int n)
{
  __float128 y;

  p += n;
  y = *p--;
  do
    {
      y = y * x + *p--;
    }
  while (--n > 0);
  return y;
}


/* Evaluate x^n+1  +  P[n] x^(n)  +  P[n-1] x^(n-1)  +  ...  +  P[0] */

static __float128
deval (__float128 x, const __float128 *p, int n)
{
  __float128 y;

  p += n;
  y = x + *p--;
  do
    {
      y = y * x + *p--;
    }
  while (--n > 0);
  return y;
}



__float128
log2q (__float128 x)
{
  __float128 z;
  __float128 y;
  int e;
  int64_t hx, lx;

/* Test for domain */
  GET_FLT128_WORDS64 (hx, lx, x);
  if (((hx & 0x7fffffffffffffffLL) | lx) == 0)
    return (-1.0Q / (x - x));
  if (hx < 0)
    return (x - x) / (x - x);
  if (hx >= 0x7fff000000000000LL)
    return (x + x);

/* separate mantissa from exponent */

/* Note, frexp is used so that denormal numbers
 * will be handled properly.
 */
  x = frexpq (x, &e);


/* logarithm using log(x) = z + z**3 P(z)/Q(z),
 * where z = 2(x-1)/x+1)
 */
  if ((e > 2) || (e < -2))
    {
      if (x < SQRTH)
	{			/* 2( 2x-1 )/( 2x+1 ) */
	  e -= 1;
	  z = x - 0.5Q;
	  y = 0.5Q * z + 0.5Q;
	}
      else
	{			/*  2 (x-1)/(x+1)   */
	  z = x - 0.5Q;
	  z -= 0.5Q;
	  y = 0.5Q * x + 0.5Q;
	}
      x = z / y;
      z = x * x;
      y = x * (z * neval (z, R, 5) / deval (z, S, 5));
      goto done;
    }


/* logarithm using log(1+x) = x - .5x**2 + x**3 P(x)/Q(x) */

  if (x < SQRTH)
    {
      e -= 1;
      x = 2.0 * x - 1.0Q;	/*  2x - 1  */
    }
  else
    {
      x = x - 1.0Q;
    }
  z = x * x;
  y = x * (z * neval (x, P, 12) / deval (x, Q, 11));
  y = y - 0.5 * z;

done:

/* Multiply log of fraction by log2(e)
 * and base 2 exponent by 1
 */
  z = y * LOG2EA;
  z += x * LOG2EA;
  z += y;
  z += x;
  z += e;
  return (z);
}
