Blame sysdeps/ieee754/ldbl-96/e_j0l.c

Packit 6c4009
/*
Packit 6c4009
 * ====================================================
Packit 6c4009
 * Copyright (C) 1993 by Sun Microsystems, Inc. All rights reserved.
Packit 6c4009
 *
Packit 6c4009
 * Developed at SunPro, a Sun Microsystems, Inc. business.
Packit 6c4009
 * Permission to use, copy, modify, and distribute this
Packit 6c4009
 * software is freely granted, provided that this notice
Packit 6c4009
 * is preserved.
Packit 6c4009
 * ====================================================
Packit 6c4009
 */
Packit 6c4009
Packit 6c4009
/* Long double expansions are
Packit 6c4009
  Copyright (C) 2001 Stephen L. Moshier <moshier@na-net.ornl.gov>
Packit 6c4009
  and are incorporated herein by permission of the author.  The author
Packit 6c4009
  reserves the right to distribute this material elsewhere under different
Packit 6c4009
  copying permissions.  These modifications are distributed here under
Packit 6c4009
  the following terms:
Packit 6c4009
Packit 6c4009
    This library is free software; you can redistribute it and/or
Packit 6c4009
    modify it under the terms of the GNU Lesser General Public
Packit 6c4009
    License as published by the Free Software Foundation; either
Packit 6c4009
    version 2.1 of the License, or (at your option) any later version.
Packit 6c4009
Packit 6c4009
    This library is distributed in the hope that it will be useful,
Packit 6c4009
    but WITHOUT ANY WARRANTY; without even the implied warranty of
Packit 6c4009
    MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the GNU
Packit 6c4009
    Lesser General Public License for more details.
Packit 6c4009
Packit 6c4009
    You should have received a copy of the GNU Lesser General Public
Packit 6c4009
    License along with this library; if not, see
Packit 6c4009
    <http://www.gnu.org/licenses/>.  */
Packit 6c4009
Packit 6c4009
/* __ieee754_j0(x), __ieee754_y0(x)
Packit 6c4009
 * Bessel function of the first and second kinds of order zero.
Packit 6c4009
 * Method -- j0(x):
Packit 6c4009
 *	1. For tiny x, we use j0(x) = 1 - x^2/4 + x^4/64 - ...
Packit 6c4009
 *	2. Reduce x to |x| since j0(x)=j0(-x),  and
Packit 6c4009
 *	   for x in (0,2)
Packit 6c4009
 *		j0(x) = 1 - z/4 + z^2*R0/S0,  where z = x*x;
Packit 6c4009
 *	   for x in (2,inf)
Packit 6c4009
 *		j0(x) = sqrt(2/(pi*x))*(p0(x)*cos(x0)-q0(x)*sin(x0))
Packit 6c4009
 *	   where x0 = x-pi/4. It is better to compute sin(x0),cos(x0)
Packit 6c4009
 *	   as follow:
Packit 6c4009
 *		cos(x0) = cos(x)cos(pi/4)+sin(x)sin(pi/4)
Packit 6c4009
 *			= 1/sqrt(2) * (cos(x) + sin(x))
Packit 6c4009
 *		sin(x0) = sin(x)cos(pi/4)-cos(x)sin(pi/4)
Packit 6c4009
 *			= 1/sqrt(2) * (sin(x) - cos(x))
Packit 6c4009
 *	   (To avoid cancellation, use
Packit 6c4009
 *		sin(x) +- cos(x) = -cos(2x)/(sin(x) -+ cos(x))
Packit 6c4009
 *	    to compute the worse one.)
Packit 6c4009
 *
Packit 6c4009
 *	3 Special cases
Packit 6c4009
 *		j0(nan)= nan
Packit 6c4009
 *		j0(0) = 1
Packit 6c4009
 *		j0(inf) = 0
Packit 6c4009
 *
Packit 6c4009
 * Method -- y0(x):
Packit 6c4009
 *	1. For x<2.
Packit 6c4009
 *	   Since
Packit 6c4009
 *		y0(x) = 2/pi*(j0(x)*(ln(x/2)+Euler) + x^2/4 - ...)
Packit 6c4009
 *	   therefore y0(x)-2/pi*j0(x)*ln(x) is an even function.
Packit 6c4009
 *	   We use the following function to approximate y0,
Packit 6c4009
 *		y0(x) = U(z)/V(z) + (2/pi)*(j0(x)*ln(x)), z= x^2
Packit 6c4009
 *
Packit 6c4009
 *	   Note: For tiny x, U/V = u0 and j0(x)~1, hence
Packit 6c4009
 *		y0(tiny) = u0 + (2/pi)*ln(tiny), (choose tiny<2**-27)
Packit 6c4009
 *	2. For x>=2.
Packit 6c4009
 *		y0(x) = sqrt(2/(pi*x))*(p0(x)*cos(x0)+q0(x)*sin(x0))
Packit 6c4009
 *	   where x0 = x-pi/4. It is better to compute sin(x0),cos(x0)
Packit 6c4009
 *	   by the method mentioned above.
Packit 6c4009
 *	3. Special cases: y0(0)=-inf, y0(x<0)=NaN, y0(inf)=0.
Packit 6c4009
 */
Packit 6c4009
Packit 6c4009
#include <math.h>
Packit 6c4009
#include <math-barriers.h>
Packit 6c4009
#include <math_private.h>
Packit 6c4009
Packit 6c4009
static long double pzero (long double), qzero (long double);
Packit 6c4009
Packit 6c4009
static const long double
Packit 6c4009
  huge = 1e4930L,
Packit 6c4009
  one = 1.0L,
Packit 6c4009
  invsqrtpi = 5.6418958354775628694807945156077258584405e-1L,
Packit 6c4009
  tpi = 6.3661977236758134307553505349005744813784e-1L,
Packit 6c4009
Packit 6c4009
  /* J0(x) = 1 - x^2 / 4 + x^4 R0(x^2) / S0(x^2)
Packit 6c4009
     0 <= x <= 2
Packit 6c4009
     peak relative error 1.41e-22 */
Packit 6c4009
  R[5] = {
Packit 6c4009
  4.287176872744686992880841716723478740566E7L,
Packit 6c4009
  -6.652058897474241627570911531740907185772E5L,
Packit 6c4009
  7.011848381719789863458364584613651091175E3L,
Packit 6c4009
  -3.168040850193372408702135490809516253693E1L,
Packit 6c4009
  6.030778552661102450545394348845599300939E-2L,
Packit 6c4009
},
Packit 6c4009
Packit 6c4009
 S[4] = {
Packit 6c4009
   2.743793198556599677955266341699130654342E9L,
Packit 6c4009
   3.364330079384816249840086842058954076201E7L,
Packit 6c4009
   1.924119649412510777584684927494642526573E5L,
Packit 6c4009
   6.239282256012734914211715620088714856494E2L,
Packit 6c4009
   /*   1.000000000000000000000000000000000000000E0L,*/
Packit 6c4009
};
Packit 6c4009
Packit 6c4009
static const long double zero = 0.0;
Packit 6c4009
Packit 6c4009
long double
Packit 6c4009
__ieee754_j0l (long double x)
Packit 6c4009
{
Packit 6c4009
  long double z, s, c, ss, cc, r, u, v;
Packit 6c4009
  int32_t ix;
Packit 6c4009
  uint32_t se;
Packit 6c4009
Packit 6c4009
  GET_LDOUBLE_EXP (se, x);
Packit 6c4009
  ix = se & 0x7fff;
Packit 6c4009
  if (__glibc_unlikely (ix >= 0x7fff))
Packit 6c4009
    return one / (x * x);
Packit 6c4009
  x = fabsl (x);
Packit 6c4009
  if (ix >= 0x4000)		/* |x| >= 2.0 */
Packit 6c4009
    {
Packit 6c4009
      __sincosl (x, &s, &c);
Packit 6c4009
      ss = s - c;
Packit 6c4009
      cc = s + c;
Packit 6c4009
      if (ix < 0x7ffe)
Packit 6c4009
	{			/* make sure x+x not overflow */
Packit 6c4009
	  z = -__cosl (x + x);
Packit 6c4009
	  if ((s * c) < zero)
Packit 6c4009
	    cc = z / ss;
Packit 6c4009
	  else
Packit 6c4009
	    ss = z / cc;
Packit 6c4009
	}
Packit 6c4009
      /*
Packit 6c4009
       * j0(x) = 1/sqrt(pi) * (P(0,x)*cc - Q(0,x)*ss) / sqrt(x)
Packit 6c4009
       * y0(x) = 1/sqrt(pi) * (P(0,x)*ss + Q(0,x)*cc) / sqrt(x)
Packit 6c4009
       */
Packit 6c4009
      if (__glibc_unlikely (ix > 0x4080))      	/* 2^129 */
Packit 6c4009
	z = (invsqrtpi * cc) / sqrtl (x);
Packit 6c4009
      else
Packit 6c4009
	{
Packit 6c4009
	  u = pzero (x);
Packit 6c4009
	  v = qzero (x);
Packit 6c4009
	  z = invsqrtpi * (u * cc - v * ss) / sqrtl (x);
Packit 6c4009
	}
Packit 6c4009
      return z;
Packit 6c4009
    }
Packit 6c4009
  if (__glibc_unlikely (ix < 0x3fef))       /* |x| < 2**-16 */
Packit 6c4009
    {
Packit 6c4009
      /* raise inexact if x != 0 */
Packit 6c4009
      math_force_eval (huge + x);
Packit 6c4009
      if (ix < 0x3fde) /* |x| < 2^-33 */
Packit 6c4009
	return one;
Packit 6c4009
      else
Packit 6c4009
	return one - 0.25 * x * x;
Packit 6c4009
    }
Packit 6c4009
  z = x * x;
Packit 6c4009
  r = z * (R[0] + z * (R[1] + z * (R[2] + z * (R[3] + z * R[4]))));
Packit 6c4009
  s = S[0] + z * (S[1] + z * (S[2] + z * (S[3] + z)));
Packit 6c4009
  if (ix < 0x3fff)
Packit 6c4009
    {				/* |x| < 1.00 */
Packit 6c4009
      return (one - 0.25 * z + z * (r / s));
Packit 6c4009
    }
Packit 6c4009
  else
Packit 6c4009
    {
Packit 6c4009
      u = 0.5 * x;
Packit 6c4009
      return ((one + u) * (one - u) + z * (r / s));
Packit 6c4009
    }
Packit 6c4009
}
Packit 6c4009
strong_alias (__ieee754_j0l, __j0l_finite)
Packit 6c4009
Packit 6c4009
Packit 6c4009
/* y0(x) = 2/pi ln(x) J0(x) + U(x^2)/V(x^2)
Packit 6c4009
   0 < x <= 2
Packit 6c4009
   peak relative error 1.7e-21 */
Packit 6c4009
static const long double
Packit 6c4009
U[6] = {
Packit 6c4009
  -1.054912306975785573710813351985351350861E10L,
Packit 6c4009
  2.520192609749295139432773849576523636127E10L,
Packit 6c4009
  -1.856426071075602001239955451329519093395E9L,
Packit 6c4009
  4.079209129698891442683267466276785956784E7L,
Packit 6c4009
  -3.440684087134286610316661166492641011539E5L,
Packit 6c4009
  1.005524356159130626192144663414848383774E3L,
Packit 6c4009
};
Packit 6c4009
static const long double
Packit 6c4009
V[5] = {
Packit 6c4009
  1.429337283720789610137291929228082613676E11L,
Packit 6c4009
  2.492593075325119157558811370165695013002E9L,
Packit 6c4009
  2.186077620785925464237324417623665138376E7L,
Packit 6c4009
  1.238407896366385175196515057064384929222E5L,
Packit 6c4009
  4.693924035211032457494368947123233101664E2L,
Packit 6c4009
  /*  1.000000000000000000000000000000000000000E0L */
Packit 6c4009
};
Packit 6c4009
Packit 6c4009
long double
Packit 6c4009
__ieee754_y0l (long double x)
Packit 6c4009
{
Packit 6c4009
  long double z, s, c, ss, cc, u, v;
Packit 6c4009
  int32_t ix;
Packit 6c4009
  uint32_t se, i0, i1;
Packit 6c4009
Packit 6c4009
  GET_LDOUBLE_WORDS (se, i0, i1, x);
Packit 6c4009
  ix = se & 0x7fff;
Packit 6c4009
  /* Y0(NaN) is NaN, y0(-inf) is Nan, y0(inf) is 0  */
Packit 6c4009
  if (__glibc_unlikely (se & 0x8000))
Packit 6c4009
    return zero / (zero * x);
Packit 6c4009
  if (__glibc_unlikely (ix >= 0x7fff))
Packit 6c4009
    return one / (x + x * x);
Packit 6c4009
  if (__glibc_unlikely ((i0 | i1) == 0))
Packit 6c4009
    return -HUGE_VALL + x;  /* -inf and overflow exception.  */
Packit 6c4009
  if (ix >= 0x4000)
Packit 6c4009
    {				/* |x| >= 2.0 */
Packit 6c4009
Packit 6c4009
      /* y0(x) = sqrt(2/(pi*x))*(p0(x)*sin(x0)+q0(x)*cos(x0))
Packit 6c4009
       * where x0 = x-pi/4
Packit 6c4009
       *      Better formula:
Packit 6c4009
       *              cos(x0) = cos(x)cos(pi/4)+sin(x)sin(pi/4)
Packit 6c4009
       *                      =  1/sqrt(2) * (sin(x) + cos(x))
Packit 6c4009
       *              sin(x0) = sin(x)cos(3pi/4)-cos(x)sin(3pi/4)
Packit 6c4009
       *                      =  1/sqrt(2) * (sin(x) - cos(x))
Packit 6c4009
       * To avoid cancellation, use
Packit 6c4009
       *              sin(x) +- cos(x) = -cos(2x)/(sin(x) -+ cos(x))
Packit 6c4009
       * to compute the worse one.
Packit 6c4009
       */
Packit 6c4009
      __sincosl (x, &s, &c);
Packit 6c4009
      ss = s - c;
Packit 6c4009
      cc = s + c;
Packit 6c4009
      /*
Packit 6c4009
       * j0(x) = 1/sqrt(pi) * (P(0,x)*cc - Q(0,x)*ss) / sqrt(x)
Packit 6c4009
       * y0(x) = 1/sqrt(pi) * (P(0,x)*ss + Q(0,x)*cc) / sqrt(x)
Packit 6c4009
       */
Packit 6c4009
      if (ix < 0x7ffe)
Packit 6c4009
	{			/* make sure x+x not overflow */
Packit 6c4009
	  z = -__cosl (x + x);
Packit 6c4009
	  if ((s * c) < zero)
Packit 6c4009
	    cc = z / ss;
Packit 6c4009
	  else
Packit 6c4009
	    ss = z / cc;
Packit 6c4009
	}
Packit 6c4009
      if (__glibc_unlikely (ix > 0x4080))      	/* 1e39 */
Packit 6c4009
	z = (invsqrtpi * ss) / sqrtl (x);
Packit 6c4009
      else
Packit 6c4009
	{
Packit 6c4009
	  u = pzero (x);
Packit 6c4009
	  v = qzero (x);
Packit 6c4009
	  z = invsqrtpi * (u * ss + v * cc) / sqrtl (x);
Packit 6c4009
	}
Packit 6c4009
      return z;
Packit 6c4009
    }
Packit 6c4009
  if (__glibc_unlikely (ix <= 0x3fde))       /* x < 2^-33 */
Packit 6c4009
    {
Packit 6c4009
      z = -7.380429510868722527629822444004602747322E-2L
Packit 6c4009
	+ tpi * __ieee754_logl (x);
Packit 6c4009
      return z;
Packit 6c4009
    }
Packit 6c4009
  z = x * x;
Packit 6c4009
  u = U[0] + z * (U[1] + z * (U[2] + z * (U[3] + z * (U[4] + z * U[5]))));
Packit 6c4009
  v = V[0] + z * (V[1] + z * (V[2] + z * (V[3] + z * (V[4] + z))));
Packit 6c4009
  return (u / v + tpi * (__ieee754_j0l (x) * __ieee754_logl (x)));
Packit 6c4009
}
Packit 6c4009
strong_alias (__ieee754_y0l, __y0l_finite)
Packit 6c4009
Packit 6c4009
/* The asymptotic expansions of pzero is
Packit 6c4009
 *	1 - 9/128 s^2 + 11025/98304 s^4 - ...,	where s = 1/x.
Packit 6c4009
 * For x >= 2, We approximate pzero by
Packit 6c4009
 *	pzero(x) = 1 + s^2 R(s^2) / S(s^2)
Packit 6c4009
 */
Packit 6c4009
static const long double pR8[7] = {
Packit 6c4009
  /* 8 <= x <= inf
Packit 6c4009
     Peak relative error 4.62 */
Packit 6c4009
  -4.094398895124198016684337960227780260127E-9L,
Packit 6c4009
  -8.929643669432412640061946338524096893089E-7L,
Packit 6c4009
  -6.281267456906136703868258380673108109256E-5L,
Packit 6c4009
  -1.736902783620362966354814353559382399665E-3L,
Packit 6c4009
  -1.831506216290984960532230842266070146847E-2L,
Packit 6c4009
  -5.827178869301452892963280214772398135283E-2L,
Packit 6c4009
  -2.087563267939546435460286895807046616992E-2L,
Packit 6c4009
};
Packit 6c4009
static const long double pS8[6] = {
Packit 6c4009
  5.823145095287749230197031108839653988393E-8L,
Packit 6c4009
  1.279281986035060320477759999428992730280E-5L,
Packit 6c4009
  9.132668954726626677174825517150228961304E-4L,
Packit 6c4009
  2.606019379433060585351880541545146252534E-2L,
Packit 6c4009
  2.956262215119520464228467583516287175244E-1L,
Packit 6c4009
  1.149498145388256448535563278632697465675E0L,
Packit 6c4009
  /* 1.000000000000000000000000000000000000000E0L, */
Packit 6c4009
};
Packit 6c4009
Packit 6c4009
static const long double pR5[7] = {
Packit 6c4009
  /* 4.54541015625 <= x <= 8
Packit 6c4009
     Peak relative error 6.51E-22 */
Packit 6c4009
  -2.041226787870240954326915847282179737987E-7L,
Packit 6c4009
  -2.255373879859413325570636768224534428156E-5L,
Packit 6c4009
  -7.957485746440825353553537274569102059990E-4L,
Packit 6c4009
  -1.093205102486816696940149222095559439425E-2L,
Packit 6c4009
  -5.657957849316537477657603125260701114646E-2L,
Packit 6c4009
  -8.641175552716402616180994954177818461588E-2L,
Packit 6c4009
  -1.354654710097134007437166939230619726157E-2L,
Packit 6c4009
};
Packit 6c4009
static const long double pS5[6] = {
Packit 6c4009
  2.903078099681108697057258628212823545290E-6L,
Packit 6c4009
  3.253948449946735405975737677123673867321E-4L,
Packit 6c4009
  1.181269751723085006534147920481582279979E-2L,
Packit 6c4009
  1.719212057790143888884745200257619469363E-1L,
Packit 6c4009
  1.006306498779212467670654535430694221924E0L,
Packit 6c4009
  2.069568808688074324555596301126375951502E0L,
Packit 6c4009
  /* 1.000000000000000000000000000000000000000E0L, */
Packit 6c4009
};
Packit 6c4009
Packit 6c4009
static const long double pR3[7] = {
Packit 6c4009
  /* 2.85711669921875 <= x <= 4.54541015625
Packit 6c4009
     peak relative error 5.25e-21 */
Packit 6c4009
  -5.755732156848468345557663552240816066802E-6L,
Packit 6c4009
  -3.703675625855715998827966962258113034767E-4L,
Packit 6c4009
  -7.390893350679637611641350096842846433236E-3L,
Packit 6c4009
  -5.571922144490038765024591058478043873253E-2L,
Packit 6c4009
  -1.531290690378157869291151002472627396088E-1L,
Packit 6c4009
  -1.193350853469302941921647487062620011042E-1L,
Packit 6c4009
  -8.567802507331578894302991505331963782905E-3L,
Packit 6c4009
};
Packit 6c4009
static const long double pS3[6] = {
Packit 6c4009
  8.185931139070086158103309281525036712419E-5L,
Packit 6c4009
  5.398016943778891093520574483111255476787E-3L,
Packit 6c4009
  1.130589193590489566669164765853409621081E-1L,
Packit 6c4009
  9.358652328786413274673192987670237145071E-1L,
Packit 6c4009
  3.091711512598349056276917907005098085273E0L,
Packit 6c4009
  3.594602474737921977972586821673124231111E0L,
Packit 6c4009
  /* 1.000000000000000000000000000000000000000E0L, */
Packit 6c4009
};
Packit 6c4009
Packit 6c4009
static const long double pR2[7] = {
Packit 6c4009
  /* 2 <= x <= 2.85711669921875
Packit 6c4009
     peak relative error 2.64e-21 */
Packit 6c4009
  -1.219525235804532014243621104365384992623E-4L,
Packit 6c4009
  -4.838597135805578919601088680065298763049E-3L,
Packit 6c4009
  -5.732223181683569266223306197751407418301E-2L,
Packit 6c4009
  -2.472947430526425064982909699406646503758E-1L,
Packit 6c4009
  -3.753373645974077960207588073975976327695E-1L,
Packit 6c4009
  -1.556241316844728872406672349347137975495E-1L,
Packit 6c4009
  -5.355423239526452209595316733635519506958E-3L,
Packit 6c4009
};
Packit 6c4009
static const long double pS2[6] = {
Packit 6c4009
  1.734442793664291412489066256138894953823E-3L,
Packit 6c4009
  7.158111826468626405416300895617986926008E-2L,
Packit 6c4009
  9.153839713992138340197264669867993552641E-1L,
Packit 6c4009
  4.539209519433011393525841956702487797582E0L,
Packit 6c4009
  8.868932430625331650266067101752626253644E0L,
Packit 6c4009
  6.067161890196324146320763844772857713502E0L,
Packit 6c4009
  /* 1.000000000000000000000000000000000000000E0L, */
Packit 6c4009
};
Packit 6c4009
Packit 6c4009
static long double
Packit 6c4009
pzero (long double x)
Packit 6c4009
{
Packit 6c4009
  const long double *p, *q;
Packit 6c4009
  long double z, r, s;
Packit 6c4009
  int32_t ix;
Packit 6c4009
  uint32_t se, i0, i1;
Packit 6c4009
Packit 6c4009
  GET_LDOUBLE_WORDS (se, i0, i1, x);
Packit 6c4009
  ix = se & 0x7fff;
Packit 6c4009
  /* ix >= 0x4000 for all calls to this function.  */
Packit 6c4009
  if (ix >= 0x4002)
Packit 6c4009
    {
Packit 6c4009
      p = pR8;
Packit 6c4009
      q = pS8;
Packit 6c4009
    }				/* x >= 8 */
Packit 6c4009
  else
Packit 6c4009
    {
Packit 6c4009
      i1 = (ix << 16) | (i0 >> 16);
Packit 6c4009
      if (i1 >= 0x40019174)	/* x >= 4.54541015625 */
Packit 6c4009
	{
Packit 6c4009
	  p = pR5;
Packit 6c4009
	  q = pS5;
Packit 6c4009
	}
Packit 6c4009
      else if (i1 >= 0x4000b6db)	/* x >= 2.85711669921875 */
Packit 6c4009
	{
Packit 6c4009
	  p = pR3;
Packit 6c4009
	  q = pS3;
Packit 6c4009
	}
Packit 6c4009
      else	/* x >= 2 */
Packit 6c4009
	{
Packit 6c4009
	  p = pR2;
Packit 6c4009
	  q = pS2;
Packit 6c4009
	}
Packit 6c4009
    }
Packit 6c4009
  z = one / (x * x);
Packit 6c4009
  r =
Packit 6c4009
    p[0] + z * (p[1] +
Packit 6c4009
		z * (p[2] + z * (p[3] + z * (p[4] + z * (p[5] + z * p[6])))));
Packit 6c4009
  s =
Packit 6c4009
    q[0] + z * (q[1] + z * (q[2] + z * (q[3] + z * (q[4] + z * (q[5] + z)))));
Packit 6c4009
  return (one + z * r / s);
Packit 6c4009
}
Packit 6c4009
Packit 6c4009
Packit 6c4009
/* For x >= 8, the asymptotic expansions of qzero is
Packit 6c4009
 *	-1/8 s + 75/1024 s^3 - ..., where s = 1/x.
Packit 6c4009
 * We approximate qzero by
Packit 6c4009
 *	qzero(x) = s*(-.125 + R(s^2) / S(s^2))
Packit 6c4009
 */
Packit 6c4009
static const long double qR8[7] = {
Packit 6c4009
  /* 8 <= x <= inf
Packit 6c4009
     peak relative error 2.23e-21 */
Packit 6c4009
  3.001267180483191397885272640777189348008E-10L,
Packit 6c4009
  8.693186311430836495238494289942413810121E-8L,
Packit 6c4009
  8.496875536711266039522937037850596580686E-6L,
Packit 6c4009
  3.482702869915288984296602449543513958409E-4L,
Packit 6c4009
  6.036378380706107692863811938221290851352E-3L,
Packit 6c4009
  3.881970028476167836382607922840452192636E-2L,
Packit 6c4009
  6.132191514516237371140841765561219149638E-2L,
Packit 6c4009
};
Packit 6c4009
static const long double qS8[7] = {
Packit 6c4009
  4.097730123753051126914971174076227600212E-9L,
Packit 6c4009
  1.199615869122646109596153392152131139306E-6L,
Packit 6c4009
  1.196337580514532207793107149088168946451E-4L,
Packit 6c4009
  5.099074440112045094341500497767181211104E-3L,
Packit 6c4009
  9.577420799632372483249761659674764460583E-2L,
Packit 6c4009
  7.385243015344292267061953461563695918646E-1L,
Packit 6c4009
  1.917266424391428937962682301561699055943E0L,
Packit 6c4009
  /* 1.000000000000000000000000000000000000000E0L, */
Packit 6c4009
};
Packit 6c4009
Packit 6c4009
static const long double qR5[7] = {
Packit 6c4009
  /* 4.54541015625 <= x <= 8
Packit 6c4009
     peak relative error 1.03e-21 */
Packit 6c4009
  3.406256556438974327309660241748106352137E-8L,
Packit 6c4009
  4.855492710552705436943630087976121021980E-6L,
Packit 6c4009
  2.301011739663737780613356017352912281980E-4L,
Packit 6c4009
  4.500470249273129953870234803596619899226E-3L,
Packit 6c4009
  3.651376459725695502726921248173637054828E-2L,
Packit 6c4009
  1.071578819056574524416060138514508609805E-1L,
Packit 6c4009
  7.458950172851611673015774675225656063757E-2L,
Packit 6c4009
};
Packit 6c4009
static const long double qS5[7] = {
Packit 6c4009
  4.650675622764245276538207123618745150785E-7L,
Packit 6c4009
  6.773573292521412265840260065635377164455E-5L,
Packit 6c4009
  3.340711249876192721980146877577806687714E-3L,
Packit 6c4009
  7.036218046856839214741678375536970613501E-2L,
Packit 6c4009
  6.569599559163872573895171876511377891143E-1L,
Packit 6c4009
  2.557525022583599204591036677199171155186E0L,
Packit 6c4009
  3.457237396120935674982927714210361269133E0L,
Packit 6c4009
  /* 1.000000000000000000000000000000000000000E0L,*/
Packit 6c4009
};
Packit 6c4009
Packit 6c4009
static const long double qR3[7] = {
Packit 6c4009
  /* 2.85711669921875 <= x <= 4.54541015625
Packit 6c4009
     peak relative error 5.24e-21 */
Packit 6c4009
  1.749459596550816915639829017724249805242E-6L,
Packit 6c4009
  1.446252487543383683621692672078376929437E-4L,
Packit 6c4009
  3.842084087362410664036704812125005761859E-3L,
Packit 6c4009
  4.066369994699462547896426554180954233581E-2L,
Packit 6c4009
  1.721093619117980251295234795188992722447E-1L,
Packit 6c4009
  2.538595333972857367655146949093055405072E-1L,
Packit 6c4009
  8.560591367256769038905328596020118877936E-2L,
Packit 6c4009
};
Packit 6c4009
static const long double qS3[7] = {
Packit 6c4009
  2.388596091707517488372313710647510488042E-5L,
Packit 6c4009
  2.048679968058758616370095132104333998147E-3L,
Packit 6c4009
  5.824663198201417760864458765259945181513E-2L,
Packit 6c4009
  6.953906394693328750931617748038994763958E-1L,
Packit 6c4009
  3.638186936390881159685868764832961092476E0L,
Packit 6c4009
  7.900169524705757837298990558459547842607E0L,
Packit 6c4009
  5.992718532451026507552820701127504582907E0L,
Packit 6c4009
  /* 1.000000000000000000000000000000000000000E0L, */
Packit 6c4009
};
Packit 6c4009
Packit 6c4009
static const long double qR2[7] = {
Packit 6c4009
  /* 2 <= x <= 2.85711669921875
Packit 6c4009
     peak relative error 1.58e-21  */
Packit 6c4009
  6.306524405520048545426928892276696949540E-5L,
Packit 6c4009
  3.209606155709930950935893996591576624054E-3L,
Packit 6c4009
  5.027828775702022732912321378866797059604E-2L,
Packit 6c4009
  3.012705561838718956481911477587757845163E-1L,
Packit 6c4009
  6.960544893905752937420734884995688523815E-1L,
Packit 6c4009
  5.431871999743531634887107835372232030655E-1L,
Packit 6c4009
  9.447736151202905471899259026430157211949E-2L,
Packit 6c4009
};
Packit 6c4009
static const long double qS2[7] = {
Packit 6c4009
  8.610579901936193494609755345106129102676E-4L,
Packit 6c4009
  4.649054352710496997203474853066665869047E-2L,
Packit 6c4009
  8.104282924459837407218042945106320388339E-1L,
Packit 6c4009
  5.807730930825886427048038146088828206852E0L,
Packit 6c4009
  1.795310145936848873627710102199881642939E1L,
Packit 6c4009
  2.281313316875375733663657188888110605044E1L,
Packit 6c4009
  1.011242067883822301487154844458322200143E1L,
Packit 6c4009
  /* 1.000000000000000000000000000000000000000E0L, */
Packit 6c4009
};
Packit 6c4009
Packit 6c4009
static long double
Packit 6c4009
qzero (long double x)
Packit 6c4009
{
Packit 6c4009
  const long double *p, *q;
Packit 6c4009
  long double s, r, z;
Packit 6c4009
  int32_t ix;
Packit 6c4009
  uint32_t se, i0, i1;
Packit 6c4009
Packit 6c4009
  GET_LDOUBLE_WORDS (se, i0, i1, x);
Packit 6c4009
  ix = se & 0x7fff;
Packit 6c4009
  /* ix >= 0x4000 for all calls to this function.  */
Packit 6c4009
  if (ix >= 0x4002)		/* x >= 8 */
Packit 6c4009
    {
Packit 6c4009
      p = qR8;
Packit 6c4009
      q = qS8;
Packit 6c4009
    }
Packit 6c4009
  else
Packit 6c4009
    {
Packit 6c4009
      i1 = (ix << 16) | (i0 >> 16);
Packit 6c4009
      if (i1 >= 0x40019174)	/* x >= 4.54541015625 */
Packit 6c4009
	{
Packit 6c4009
	  p = qR5;
Packit 6c4009
	  q = qS5;
Packit 6c4009
	}
Packit 6c4009
      else if (i1 >= 0x4000b6db)	/* x >= 2.85711669921875 */
Packit 6c4009
	{
Packit 6c4009
	  p = qR3;
Packit 6c4009
	  q = qS3;
Packit 6c4009
	}
Packit 6c4009
      else	/* x >= 2 */
Packit 6c4009
	{
Packit 6c4009
	  p = qR2;
Packit 6c4009
	  q = qS2;
Packit 6c4009
	}
Packit 6c4009
    }
Packit 6c4009
  z = one / (x * x);
Packit 6c4009
  r =
Packit 6c4009
    p[0] + z * (p[1] +
Packit 6c4009
		z * (p[2] + z * (p[3] + z * (p[4] + z * (p[5] + z * p[6])))));
Packit 6c4009
  s =
Packit 6c4009
    q[0] + z * (q[1] +
Packit 6c4009
		z * (q[2] +
Packit 6c4009
		     z * (q[3] + z * (q[4] + z * (q[5] + z * (q[6] + z))))));
Packit 6c4009
  return (-.125 + z * r / s) / x;
Packit 6c4009
}