From dc30f461575342ffeb6c0f2d5931493c1c3a91c0 Mon Sep 17 00:00:00 2001 From: Ulrich Drepper Date: Fri, 13 Feb 1998 17:54:15 +0000 Subject: Update. 1998-02-13 17:39 Ulrich Drepper * elf/Makefile: Don't use --version-script parameter to link ld.so unconditionally. 1998-01-02 04:19 Geoff Keating * math/Makefile: Add t_exp. * math/libm-test.c: Tighten accuracy bounds for exp(), correct constants. * math/test-reduce.c: Remove temporarily, it seems to be broken. * sysdeps/libm-ieee754/e_exp.c: Use accurate table method. * sysdeps/libm-ieee754/e_expf.c: Use table & double precision for better accuracy. * sysdeps/libm-ieee754/s_exp2.c: Use better polynomial; correct algorithm for very large/very small arguments. * sysdeps/libm-ieee754/s_exp2f.c: Use slightly better polynomial; correct algorithm for very large/very small arguments; adjust for new table. * sysdeps/libm-ieee754/t_exp.c: New file. * sysdeps/libm-ieee754/t_exp2f.h: Use table with smaller deltas. * sysdeps/unix/sysv/linux/powerpc/dl-sysdep.c: Put 'strange test' back, with comment that explains what breaks when you remove it :-(. * localedata/xfrm-test.c: Avoid integer overflow. * stdlib/strfmon.c: char is unsigned, sometimes. *sysdeps/powerpc * sysdeps/powerpc/Makefile: Remove quad float support. * sysdeps/powerpc/q_*.c: Remove, they will become an add-on. * sysdeps/powerpc/quad_float.h: Likewise. * sysdeps/powerpc/test-arith.c: Likewise. * sysdeps/powerpc/test-arithf.c: Likewise. * sysdeps/generic/s_exp2.c: Remove, we have this implemented now. * sysdeps/generic/s_exp2f.c: Likewise. * sysdeps/powerpc/bits/mathinline.h: Use underscores around __asm__, don't try anything if _SOFT_FLOAT. 1997-12-31 Andreas Schwab * locale/C-ctype.c (_nl_C_LC_CTYPE_class32): Undo last change. * locale/programs/ld-ctype.c (CHAR_CLASS32_TRANS): Likewise. * wctype/wctype.c: Likewise. * wctype/wctype.h (_ISwxxx): Renamed from _ISxxx, all uses changed. They are incompatible with the _ISxxx values from on little endian machines. (_ISwbit) [__BYTE_ORDER == __LITTLE_ENDIAN]: Correctly transform bit number. This fixes the real bug and restores the integrity of the ctype locale file. * wctype/wcfuncs.c: Change all _ISxxx to _ISwxxx. * wctype/wcfuncs_l.c: Likewise. * wctype/wcextra.c: Likewise. * wctype/wctype_l.c [__BYTE_ORDER == __LITTLE_ENDIAN]: Use correct byte swapping. 1998-02-09 Andreas Schwab * sysdeps/unix/sysv/linux/sparc/sparc32/sysdep.S (errno): Put it into .bss segment instead of .common, so that aliases on it work. * sysdeps/unix/sysv/linux/i386/sysdep.S (errno): Add .type and .size directives, put into .bss segment instead of initializing it to 4. 1998-02-12 08:00 H.J. Lu * libc.map (gnu_get_libc_release, gnu_get_libc_version): Added. * version.c (__gnu_get_libc_release, __gnu_get_libc_version): New functions. Make names without __ weak aliases. (__libc_release, __libc_version): Make them static. * include/gnu/libc-version.h: New file. * Makefile (headers): Add gnu/libc-version.h. 1998-02-13 Ulrich Drepper * stdlib/stdlib.h (struct drand48_data): Leave X to user macros and use x for member name. Reported by Daniel Lyddy . * stdlib/drand48.c: Change according to member name change. * stdlib/drand48_r.c: Likewise. * stdlib/lcong48_r.c: Likewise. * stdlib/lrand48.c: Likewise. * stdlib/lrand48_r.c: Likewise. * stdlib/mrand48.c: Likewise. * stdlib/mrand48_r.c: Likewise. * stdlib/seed48.c: Likewise. * stdlib/seed48_r.c: Likewise. * stdlib/srand48_r.c: Likewise. 1998-02-11 Andreas Jaeger * nss/test-netdb.c: Add some more test cases. 1998-02-13 11:39 Ulrich Drepper * libio/iovsscanf.c: Undo last change modifying errno. 1998-02-12 Andreas Schwab * stdio-common/vfscanf.c: Never try to read another character after EOF. Don't decrement read_in after EOF, it wasn't incremented in the first place. (NEXT_WIDE_CHAR): Set First, not first. 1998-02-06 07:48 H.J. Lu * db/Makefile ($(inst_libdir)/libndbm.a, $(inst_libdir)/libndbm.so): New targets. * db2/Makefile: Likewise. 1998-02-12 08:20 H.J. Lu * sysdeps/gnu/errlist.awk (sys_errlist, sys_nerr): Create weak aliases if HAVE_ELF or PIC or DO_VERSIONING is not defined. 1998-02-12 Andreas Schwab * sysdeps/generic/_G_config.h: Define _G_wchar_t, for C++ . * sysdeps/unix/sysv/linux/_G_config.h: Likewise. 1998-02-11 Andreas Schwab * sysdeps/unix/make-syscalls.sh: Fix sed pattern when dealing with versioned symbols. 1998-02-13 08:14 H.J. Lu * libc.map (_dl_global_scope, _dl_lookup_symbol_skip, _dl_lookup_versioned_symbol, _dl_lookup_versioned_symbol_skip): Added for libdl.so. * elf/rtld.map: New file. Needed to define the GLIBC_2.* * manual/socket.texi (Host Address Functions): Clarify description * sysdeps/unix/sysv/linux/alpha/bits/time.h (struct timeval): --- sysdeps/generic/_G_config.h | 2 + sysdeps/gnu/errlist.awk | 2 +- sysdeps/gnu/errlist.c | 2 +- sysdeps/libm-ieee754/e_exp.c | 330 +++++++------ sysdeps/libm-ieee754/e_expf.c | 241 +++++---- sysdeps/libm-ieee754/s_exp2.c | 71 +-- sysdeps/libm-ieee754/s_exp2f.c | 77 +-- sysdeps/libm-ieee754/t_exp.c | 436 +++++++++++++++++ sysdeps/libm-ieee754/t_exp2f.h | 649 +++++++++++++------------ sysdeps/powerpc/Dist | 1 - sysdeps/powerpc/Makefile | 10 - sysdeps/powerpc/bits/mathinline.h | 12 +- sysdeps/powerpc/q_addsub.c | 549 --------------------- sysdeps/powerpc/q_dtoq.c | 66 --- sysdeps/powerpc/q_feq.c | 65 --- sysdeps/powerpc/q_fne.c | 70 --- sysdeps/powerpc/q_itoq.c | 50 -- sysdeps/powerpc/q_lltoq.c | 52 -- sysdeps/powerpc/q_neg.c | 38 -- sysdeps/powerpc/q_qtoi.c | 65 --- sysdeps/powerpc/q_qtoll.c | 64 --- sysdeps/powerpc/q_qtos.c | 84 ---- sysdeps/powerpc/q_qtou.c | 64 --- sysdeps/powerpc/q_qtoull.c | 65 --- sysdeps/powerpc/q_stoq.c | 65 --- sysdeps/powerpc/q_ulltoq.c | 46 -- sysdeps/powerpc/q_utoq.c | 44 -- sysdeps/powerpc/quad_float.h | 44 -- sysdeps/unix/make-syscalls.sh | 4 +- sysdeps/unix/sysv/linux/_G_config.h | 2 + sysdeps/unix/sysv/linux/i386/sysdep.S | 8 +- sysdeps/unix/sysv/linux/powerpc/dl-sysdep.c | 16 +- sysdeps/unix/sysv/linux/sparc/sparc32/sysdep.S | 7 +- 33 files changed, 1220 insertions(+), 2081 deletions(-) create mode 100644 sysdeps/libm-ieee754/t_exp.c delete mode 100644 sysdeps/powerpc/q_addsub.c delete mode 100644 sysdeps/powerpc/q_dtoq.c delete mode 100644 sysdeps/powerpc/q_feq.c delete mode 100644 sysdeps/powerpc/q_fne.c delete mode 100644 sysdeps/powerpc/q_itoq.c delete mode 100644 sysdeps/powerpc/q_lltoq.c delete mode 100644 sysdeps/powerpc/q_neg.c delete mode 100644 sysdeps/powerpc/q_qtoi.c delete mode 100644 sysdeps/powerpc/q_qtoll.c delete mode 100644 sysdeps/powerpc/q_qtos.c delete mode 100644 sysdeps/powerpc/q_qtou.c delete mode 100644 sysdeps/powerpc/q_qtoull.c delete mode 100644 sysdeps/powerpc/q_stoq.c delete mode 100644 sysdeps/powerpc/q_ulltoq.c delete mode 100644 sysdeps/powerpc/q_utoq.c delete mode 100644 sysdeps/powerpc/quad_float.h (limited to 'sysdeps') diff --git a/sysdeps/generic/_G_config.h b/sysdeps/generic/_G_config.h index f670d4cf04..6734996877 100644 --- a/sysdeps/generic/_G_config.h +++ b/sysdeps/generic/_G_config.h @@ -8,6 +8,7 @@ #include #define __need_size_t +#define __need_wchar_t #define __need_wint_t #define __need_NULL #include @@ -27,6 +28,7 @@ typedef unsigned int wint_t; #define _G_off64_t __off_t #define _G_pid_t __pid_t #define _G_uid_t __uid_t +#define _G_wchar_t wchar_t #define _G_wint_t wint_t #define _G_stat64 stat diff --git a/sysdeps/gnu/errlist.awk b/sysdeps/gnu/errlist.awk index 6e9ad45966..a14c29cf98 100644 --- a/sysdeps/gnu/errlist.awk +++ b/sysdeps/gnu/errlist.awk @@ -85,7 +85,7 @@ END { print " };"; print ""; print "const int SYS_NERR = sizeof SYS_ERRLIST / sizeof SYS_ERRLIST [0];"; - print "#ifndef PIC"; + print "#if !defined HAVE_ELF || !defined PIC || !defined DO_VERSIONING"; print "weak_alias (_sys_errlist, sys_errlist)"; print "weak_alias (_sys_nerr, sys_nerr)"; print "#endif"; diff --git a/sysdeps/gnu/errlist.c b/sysdeps/gnu/errlist.c index 0d12cb32c9..6b7b4d4f6b 100644 --- a/sysdeps/gnu/errlist.c +++ b/sysdeps/gnu/errlist.c @@ -815,7 +815,7 @@ TRANS This error code has no purpose. */ }; const int SYS_NERR = sizeof SYS_ERRLIST / sizeof SYS_ERRLIST [0]; -#ifndef PIC +#if !defined HAVE_ELF || !defined PIC || !defined DO_VERSIONING weak_alias (_sys_errlist, sys_errlist) weak_alias (_sys_nerr, sys_nerr) #endif diff --git a/sysdeps/libm-ieee754/e_exp.c b/sysdeps/libm-ieee754/e_exp.c index 9eba853c8f..a6d53eb9df 100644 --- a/sysdeps/libm-ieee754/e_exp.c +++ b/sysdeps/libm-ieee754/e_exp.c @@ -1,167 +1,179 @@ -/* @(#)e_exp.c 5.1 93/09/24 */ -/* - * ==================================================== - * Copyright (C) 1993 by Sun Microsystems, Inc. All rights reserved. - * - * Developed at SunPro, a Sun Microsystems, Inc. business. - * Permission to use, copy, modify, and distribute this - * software is freely granted, provided that this notice - * is preserved. - * ==================================================== - */ - -#if defined(LIBM_SCCS) && !defined(lint) -static char rcsid[] = "$NetBSD: e_exp.c,v 1.8 1995/05/10 20:45:03 jtc Exp $"; -#endif +/* Double-precision floating point e^x. + Copyright (C) 1997, 1998 Free Software Foundation, Inc. + This file is part of the GNU C Library. + Contributed by Geoffrey Keating -/* __ieee754_exp(x) - * Returns the exponential of x. - * - * Method - * 1. Argument reduction: - * Reduce x to an r so that |r| <= 0.5*ln2 ~ 0.34658. - * Given x, find r and integer k such that - * - * x = k*ln2 + r, |r| <= 0.5*ln2. - * - * Here r will be represented as r = hi-lo for better - * accuracy. - * - * 2. Approximation of exp(r) by a special rational function on - * the interval [0,0.34658]: - * Write - * R(r**2) = r*(exp(r)+1)/(exp(r)-1) = 2 + r*r/6 - r**4/360 + ... - * We use a special Reme algorithm on [0,0.34658] to generate - * a polynomial of degree 5 to approximate R. The maximum error - * of this polynomial approximation is bounded by 2**-59. In - * other words, - * R(z) ~ 2.0 + P1*z + P2*z**2 + P3*z**3 + P4*z**4 + P5*z**5 - * (where z=r*r, and the values of P1 to P5 are listed below) - * and - * | 5 | -59 - * | 2.0+P1*z+...+P5*z - R(z) | <= 2 - * | | - * The computation of exp(r) thus becomes - * 2*r - * exp(r) = 1 + ------- - * R - r - * r*R1(r) - * = 1 + r + ----------- (for better accuracy) - * 2 - R1(r) - * where - * 2 4 10 - * R1(r) = r - (P1*r + P2*r + ... + P5*r ). - * - * 3. Scale back to obtain exp(x): - * From step 1, we have - * exp(x) = 2^k * exp(r) - * - * Special cases: - * exp(INF) is INF, exp(NaN) is NaN; - * exp(-INF) is 0, and - * for finite argument, only exp(0)=1 is exact. - * - * Accuracy: - * according to an error analysis, the error is always less than - * 1 ulp (unit in the last place). - * - * Misc. info. - * For IEEE double - * if x > 7.09782712893383973096e+02 then exp(x) overflow - * if x < -7.45133219101941108420e+02 then exp(x) underflow - * - * 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 "math.h" -#include "math_private.h" - -#ifdef __STDC__ -static const double -#else -static double -#endif -one = 1.0, -halF[2] = {0.5,-0.5,}, -huge = 1.0e+300, -twom1000= 9.33263618503218878990e-302, /* 2**-1000=0x01700000,0*/ -o_threshold= 7.09782712893383973096e+02, /* 0x40862E42, 0xFEFA39EF */ -u_threshold= -7.45133219101941108420e+02, /* 0xc0874910, 0xD52D3051 */ -ln2HI[2] ={ 6.93147180369123816490e-01, /* 0x3fe62e42, 0xfee00000 */ - -6.93147180369123816490e-01,},/* 0xbfe62e42, 0xfee00000 */ -ln2LO[2] ={ 1.90821492927058770002e-10, /* 0x3dea39ef, 0x35793c76 */ - -1.90821492927058770002e-10,},/* 0xbdea39ef, 0x35793c76 */ -invln2 = 1.44269504088896338700e+00, /* 0x3ff71547, 0x652b82fe */ -P1 = 1.66666666666666019037e-01, /* 0x3FC55555, 0x5555553E */ -P2 = -2.77777777770155933842e-03, /* 0xBF66C16C, 0x16BEBD93 */ -P3 = 6.61375632143793436117e-05, /* 0x3F11566A, 0xAF25DE2C */ -P4 = -1.65339022054652515390e-06, /* 0xBEBBBD41, 0xC5D26BF1 */ -P5 = 4.13813679705723846039e-08; /* 0x3E663769, 0x72BEA4D0 */ - - -#ifdef __STDC__ - double __ieee754_exp(double x) /* default IEEE double exp */ -#else - double __ieee754_exp(x) /* default IEEE double exp */ - double x; + The GNU C Library is free software; you can redistribute it and/or + modify it under the terms of the GNU Library General Public License as + published by the Free Software Foundation; either version 2 of the + License, or (at your option) any later version. + + The GNU C 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 + Library General Public License for more details. + + You should have received a copy of the GNU Library General Public + License along with the GNU C Library; see the file COPYING.LIB. If not, + write to the Free Software Foundation, Inc., 59 Temple Place - Suite 330, + Boston, MA 02111-1307, USA. */ + +/* How this works: + The basic design here is from + Shmuel Gal and Boris Bachelis, "An Accurate Elementary Mathematical + Library for the IEEE Floating Point Standard", ACM Trans. Math. Soft., + 17 (1), March 1991, pp. 26-45. + + The input value, x, is written as + + x = n * ln(2)_0 + t/512 + delta[t] + x + n * ln(2)_1 + + where: + - n is an integer, 1024 >= n >= -1075; + - ln(2)_0 is the first 43 bits of ln(2), and ln(2)_1 is the remainder, so + that |ln(2)_1| < 2^-32; + - t is an integer, 177 >= t >= -177 + - delta is based on a table entry, delta[t] < 2^-28 + - x is whatever is left, |x| < 2^-10 + + Then e^x is approximated as + + e^x = 2^n_1 ( 2^n_0 e^(t/512 + delta[t]) + + ( 2^n_0 e^(t/512 + delta[t]) + * ( p(x + n * ln(2)_1) + - n*ln(2)_1 + - n*ln(2)_1 * p(x + n * ln(2)_1) ) ) ) + + where + - p(x) is a polynomial approximating e(x)-1; + - e^(t/512 + delta[t]) is obtained from a table; + - n_1 + n_0 = n, so that |n_0| < DBL_MIN_EXP-1. + + If it happens that n_1 == 0 (this is the usual case), that multiplication + is omitted. + */ +#ifndef _GNU_SOURCE +#define _GNU_SOURCE #endif +#include +#include +#include +#include +#include +#include + +extern const float __exp_deltatable[178]; +extern const double __exp_atable[355] /* __attribute__((mode(DF))) */; + +static const volatile double TWO1023 = 8.988465674311579539e+307; +static const volatile double TWOM1000 = 9.3326361850321887899e-302; + +double +__ieee754_exp (double x) { - double y,hi,lo,c,t; - int32_t k,xsb; - u_int32_t hx; - - GET_HIGH_WORD(hx,x); - xsb = (hx>>31)&1; /* sign bit of x */ - hx &= 0x7fffffff; /* high word of |x| */ - - /* filter out non-finite argument */ - if(hx >= 0x40862E42) { /* if |x|>=709.78... */ - if(hx>=0x7ff00000) { - u_int32_t lx; - GET_LOW_WORD(lx,x); - if(((hx&0xfffff)|lx)!=0) - return x+x; /* NaN */ - else return (xsb==0)? x:0.0; /* exp(+-inf)={inf,0} */ - } - if(x > o_threshold) return huge*huge; /* overflow */ - if(x < u_threshold) return twom1000*twom1000; /* underflow */ + static const uint32_t a_minf = 0xff800000; + static const double himark = 709.7827128933840868; + static const double lomark = -745.1332191019412221; + /* Check for usual case. */ + if (isless (x, himark) && isgreater (x, lomark)) + { + static const float TWO43 = 8796093022208.0; + static const float TWO52 = 4503599627370496.0; + /* 1/ln(2). */ + static const double M_1_LN2 = 1.442695040888963387; + /* ln(2), part 1 */ + static const double M_LN2_0 = .6931471805598903302; + /* ln(2), part 2 */ + static const double M_LN2_1 = 5.497923018708371155e-14; + + int tval, unsafe, n_i; + double x22, n, t, dely, result; + union ieee754_double ex2_u, scale_u; + fenv_t oldenv; + + feholdexcept (&oldenv); + fesetround (FE_TONEAREST); + + /* Calculate n. */ + if (x >= 0) + { + n = x * M_1_LN2 + TWO52; + n -= TWO52; } + else + { + n = x * M_1_LN2 - TWO52; + n += TWO52; + } + x = x - n*M_LN2_0; + if (x >= 0) + { + /* Calculate t/512. */ + t = x + TWO43; + t -= TWO43; + x -= t; + + /* Compute tval = t. */ + tval = (int) (t * 512.0); - /* argument reduction */ - if(hx > 0x3fd62e42) { /* if |x| > 0.5 ln2 */ - if(hx < 0x3FF0A2B2) { /* and |x| < 1.5 ln2 */ - hi = x-ln2HI[xsb]; lo=ln2LO[xsb]; k = 1-xsb-xsb; - } else { - k = invln2*x+halF[xsb]; - t = k; - hi = x - t*ln2HI[0]; /* t*ln2HI is exact here */ - lo = t*ln2LO[0]; - } - x = hi - lo; - } - else if(hx < 0x3e300000) { /* when |x|<2**-28 */ - if(huge+x>one) return one+x;/* trigger inexact */ + x -= __exp_deltatable[tval]; } - else k = 0; - - /* x is now in primary range */ - t = x*x; - c = x - t*(P1+t*(P2+t*(P3+t*(P4+t*P5)))); - if(k==0) return one-((x*c)/(c-2.0)-x); - else y = one-((lo-(x*c)/(2.0-c))-hi); - if(k >= -1021) { - u_int32_t hy; - GET_HIGH_WORD(hy,y); - SET_HIGH_WORD(y,hy+(k<<20)); /* add k to y's exponent */ - return y; - } else { - u_int32_t hy; - GET_HIGH_WORD(hy,y); - SET_HIGH_WORD(y,hy+((k+1000)<<20)); /* add k to y's exponent */ - return y*twom1000; + else + { + /* As above, but x is negative. */ + t = x - TWO43; + t += TWO43; + x -= t; + + tval = (int) (t * 512.0); + + x += __exp_deltatable[-tval]; } + + /* Now, the variable x contains x + n*ln(2)_1. */ + dely = n*M_LN2_1; + + /* Compute ex2 = 2^n_0 e^(t/512+delta[t]). */ + ex2_u.d = __exp_atable[tval+177]; + n_i = (int)n; + /* 'unsafe' is 1 iff n_1 != 0. */ + unsafe = abs(n_i) >= -DBL_MIN_EXP - 1; + ex2_u.ieee.exponent += n_i >> unsafe; + + /* Compute scale = 2^n_1. */ + scale_u.d = 1.0; + scale_u.ieee.exponent += n_i - (n_i >> unsafe); + + /* Approximate e^x2 - 1, using a fourth-degree polynomial, + with maximum error in [-2^-10-2^-28,2^-10+2^-28] + less than 4.9e-19. */ + x22 = (((0.04166666898464281565 + * x + 0.1666666766008501610) + * x + 0.499999999999990008) + * x + 0.9999999999999976685) * x; + /* Allow for impact of dely. */ + x22 -= dely + dely*x22; + + /* Return result. */ + fesetenv (&oldenv); + + result = x22 * ex2_u.d + ex2_u.d; + if (!unsafe) + return result; + else + return result * scale_u.d; + } + /* Exceptional cases: */ + else if (isless (x, himark)) + { + if (x == *(const float *) &a_minf) + /* e^-inf == 0, with no error. */ + return 0; + else + /* Underflow */ + return TWOM1000 * TWOM1000; + } + else + /* Return x, if x is a NaN or Inf; or overflow, otherwise. */ + return TWO1023*x; } diff --git a/sysdeps/libm-ieee754/e_expf.c b/sysdeps/libm-ieee754/e_expf.c index fbf2691bf9..08103aa271 100644 --- a/sysdeps/libm-ieee754/e_expf.c +++ b/sysdeps/libm-ieee754/e_expf.c @@ -1,104 +1,157 @@ -/* e_expf.c -- float version of e_exp.c. - * Conversion to float by Ian Lance Taylor, Cygnus Support, ian@cygnus.com. - */ - -/* - * ==================================================== - * Copyright (C) 1993 by Sun Microsystems, Inc. All rights reserved. - * - * Developed at SunPro, a Sun Microsystems, Inc. business. - * Permission to use, copy, modify, and distribute this - * software is freely granted, provided that this notice - * is preserved. - * ==================================================== - */ - -#if defined(LIBM_SCCS) && !defined(lint) -static char rcsid[] = "$NetBSD: e_expf.c,v 1.6 1996/04/08 15:43:43 phil Exp $"; -#endif +/* Single-precision floating point e^x. + Copyright (C) 1997, 1998 Free Software Foundation, Inc. + This file is part of the GNU C Library. + Contributed by Geoffrey Keating -#include "math.h" -#include "math_private.h" + The GNU C Library is free software; you can redistribute it and/or + modify it under the terms of the GNU Library General Public License as + published by the Free Software Foundation; either version 2 of the + License, or (at your option) any later version. -static const float huge = 1.0e+30; + The GNU C 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 + Library General Public License for more details. -#ifdef __STDC__ -static const float -#else -static float -#endif -one = 1.0, -halF[2] = {0.5,-0.5,}, -twom100 = 7.8886090522e-31, /* 2**-100=0x0d800000 */ -o_threshold= 8.8721679688e+01, /* 0x42b17180 */ -u_threshold= -1.0397208405e+02, /* 0xc2cff1b5 */ -ln2HI[2] ={ 6.9313812256e-01, /* 0x3f317180 */ - -6.9313812256e-01,}, /* 0xbf317180 */ -ln2LO[2] ={ 9.0580006145e-06, /* 0x3717f7d1 */ - -9.0580006145e-06,}, /* 0xb717f7d1 */ -invln2 = 1.4426950216e+00, /* 0x3fb8aa3b */ -P1 = 1.6666667163e-01, /* 0x3e2aaaab */ -P2 = -2.7777778450e-03, /* 0xbb360b61 */ -P3 = 6.6137559770e-05, /* 0x388ab355 */ -P4 = -1.6533901999e-06, /* 0xb5ddea0e */ -P5 = 4.1381369442e-08; /* 0x3331bb4c */ - -#ifdef __STDC__ - float __ieee754_expf(float x) /* default IEEE double exp */ -#else - float __ieee754_expf(x) /* default IEEE double exp */ - float x; + You should have received a copy of the GNU Library General Public + License along with the GNU C Library; see the file COPYING.LIB. If not, + write to the Free Software Foundation, Inc., 59 Temple Place - Suite 330, + Boston, MA 02111-1307, USA. */ + +/* How this works: + + The input value, x, is written as + + x = n * ln(2) + t/512 + delta[t] + x; + + where: + - n is an integer, 127 >= n >= -150; + - t is an integer, 177 >= t >= -177 + - delta is based on a table entry, delta[t] < 2^-28 + - x is whatever is left, |x| < 2^-10 + + Then e^x is approximated as + + e^x = 2^n ( e^(t/512 + delta[t]) + + ( e^(t/512 + delta[t]) + * ( p(x + delta[t] + n * ln(2)) - delta ) ) ) + + where + - p(x) is a polynomial approximating e(x)-1; + - e^(t/512 + delta[t]) is obtained from a table. + + The table used is the same one as for the double precision version; + since we have the table, we might as well use it. + + It turns out to be faster to do calculations in double precision than + to perform an 'accurate table method' expf, because of the range reduction + overhead (compare exp2f). + */ +#ifndef _GNU_SOURCE +#define _GNU_SOURCE #endif +#include +#include +#include +#include +#include +#include + +extern const float __exp_deltatable[178]; +extern const double __exp_atable[355] /* __attribute__((mode(DF))) */; + +static const volatile float TWOM100 = 7.88860905e-31; +static const volatile float TWO127 = 1.7014118346e+38; + +float +__ieee754_expf (float x) { - float y,hi,lo,c,t; - int32_t k,xsb; - u_int32_t hx; - - GET_FLOAT_WORD(hx,x); - xsb = (hx>>31)&1; /* sign bit of x */ - hx &= 0x7fffffff; /* high word of |x| */ - - /* filter out non-finite argument */ - if(hx >= 0x42b17218) { /* if |x|>=88.721... */ - if(hx>0x7f800000) - return x+x; /* NaN */ - if(hx==0x7f800000) - return (xsb==0)? x:0.0; /* exp(+-inf)={inf,0} */ - if(x > o_threshold) return huge*huge; /* overflow */ - if(x < u_threshold) return twom100*twom100; /* underflow */ - } + static const uint32_t a_minf = 0xff800000; + static const float himark = 88.72283935546875; + static const float lomark = -103.972084045410; + /* Check for usual case. */ + if (isless (x, himark) && isgreater (x, lomark)) + { + static const float TWO43 = 8796093022208.0; + static const float TWO23 = 8388608.0; + /* 1/ln(2). */ +#undef M_1_LN2 + static const float M_1_LN2 = 1.44269502163f; + /* ln(2) */ +#undef M_LN2 + static const double M_LN2 = .6931471805599452862; + + int tval; + double x22, t, result, dx; + float n, delta; + union ieee754_double ex2_u; + fenv_t oldenv; + + feholdexcept (&oldenv); + fesetround (FE_TONEAREST); - /* argument reduction */ - if(hx > 0x3eb17218) { /* if |x| > 0.5 ln2 */ - if(hx < 0x3F851592) { /* and |x| < 1.5 ln2 */ - hi = x-ln2HI[xsb]; lo=ln2LO[xsb]; k = 1-xsb-xsb; - } else { - k = invln2*x+halF[xsb]; - t = k; - hi = x - t*ln2HI[0]; /* t*ln2HI is exact here */ - lo = t*ln2LO[0]; - } - x = hi - lo; + /* Calculate n. */ + if (x >= 0) + { + n = x * M_1_LN2 + TWO23; + n -= TWO23; } - else if(hx < 0x31800000) { /* when |x|<2**-28 */ - if(huge+x>one) return one+x;/* trigger inexact */ + else + { + n = x * M_1_LN2 - TWO23; + n += TWO23; } - else k = 0; - - /* x is now in primary range */ - t = x*x; - c = x - t*(P1+t*(P2+t*(P3+t*(P4+t*P5)))); - if(k==0) return one-((x*c)/(c-(float)2.0)-x); - else y = one-((lo-(x*c)/((float)2.0-c))-hi); - if(k >= -125) { - u_int32_t hy; - GET_FLOAT_WORD(hy,y); - SET_FLOAT_WORD(y,hy+(k<<23)); /* add k to y's exponent */ - return y; - } else { - u_int32_t hy; - GET_FLOAT_WORD(hy,y); - SET_FLOAT_WORD(y,hy+((k+100)<<23)); /* add k to y's exponent */ - return y*twom100; + dx = x - n*M_LN2; + if (dx >= 0) + { + /* Calculate t/512. */ + t = dx + TWO43; + t -= TWO43; + dx -= t; + + /* Compute tval = t. */ + tval = (int) (t * 512.0); + + delta = - __exp_deltatable[tval]; } + else + { + /* As above, but x is negative. */ + t = dx - TWO43; + t += TWO43; + dx -= t; + + tval = (int) (t * 512.0); + + delta = __exp_deltatable[-tval]; + } + + /* Compute ex2 = 2^n e^(t/512+delta[t]). */ + ex2_u.d = __exp_atable[tval+177]; + ex2_u.ieee.exponent += (int) n; + + /* Approximate e^(dx+delta) - 1, using a second-degree polynomial, + with maximum error in [-2^-10-2^-28,2^-10+2^-28] + less than 5e-11. */ + x22 = (0.5000000496709180453 * dx + 1.0000001192102037084) * dx + delta; + + /* Return result. */ + fesetenv (&oldenv); + + result = x22 * ex2_u.d + ex2_u.d; + return (float) result; + } + /* Exceptional cases: */ + else if (isless (x, himark)) + { + if (x == *(const float *) &a_minf) + /* e^-inf == 0, with no error. */ + return 0; + else + /* Underflow */ + return TWOM100 * TWOM100; + } + else + /* Return x, if x is a NaN or Inf; or overflow, otherwise. */ + return TWO127*x; } diff --git a/sysdeps/libm-ieee754/s_exp2.c b/sysdeps/libm-ieee754/s_exp2.c index fc3fd2507b..d6f4de02d6 100644 --- a/sysdeps/libm-ieee754/s_exp2.c +++ b/sysdeps/libm-ieee754/s_exp2.c @@ -36,21 +36,23 @@ #include "t_exp2.h" -static const volatile double TWO1000 = 1.071508607186267320948e+301; +static const volatile double TWO1023 = 8.988465674311579539e+307; static const volatile double TWOM1000 = 9.3326361850321887899e-302; double __ieee754_exp2 (double x) { - static const uint32_t a_inf = 0x7f800000; + static const uint32_t a_minf = 0xff800000; + static const double himark = (double) DBL_MAX_EXP; + static const double lomark = (double) (DBL_MIN_EXP - DBL_MANT_DIG - 1) - 1.0; + /* Check for usual case. */ - if (isless (x, (double) DBL_MAX_EXP) - && isgreater (x, (double) (DBL_MIN_EXP - 1))) + if (isless (x, himark) && isgreater (x, lomark)) { static const float TWO43 = 8796093022208.0; - int tval; - double rx, x22; - union ieee754_double ex2_u; + int tval, unsafe; + double rx, x22, result; + union ieee754_double ex2_u, scale_u; fenv_t oldenv; feholdexcept (&oldenv); @@ -95,37 +97,42 @@ __ieee754_exp2 (double x) /* 3. Compute ex2 = 2^(t/512+e+ex). */ ex2_u.d = exp2_accuratetable[tval & 511]; - ex2_u.ieee.exponent += tval >> 9; + tval >>= 9; + unsafe = abs(tval) >= -DBL_MIN_EXP - 1; + ex2_u.ieee.exponent += tval >> unsafe; + scale_u.d = 1.0; + scale_u.ieee.exponent += tval - (tval >> unsafe); /* 4. Approximate 2^x2 - 1, using a fourth-degree polynomial, - 2^x2 ~= sum(k=0..4 | (x2 * ln(2))^k / k! ) + - so - 2^x2 - 1 ~= sum(k=1..4 | (x2 * ln(2))^k / k! ) - with error less than 2^(1/1024) * (x2 * ln(2))^5 / 5! < 1.2e-18. */ + with maximum error in [-2^-10-2^-30,2^-10+2^-30] + less than 10^-19. */ - x22 = (((.0096181291076284772 - * x + .055504108664821580) - * x + .240226506959100712) - * x + .69314718055994531) * ex2_u.d; + x22 = (((.0096181293647031180 + * x + .055504110254308625) + * x + .240226506959100583) + * x + .69314718055994495) * ex2_u.d; /* 5. Return (2^x2-1) * 2^(t/512+e+ex) + 2^(t/512+e+ex). */ fesetenv (&oldenv); - /* Need to check: does this set FE_INEXACT correctly? */ - return x22 * x + ex2_u.d; + result = x22 * x + ex2_u.d; + + if (!unsafe) + return result; + else + return result * scale_u.d; + } + /* Exceptional cases: */ + else if (isless (x, himark)) + { + if (x == *(const float *) &a_minf) + /* e^-inf == 0, with no error. */ + return 0; + else + /* Underflow */ + return TWOM1000 * TWOM1000; } - /* 2^inf == inf, with no error. */ - else if (x == *(const float *) &a_inf) - return x; - /* Check for overflow. */ - else if (isgreaterequal (x, (double) DBL_MAX_EXP)) - return TWO1000 * TWO1000; - /* And underflow (including -inf). */ - else if (isless (x, (double) (DBL_MIN_EXP - DBL_MANT_DIG))) - return TWOM1000 * TWOM1000; - /* Maybe the result needs to be a denormalised number... */ - else if (!isnan (x)) - return __ieee754_exp2 (x + 1000.0) * TWOM1000; - else /* isnan(x) */ - return x + x; + else + /* Return x, if x is a NaN or Inf; or overflow, otherwise. */ + return TWO1023*x; } diff --git a/sysdeps/libm-ieee754/s_exp2f.c b/sysdeps/libm-ieee754/s_exp2f.c index 05e79c9f5a..11c5d55e2e 100644 --- a/sysdeps/libm-ieee754/s_exp2f.c +++ b/sysdeps/libm-ieee754/s_exp2f.c @@ -38,20 +38,22 @@ #include "t_exp2f.h" static const volatile float TWOM100 = 7.88860905e-31; -static const volatile float huge = 1e+30; +static const volatile float TWO127 = 1.7014118346e+38; float __ieee754_exp2f (float x) { - static const uint32_t a_inf = 0x7f800000; + static const uint32_t a_minf = 0xff800000; + static const float himark = (float) FLT_MAX_EXP; + static const float lomark = (float) (FLT_MIN_EXP - FLT_MANT_DIG - 1) - 1.0; + /* Check for usual case. */ - if (isless (x, (float) FLT_MAX_EXP) - && isgreater (x, (float) (FLT_MIN_EXP - 1))) + if (isless (x, himark) && isgreater (x, lomark)) { - static const float TWO16 = 65536.0; - int tval; - float rx, x22; - union ieee754_float ex2_u; + static const float TWO15 = 32768.0; + int tval, unsafe; + float rx, x22, result; + union ieee754_float ex2_u, scale_u; fenv_t oldenv; feholdexcept (&oldenv); @@ -68,13 +70,13 @@ __ieee754_exp2f (float x) First, calculate rx = ex + t/256. */ if (x >= 0) { - rx = x + TWO16; - rx -= TWO16; + rx = x + TWO15; + rx -= TWO15; } else { - rx = x - TWO16; - rx += TWO16; + rx = x - TWO15; ++ rx += TWO15; } x -= rx; /* Compute x=x1. */ /* Compute tval = (ex*256 + t)+128. @@ -92,40 +94,43 @@ __ieee754_exp2f (float x) /* 'tval & 255' is the same as 'tval%256' except that it's always positive. Compute x = x2. */ - x -= exp2_deltatable[tval & 255]; + x -= __exp2_deltatable[tval & 255]; /* 3. Compute ex2 = 2^(t/255+e+ex). */ - ex2_u.f = exp2_accuratetable[tval & 255]; - ex2_u.ieee.exponent += tval >> 8; + ex2_u.f = __exp2f_atable[tval & 255]; + tval >>= 8; + unsafe = abs(tval) >= -FLT_MIN_EXP - 1; + ex2_u.ieee.exponent += tval >> unsafe; + scale_u.f = 1.0; + scale_u.ieee.exponent += tval - (tval >> unsafe); /* 4. Approximate 2^x2 - 1, using a second-degree polynomial, - 2^x2 ~= sum(k=0..2 | (x2 * ln(2))^k / k! ) + - so - 2^x2 - 1 ~= sum(k=1..4 | (x2 * ln(2))^k / k! ) - with error less than 2^(1/512+7e-4) * (x2 * ln(2))^3 / 3! < 1.2e-18. */ + with maximum error in [-2^-9 - 2^-14, 2^-9 + 2^-14] + less than 1.3e-10. */ - x22 = (.240226507f * x + .6931471806f) * ex2_u.f; + x22 = (.24022656679f * x + .69314736128f) * ex2_u.f; /* 5. Return (2^x2-1) * 2^(t/512+e+ex) + 2^(t/512+e+ex). */ fesetenv (&oldenv); - /* Need to check: does this set FE_INEXACT correctly? */ - return x22 * x + ex2_u.f; + result = x22 * x + ex2_u.f; + + if (!unsafe) + return result; + else + return result * scale_u.f; } - /* 2^inf == inf, with no error. */ - else if (x == *(const float *)&a_inf) + /* Exceptional cases: */ + else if (isless (x, himark)) { - return x; + if (x == *(const float *) &a_minf) + /* e^-inf == 0, with no error. */ + return 0; + else + /* Underflow */ + return TWOM100 * TWOM100; } - /* Check for overflow. */ - else if (isgreaterequal (x, (float) FLT_MAX_EXP)) - return huge * huge; - /* And underflow (including -inf). */ - else if (isless (x, (float) (FLT_MIN_EXP - FLT_MANT_DIG))) - return TWOM100 * TWOM100; - /* Maybe the result needs to be a denormalised number... */ - else if (!isnan (x)) - return __ieee754_exp2f (x + 100.0) * TWOM100; - else /* isnan(x) */ - return x + x; + else + /* Return x, if x is a NaN or Inf; or overflow, otherwise. */ + return TWO127*x; } diff --git a/sysdeps/libm-ieee754/t_exp.c b/sysdeps/libm-ieee754/t_exp.c new file mode 100644 index 0000000000..b02b4f55ca --- /dev/null +++ b/sysdeps/libm-ieee754/t_exp.c @@ -0,0 +1,436 @@ +/* Accurate tables for exp(). + Copyright (C) 1998 Free Software Foundation, Inc. + This file is part of the GNU C Library. + Contributed by Geoffrey Keating + + The GNU C Library is free software; you can redistribute it and/or + modify it under the terms of the GNU Library General Public License as + published by the Free Software Foundation; either version 2 of the + License, or (at your option) any later version. + + The GNU C 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 + Library General Public License for more details. + + You should have received a copy of the GNU Library General Public + License along with the GNU C Library; see the file COPYING.LIB. If not, + write to the Free Software Foundation, Inc., 59 Temple Place - Suite 330, + Boston, MA 02111-1307, USA. */ + +/* This table has the property that, for all integers -177 <= i <= 177, + exp(i/512.0 + __exp_deltatable[abs(i)]) == __exp_atable[i+177] + r + for some -2^-64 < r < 2^-64 (abs(r) < 2^-65 if i <= 0); and that + __exp_deltatable[abs(i)] == t * 2^-60 + for integer t so that abs(t) <= 8847927 * 2^8. */ + +#define W52 (2.22044605e-16) +#define W55 (2.77555756e-17) +#define W58 (3.46944695e-18) +#define W59 (1.73472348e-18) +#define W60 (8.67361738e-19) +const float __exp_deltatable[178] = { + 0*W60, 16558714*W60, -10672149*W59, 1441652*W60, + -15787963*W55, 462888*W60, 7291806*W60, 1698880*W60, + -14375103*W58, -2021016*W60, 728829*W60, -3759654*W60, + 3202123*W60, -10916019*W58, -251570*W60, -1043086*W60, + 8207536*W60, -409964*W60, -5993931*W60, -475500*W60, + 2237522*W60, 324170*W60, -244117*W60, 32077*W60, + 123907*W60, -1019734*W60, -143*W60, 813077*W60, + 743345*W60, 462461*W60, 629794*W60, 2125066*W60, + -2339121*W60, -337951*W60, 9922067*W60, -648704*W60, + 149407*W60, -2687209*W60, -631608*W60, 2128280*W60, + -4882082*W60, 2001360*W60, 175074*W60, 2923216*W60, + -538947*W60, -1212193*W60, -1920926*W60, -1080577*W60, + 3690196*W60, 2643367*W60, 2911937*W60, 671455*W60, + -1128674*W60, 593282*W60, -5219347*W60, -1941490*W60, + 11007953*W60, 239609*W60, -2969658*W60, -1183650*W60, + 942998*W60, 699063*W60, 450569*W60, -329250*W60, + -7257875*W60, -312436*W60, 51626*W60, 555877*W60, + -641761*W60, 1565666*W60, 884327*W60, -10960035*W60, + -2004679*W60, -995793*W60, -2229051*W60, -146179*W60, + -510327*W60, 1453482*W60, -3778852*W60, -2238056*W60, + -4895983*W60, 3398883*W60, -252738*W60, 1230155*W60, + 346918*W60, 1109352*W60, 268941*W60, -2930483*W60, + -1036263*W60, -1159280*W60, 1328176*W60, 2937642*W60, + -9371420*W60, -6902650*W60, -1419134*W60, 1442904*W60, + -1319056*W60, -16369*W60, 696555*W60, -279987*W60, + -7919763*W60, 252741*W60, 459711*W60, -1709645*W60, + 354913*W60, 6025867*W60, -421460*W60, -853103*W60, + -338649*W60, 962151*W60, 955965*W60, 784419*W60, + -3633653*W60, 2277133*W60, -8847927*W52, 1223028*W60, + 5907079*W60, 623167*W60, 5142888*W60, 2599099*W60, + 1214280*W60, 4870359*W60, 593349*W60, -57705*W60, + 7761209*W60, -5564097*W60, 2051261*W60, 6216869*W60, + 4692163*W60, 601691*W60, -5264906*W60, 1077872*W60, + -3205949*W60, 1833082*W60, 2081746*W60, -987363*W60, + -1049535*W60, 2015244*W60, 874230*W60, 2168259*W60, + -1740124*W60, -10068269*W60, -18242*W60, -3013583*W60, + 580601*W60, -2547161*W60, -535689*W60, 2220815*W60, + 1285067*W60, 2806933*W60, -983086*W60, -1729097*W60, + -1162985*W60, -2561904*W60, 801988*W60, 244351*W60, + 1441893*W60, -7517981*W60, 271781*W60, -15021588*W60, + -2341588*W60, -919198*W60, 1642232*W60, 4771771*W60, + -1220099*W60, -3062372*W60, 628624*W60, 1278114*W60, + 13083513*W60, -10521925*W60, 3180310*W60, -1659307*W60, + 3543773*W60, 2501203*W60, 4151*W60, -340748*W60, + -2285625*W60, 2495202*W60 +}; + +const double __exp_atable[355] /* __attribute__((mode(DF))) */ = { + 0.707722561055888932371, /* 0x0.b52d4e46605c27ffd */ + 0.709106182438804188967, /* 0x0.b587fb96f75097ffb */ + 0.710492508843861281234, /* 0x0.b5e2d649899167ffd */ + 0.711881545564593931623, /* 0x0.b63dde74d36bdfffe */ + 0.713273297897442870573, /* 0x0.b699142f945f87ffc */ + 0.714667771153751463236, /* 0x0.b6f477909c4ea0001 */ + 0.716064970655995725059, /* 0x0.b75008aec758f8004 */ + 0.717464901723956938193, /* 0x0.b7abc7a0eea7e0002 */ + 0.718867569715736398602, /* 0x0.b807b47e1586c7ff8 */ + 0.720272979947266023271, /* 0x0.b863cf5d10e380003 */ + 0.721681137825144314297, /* 0x0.b8c01855195c37ffb */ + 0.723092048691992950199, /* 0x0.b91c8f7d213740004 */ + 0.724505717938892290800, /* 0x0.b97934ec5002d0007 */ + 0.725922150953176470431, /* 0x0.b9d608b9c92ea7ffc */ + 0.727341353138962865022, /* 0x0.ba330afcc29e98003 */ + 0.728763329918453162104, /* 0x0.ba903bcc8618b7ffc */ + 0.730188086709957051568, /* 0x0.baed9b40591ba0000 */ + 0.731615628948127705309, /* 0x0.bb4b296f931e30002 */ + 0.733045962086486091436, /* 0x0.bba8e671a05617ff9 */ + 0.734479091556371366251, /* 0x0.bc06d25dd49568001 */ + 0.735915022857225542529, /* 0x0.bc64ed4bce8f6fff9 */ + 0.737353761441304711410, /* 0x0.bcc33752f915d7ff9 */ + 0.738795312814142124419, /* 0x0.bd21b08af98e78005 */ + 0.740239682467211168593, /* 0x0.bd80590b65e9a8000 */ + 0.741686875913991849885, /* 0x0.bddf30ebec4a10000 */ + 0.743136898669507939299, /* 0x0.be3e38443c84e0007 */ + 0.744589756269486091620, /* 0x0.be9d6f2c1d32a0002 */ + 0.746045454254026796384, /* 0x0.befcd5bb59baf8004 */ + 0.747503998175051087583, /* 0x0.bf5c6c09ca84c0003 */ + 0.748965393601880857739, /* 0x0.bfbc322f5b18b7ff8 */ + 0.750429646104262104698, /* 0x0.c01c2843f776fffff */ + 0.751896761271877989160, /* 0x0.c07c4e5fa18b88002 */ + 0.753366744698445112140, /* 0x0.c0dca49a5fb18fffd */ + 0.754839601988627206827, /* 0x0.c13d2b0c444db0005 */ + 0.756315338768691947122, /* 0x0.c19de1cd798578006 */ + 0.757793960659406629066, /* 0x0.c1fec8f623723fffd */ + 0.759275473314173443536, /* 0x0.c25fe09e8a0f47ff8 */ + 0.760759882363831851927, /* 0x0.c2c128dedc88f8000 */ + 0.762247193485956486805, /* 0x0.c322a1cf7d6e7fffa */ + 0.763737412354726363781, /* 0x0.c3844b88cb9347ffc */ + 0.765230544649828092739, /* 0x0.c3e626232bd8f7ffc */ + 0.766726596071518051729, /* 0x0.c44831b719bf18002 */ + 0.768225572321911687194, /* 0x0.c4aa6e5d12d078001 */ + 0.769727479119219348810, /* 0x0.c50cdc2da64a37ffb */ + 0.771232322196981678892, /* 0x0.c56f7b41744490001 */ + 0.772740107296721268087, /* 0x0.c5d24bb1259e70004 */ + 0.774250840160724651565, /* 0x0.c6354d95640dd0007 */ + 0.775764526565368872643, /* 0x0.c6988106fec447fff */ + 0.777281172269557396602, /* 0x0.c6fbe61eb1bd0ffff */ + 0.778800783068235302750, /* 0x0.c75f7cf560942fffc */ + 0.780323364758801041312, /* 0x0.c7c345a3f1983fffe */ + 0.781848923151573727006, /* 0x0.c8274043594cb0002 */ + 0.783377464064598849602, /* 0x0.c88b6cec94b3b7ff9 */ + 0.784908993312207869935, /* 0x0.c8efcbb89cba27ffe */ + 0.786443516765346961618, /* 0x0.c9545cc0a88c70003 */ + 0.787981040257604625744, /* 0x0.c9b9201dc643bfffa */ + 0.789521569657452682047, /* 0x0.ca1e15e92a5410007 */ + 0.791065110849462849192, /* 0x0.ca833e3c1ae510005 */ + 0.792611669712891875319, /* 0x0.cae8992fd84667ffd */ + 0.794161252150049179450, /* 0x0.cb4e26ddbc207fff8 */ + 0.795713864077794763584, /* 0x0.cbb3e75f301b60003 */ + 0.797269511407239561694, /* 0x0.cc19dacd978cd8002 */ + 0.798828200086368567220, /* 0x0.cc8001427e55d7ffb */ + 0.800389937624300440456, /* 0x0.cce65ade24d360006 */ + 0.801954725261124767840, /* 0x0.cd4ce7a5de839fffb */ + 0.803522573691593189330, /* 0x0.cdb3a7c79a678fffd */ + 0.805093487311204114563, /* 0x0.ce1a9b563965ffffc */ + 0.806667472122675088819, /* 0x0.ce81c26b838db8000 */ + 0.808244534127439906441, /* 0x0.cee91d213f8428002 */ + 0.809824679342317166307, /* 0x0.cf50ab9144d92fff9 */ + 0.811407913793616542005, /* 0x0.cfb86dd5758c2ffff */ + 0.812994243520784198882, /* 0x0.d0206407c20e20005 */ + 0.814583674571603966162, /* 0x0.d0888e4223facfff9 */ + 0.816176213022088536960, /* 0x0.d0f0ec9eb3f7c8002 */ + 0.817771864936188586101, /* 0x0.d1597f377d6768002 */ + 0.819370636400374108252, /* 0x0.d1c24626a46eafff8 */ + 0.820972533518165570298, /* 0x0.d22b41865ff1e7ff9 */ + 0.822577562404315121269, /* 0x0.d2947170f32ec7ff9 */ + 0.824185729164559344159, /* 0x0.d2fdd60097795fff8 */ + 0.825797039949601741075, /* 0x0.d3676f4fb796d0001 */ + 0.827411500902565544264, /* 0x0.d3d13d78b5f68fffb */ + 0.829029118181348834154, /* 0x0.d43b40960546d8001 */ + 0.830649897953322891022, /* 0x0.d4a578c222a058000 */ + 0.832273846408250750368, /* 0x0.d50fe617a3ba78005 */ + 0.833900969738858188772, /* 0x0.d57a88b1218e90002 */ + 0.835531274148056613016, /* 0x0.d5e560a94048f8006 */ + 0.837164765846411529371, /* 0x0.d6506e1aac8078003 */ + 0.838801451086016225394, /* 0x0.d6bbb1204074e0001 */ + 0.840441336100884561780, /* 0x0.d72729d4c28518004 */ + 0.842084427144139224814, /* 0x0.d792d8530e12b0001 */ + 0.843730730487052604790, /* 0x0.d7febcb61273e7fff */ + 0.845380252404570153833, /* 0x0.d86ad718c308dfff9 */ + 0.847032999194574087728, /* 0x0.d8d727962c69d7fff */ + 0.848688977161248581090, /* 0x0.d943ae49621ce7ffb */ + 0.850348192619261200615, /* 0x0.d9b06b4d832ef8005 */ + 0.852010651900976245816, /* 0x0.da1d5ebdc22220005 */ + 0.853676361342631029337, /* 0x0.da8a88b555baa0006 */ + 0.855345327311054837175, /* 0x0.daf7e94f965f98004 */ + 0.857017556155879489641, /* 0x0.db6580a7c98f7fff8 */ + 0.858693054267390953857, /* 0x0.dbd34ed9617befff8 */ + 0.860371828028939855647, /* 0x0.dc4153ffc8b65fff9 */ + 0.862053883854957292436, /* 0x0.dcaf90368bfca8004 */ + 0.863739228154875360306, /* 0x0.dd1e0399328d87ffe */ + 0.865427867361348468455, /* 0x0.dd8cae435d303fff9 */ + 0.867119807911702289458, /* 0x0.ddfb9050b1cee8006 */ + 0.868815056264353846599, /* 0x0.de6aa9dced8448001 */ + 0.870513618890481399881, /* 0x0.ded9fb03db7320006 */ + 0.872215502247877139094, /* 0x0.df4983e1380657ff8 */ + 0.873920712852848668986, /* 0x0.dfb94490ffff77ffd */ + 0.875629257204025623884, /* 0x0.e0293d2f1cb01fff9 */ + 0.877341141814212965880, /* 0x0.e0996dd786fff0007 */ + 0.879056373217612985183, /* 0x0.e109d6a64f5d57ffc */ + 0.880774957955916648615, /* 0x0.e17a77b78e72a7ffe */ + 0.882496902590150900078, /* 0x0.e1eb5127722cc7ff8 */ + 0.884222213673356738383, /* 0x0.e25c63121fb0c8006 */ + 0.885950897802399772740, /* 0x0.e2cdad93ec5340003 */ + 0.887682961567391237685, /* 0x0.e33f30c925fb97ffb */ + 0.889418411575228162725, /* 0x0.e3b0ecce2d05ffff9 */ + 0.891157254447957902797, /* 0x0.e422e1bf727718006 */ + 0.892899496816652704641, /* 0x0.e4950fb9713fc7ffe */ + 0.894645145323828439008, /* 0x0.e50776d8b0e60fff8 */ + 0.896394206626591749641, /* 0x0.e57a1739c8fadfffc */ + 0.898146687421414902124, /* 0x0.e5ecf0f97c5798007 */ + 0.899902594367530173098, /* 0x0.e660043464e378005 */ + 0.901661934163603406867, /* 0x0.e6d3510747e150006 */ + 0.903424713533971135418, /* 0x0.e746d78f06cd97ffd */ + 0.905190939194458810123, /* 0x0.e7ba97e879c91fffc */ + 0.906960617885092856864, /* 0x0.e82e92309390b0007 */ + 0.908733756358986566306, /* 0x0.e8a2c6845544afffa */ + 0.910510361377119825629, /* 0x0.e9173500c8abc7ff8 */ + 0.912290439722343249336, /* 0x0.e98bddc30f98b0002 */ + 0.914073998177417412765, /* 0x0.ea00c0e84bc4c7fff */ + 0.915861043547953501680, /* 0x0.ea75de8db8094fffe */ + 0.917651582652244779397, /* 0x0.eaeb36d09d3137ffe */ + 0.919445622318405764159, /* 0x0.eb60c9ce4ed3dffff */ + 0.921243169397334638073, /* 0x0.ebd697a43995b0007 */ + 0.923044230737526172328, /* 0x0.ec4ca06fc7768fffa */ + 0.924848813220121135342, /* 0x0.ecc2e44e865b6fffb */ + 0.926656923710931002014, /* 0x0.ed39635df34e70006 */ + 0.928468569126343790092, /* 0x0.edb01dbbc2f5b7ffa */ + 0.930283756368834757725, /* 0x0.ee2713859aab57ffa */ + 0.932102492359406786818, /* 0x0.ee9e44d9342870004 */ + 0.933924784042873379360, /* 0x0.ef15b1d4635438005 */ + 0.935750638358567643520, /* 0x0.ef8d5a94f60f50007 */ + 0.937580062297704630580, /* 0x0.f0053f38f345cffff */ + 0.939413062815381727516, /* 0x0.f07d5fde3a2d98001 */ + 0.941249646905368053689, /* 0x0.f0f5bca2d481a8004 */ + 0.943089821583810716806, /* 0x0.f16e55a4e497d7ffe */ + 0.944933593864477061592, /* 0x0.f1e72b028a2827ffb */ + 0.946780970781518460559, /* 0x0.f2603cd9fb5430001 */ + 0.948631959382661205081, /* 0x0.f2d98b497d2a87ff9 */ + 0.950486566729423554277, /* 0x0.f353166f63e3dffff */ + 0.952344799896018723290, /* 0x0.f3ccde6a11ae37ffe */ + 0.954206665969085765512, /* 0x0.f446e357f66120000 */ + 0.956072172053890279009, /* 0x0.f4c12557964f0fff9 */ + 0.957941325265908139014, /* 0x0.f53ba48781046fffb */ + 0.959814132734539637840, /* 0x0.f5b66106555d07ffa */ + 0.961690601603558903308, /* 0x0.f6315af2c2027fffc */ + 0.963570739036113010927, /* 0x0.f6ac926b8aeb80004 */ + 0.965454552202857141381, /* 0x0.f728078f7c5008002 */ + 0.967342048278315158608, /* 0x0.f7a3ba7d66a908001 */ + 0.969233234469444204768, /* 0x0.f81fab543e1897ffb */ + 0.971128118008140250896, /* 0x0.f89bda33122c78007 */ + 0.973026706099345495256, /* 0x0.f9184738d4cf97ff8 */ + 0.974929006031422851235, /* 0x0.f994f284d3a5c0008 */ + 0.976835024947348973265, /* 0x0.fa11dc35bc7820002 */ + 0.978744770239899142285, /* 0x0.fa8f046b4fb7f8007 */ + 0.980658249138918636210, /* 0x0.fb0c6b449ab1cfff9 */ + 0.982575468959622777535, /* 0x0.fb8a10e1088fb7ffa */ + 0.984496437054508843888, /* 0x0.fc07f5602d79afffc */ + 0.986421160608523028820, /* 0x0.fc8618e0e55e47ffb */ + 0.988349647107594098099, /* 0x0.fd047b83571b1fffa */ + 0.990281903873210800357, /* 0x0.fd831d66f4c018002 */ + 0.992217938695037382475, /* 0x0.fe01fead3320bfff8 */ + 0.994157757657894713987, /* 0x0.fe811f703491e8006 */ + 0.996101369488558541238, /* 0x0.ff007fd5744490005 */ + 0.998048781093141101932, /* 0x0.ff801ffa9b9280007 */ + 1.000000000000000000000, /* 0x1.00000000000000000 */ + 1.001955033605393285965, /* 0x1.0080200565d29ffff */ + 1.003913889319761887310, /* 0x1.0100802aa0e80fff0 */ + 1.005876574715736104818, /* 0x1.01812090377240007 */ + 1.007843096764807100351, /* 0x1.020201541aad7fff6 */ + 1.009813464316352327214, /* 0x1.0283229c4c9820007 */ + 1.011787683565730677817, /* 0x1.030484836910a000e */ + 1.013765762469146736174, /* 0x1.0386272b9c077fffe */ + 1.015747708536026694351, /* 0x1.04080ab526304fff0 */ + 1.017733529475172815584, /* 0x1.048a2f412375ffff0 */ + 1.019723232714418781378, /* 0x1.050c94ef7ad5e000a */ + 1.021716825883923762690, /* 0x1.058f3be0f1c2d0004 */ + 1.023714316605201180057, /* 0x1.06122436442e2000e */ + 1.025715712440059545995, /* 0x1.06954e0fec63afff2 */ + 1.027721021151397406936, /* 0x1.0718b98f41c92fff6 */ + 1.029730250269221158939, /* 0x1.079c66d49bb2ffff1 */ + 1.031743407506447551857, /* 0x1.082056011a9230009 */ + 1.033760500517691527387, /* 0x1.08a487359ebd50002 */ + 1.035781537016238873464, /* 0x1.0928fa93490d4fff3 */ + 1.037806524719013578963, /* 0x1.09adb03b3e5b3000d */ + 1.039835471338248051878, /* 0x1.0a32a84e9e5760004 */ + 1.041868384612101516848, /* 0x1.0ab7e2eea5340ffff */ + 1.043905272300907460835, /* 0x1.0b3d603ca784f0009 */ + 1.045946142174331239262, /* 0x1.0bc3205a042060000 */ + 1.047991002016745332165, /* 0x1.0c4923682a086fffe */ + 1.050039859627715177527, /* 0x1.0ccf698898f3a000d */ + 1.052092722826109660856, /* 0x1.0d55f2dce5d1dfffb */ + 1.054149599440827866881, /* 0x1.0ddcbf86b09a5fff6 */ + 1.056210497317612961855, /* 0x1.0e63cfa7abc97fffd */ + 1.058275424318780855142, /* 0x1.0eeb23619c146fffb */ + 1.060344388322010722446, /* 0x1.0f72bad65714bffff */ + 1.062417397220589476718, /* 0x1.0ffa9627c38d30004 */ + 1.064494458915699715017, /* 0x1.1082b577d0eef0003 */ + 1.066575581342167566880, /* 0x1.110b18e893a90000a */ + 1.068660772440545025953, /* 0x1.1193c09c267610006 */ + 1.070750040138235936705, /* 0x1.121cacb4959befff6 */ + 1.072843392435016474095, /* 0x1.12a5dd543cf36ffff */ + 1.074940837302467588937, /* 0x1.132f529d59552000b */ + 1.077042382749654914030, /* 0x1.13b90cb250d08fff5 */ + 1.079148036789447484528, /* 0x1.14430bb58da3dfff9 */ + 1.081257807444460983297, /* 0x1.14cd4fc984c4a000e */ + 1.083371702785017154417, /* 0x1.1557d910df9c7000e */ + 1.085489730853784307038, /* 0x1.15e2a7ae292d30002 */ + 1.087611899742884524772, /* 0x1.166dbbc422d8c0004 */ + 1.089738217537583819804, /* 0x1.16f9157586772ffff */ + 1.091868692357631731528, /* 0x1.1784b4e533cacfff0 */ + 1.094003332327482702577, /* 0x1.18109a360fc23fff2 */ + 1.096142145591650907149, /* 0x1.189cc58b155a70008 */ + 1.098285140311341168136, /* 0x1.1929370751ea50002 */ + 1.100432324652149906842, /* 0x1.19b5eecdd79cefff0 */ + 1.102583706811727015711, /* 0x1.1a42ed01dbdba000e */ + 1.104739294993289488947, /* 0x1.1ad031c69a2eafff0 */ + 1.106899097422573863281, /* 0x1.1b5dbd3f66e120003 */ + 1.109063122341542140286, /* 0x1.1beb8f8fa8150000b */ + 1.111231377994659874592, /* 0x1.1c79a8dac6ad0fff4 */ + 1.113403872669181282605, /* 0x1.1d0809445a97ffffc */ + 1.115580614653132185460, /* 0x1.1d96b0effc9db000e */ + 1.117761612217810673898, /* 0x1.1e25a001332190000 */ + 1.119946873713312474002, /* 0x1.1eb4d69bdb2a9fff1 */ + 1.122136407473298902480, /* 0x1.1f4454e3bfae00006 */ + 1.124330221845670330058, /* 0x1.1fd41afcbb48bfff8 */ + 1.126528325196519908506, /* 0x1.2064290abc98c0001 */ + 1.128730725913251964394, /* 0x1.20f47f31c9aa7000f */ + 1.130937432396844410880, /* 0x1.21851d95f776dfff0 */ + 1.133148453059692917203, /* 0x1.2216045b6784efffa */ + 1.135363796355857157764, /* 0x1.22a733a6692ae0004 */ + 1.137583470716100553249, /* 0x1.2338ab9b3221a0004 */ + 1.139807484614418608939, /* 0x1.23ca6c5e27aadfff7 */ + 1.142035846532929888057, /* 0x1.245c7613b7f6c0004 */ + 1.144268564977221958089, /* 0x1.24eec8e06b035000c */ + 1.146505648458203463465, /* 0x1.258164e8cea85fff8 */ + 1.148747105501412235671, /* 0x1.26144a5180d380009 */ + 1.150992944689175123667, /* 0x1.26a7793f5de2efffa */ + 1.153243174560058870217, /* 0x1.273af1d712179000d */ + 1.155497803703682491111, /* 0x1.27ceb43d81d42fff1 */ + 1.157756840726344771440, /* 0x1.2862c097a3d29000c */ + 1.160020294239811677834, /* 0x1.28f7170a74cf4fff1 */ + 1.162288172883275239058, /* 0x1.298bb7bb0faed0004 */ + 1.164560485298402170388, /* 0x1.2a20a2ce920dffff4 */ + 1.166837240167474476460, /* 0x1.2ab5d86a4631ffff6 */ + 1.169118446164539637555, /* 0x1.2b4b58b36d5220009 */ + 1.171404112007080167155, /* 0x1.2be123cf786790002 */ + 1.173694246390975415341, /* 0x1.2c7739e3c0aac000d */ + 1.175988858069749065617, /* 0x1.2d0d9b15deb58fff6 */ + 1.178287955789017793514, /* 0x1.2da4478b627040002 */ + 1.180591548323240091978, /* 0x1.2e3b3f69fb794fffc */ + 1.182899644456603782686, /* 0x1.2ed282d76421d0004 */ + 1.185212252993012693694, /* 0x1.2f6a11f96c685fff3 */ + 1.187529382762033236513, /* 0x1.3001ecf60082ffffa */ + 1.189851042595508889847, /* 0x1.309a13f30f28a0004 */ + 1.192177241354644978669, /* 0x1.31328716a758cfff7 */ + 1.194507987909589896687, /* 0x1.31cb4686e1e85fffb */ + 1.196843291137896336843, /* 0x1.32645269dfd04000a */ + 1.199183159977805113226, /* 0x1.32fdaae604c39000f */ + 1.201527603343041317132, /* 0x1.339750219980dfff3 */ + 1.203876630171082595692, /* 0x1.3431424300e480007 */ + 1.206230249419600664189, /* 0x1.34cb8170b3fee000e */ + 1.208588470077065268869, /* 0x1.35660dd14dbd4fffc */ + 1.210951301134513435915, /* 0x1.3600e78b6bdfc0005 */ + 1.213318751604272271958, /* 0x1.369c0ec5c38ebfff2 */ + 1.215690830512196507537, /* 0x1.373783a718d29000f */ + 1.218067546930756250870, /* 0x1.37d3465662f480007 */ + 1.220448909901335365929, /* 0x1.386f56fa770fe0008 */ + 1.222834928513994334780, /* 0x1.390bb5ba5fc540004 */ + 1.225225611877684750397, /* 0x1.39a862bd3c7a8fff3 */ + 1.227620969111500981433, /* 0x1.3a455e2a37bcafffd */ + 1.230021009336254911271, /* 0x1.3ae2a8287dfbefff6 */ + 1.232425741726685064472, /* 0x1.3b8040df76f39fffa */ + 1.234835175450728295084, /* 0x1.3c1e287682e48fff1 */ + 1.237249319699482263931, /* 0x1.3cbc5f151b86bfff8 */ + 1.239668183679933477545, /* 0x1.3d5ae4e2cc0a8000f */ + 1.242091776620540377629, /* 0x1.3df9ba07373bf0006 */ + 1.244520107762172811399, /* 0x1.3e98deaa0d8cafffe */ + 1.246953186383919165383, /* 0x1.3f3852f32973efff0 */ + 1.249391019292643401078, /* 0x1.3fd816ffc72b90001 */ + 1.251833623164381181797, /* 0x1.40782b17863250005 */ + 1.254280999953110153911, /* 0x1.41188f42caf400000 */ + 1.256733161434815393410, /* 0x1.41b943b42945bfffd */ + 1.259190116985283935980, /* 0x1.425a4893e5f10000a */ + 1.261651875958665236542, /* 0x1.42fb9e0a2df4c0009 */ + 1.264118447754797758244, /* 0x1.439d443f608c4fff9 */ + 1.266589841787181258708, /* 0x1.443f3b5bebf850008 */ + 1.269066067469190262045, /* 0x1.44e183883e561fff7 */ + 1.271547134259576328224, /* 0x1.45841cecf7a7a0001 */ + 1.274033051628237434048, /* 0x1.462707b2c43020009 */ + 1.276523829025464573684, /* 0x1.46ca44023aa410007 */ + 1.279019475999373156531, /* 0x1.476dd2045d46ffff0 */ + 1.281520002043128991825, /* 0x1.4811b1e1f1f19000b */ + 1.284025416692967214122, /* 0x1.48b5e3c3edd74fff4 */ + 1.286535729509738823464, /* 0x1.495a67d3613c8fff7 */ + 1.289050950070396384145, /* 0x1.49ff3e396e19d000b */ + 1.291571087985403654081, /* 0x1.4aa4671f5b401fff1 */ + 1.294096152842774794011, /* 0x1.4b49e2ae56d19000d */ + 1.296626154297237043484, /* 0x1.4befb10fd84a3fff4 */ + 1.299161101984141142272, /* 0x1.4c95d26d41d84fff8 */ + 1.301701005575179204100, /* 0x1.4d3c46f01d9f0fff3 */ + 1.304245874766450485904, /* 0x1.4de30ec21097d0003 */ + 1.306795719266019562007, /* 0x1.4e8a2a0ccce3d0002 */ + 1.309350548792467483458, /* 0x1.4f3198fa10346fff5 */ + 1.311910373099227200545, /* 0x1.4fd95bb3be8cffffd */ + 1.314475201942565174546, /* 0x1.50817263bf0e5fffb */ + 1.317045045107389400535, /* 0x1.5129dd3418575000e */ + 1.319619912422941299109, /* 0x1.51d29c4f01c54ffff */ + 1.322199813675649204855, /* 0x1.527bafde83a310009 */ + 1.324784758729532718739, /* 0x1.5325180cfb8b3fffd */ + 1.327374757430096474625, /* 0x1.53ced504b2bd0fff4 */ + 1.329969819671041886272, /* 0x1.5478e6f02775e0001 */ + 1.332569955346704748651, /* 0x1.55234df9d8a59fff8 */ + 1.335175174370685002822, /* 0x1.55ce0a4c5a6a9fff6 */ + 1.337785486688218616860, /* 0x1.56791c1263abefff7 */ + 1.340400902247843806217, /* 0x1.57248376aef21fffa */ + 1.343021431036279800211, /* 0x1.57d040a420c0bfff3 */ + 1.345647083048053138662, /* 0x1.587c53c5a630f0002 */ + 1.348277868295411074918, /* 0x1.5928bd063fd7bfff9 */ + 1.350913796821875845231, /* 0x1.59d57c9110ad60006 */ + 1.353554878672557082439, /* 0x1.5a8292913d68cfffc */ + 1.356201123929036356254, /* 0x1.5b2fff3212db00007 */ + 1.358852542671913132777, /* 0x1.5bddc29edcc06fff3 */ + 1.361509145047255398051, /* 0x1.5c8bdd032ed16000f */ + 1.364170941142184734180, /* 0x1.5d3a4e8a5bf61fff4 */ + 1.366837941171020309735, /* 0x1.5de9176042f1effff */ + 1.369510155261156381121, /* 0x1.5e9837b062f4e0005 */ + 1.372187593620959988833, /* 0x1.5f47afa69436cfff1 */ + 1.374870266463378287715, /* 0x1.5ff77f6eb3f8cfffd */ + 1.377558184010425845733, /* 0x1.60a7a734a9742fff9 */ + 1.380251356531521533853, /* 0x1.6158272490016000c */ + 1.382949794301995272203, /* 0x1.6208ff6a8978a000f */ + 1.385653507605306700170, /* 0x1.62ba3032c0a280004 */ + 1.388362506772382154503, /* 0x1.636bb9a994784000f */ + 1.391076802081129493127, /* 0x1.641d9bfb29a7bfff6 */ + 1.393796403973427855412, /* 0x1.64cfd7545928b0002 */ + 1.396521322756352656542, /* 0x1.65826be167badfff8 */ + 1.399251568859207761660, /* 0x1.663559cf20826000c */ + 1.401987152677323100733, /* 0x1.66e8a14a29486fffc */ + 1.404728084651919228815, /* 0x1.679c427f5a4b6000b */ + 1.407474375243217723560, /* 0x1.68503d9ba0add000f */ + 1.410226034922914983815, /* 0x1.690492cbf6303fff9 */ + 1.412983074197955213304, /* 0x1.69b9423d7b548fff6 */ +}; diff --git a/sysdeps/libm-ieee754/t_exp2f.h b/sysdeps/libm-ieee754/t_exp2f.h index 0f7674cefb..e15d15787c 100644 --- a/sysdeps/libm-ieee754/t_exp2f.h +++ b/sysdeps/libm-ieee754/t_exp2f.h @@ -1,301 +1,352 @@ -/* These values are accurate to 23+9 bits when represented as - a float. */ -static const float exp2_accuratetable[256] = { -0.70711034541 /* 0x0.b5052f003 */, -0.70903021104 /* 0x0.b58301004 */, -0.71092861900 /* 0x0.b5ff6b006 */, -0.71286851176 /* 0x0.b67e8d006 */, -0.71481245762 /* 0x0.b6fdf3004 */, -0.71673321725 /* 0x0.b77bd4001 */, -0.71868461379 /* 0x0.b7fbb7006 */, -0.72064983853 /* 0x0.b87c82006 */, -0.72258073096 /* 0x0.b8fb0d003 */, -0.72456008199 /* 0x0.b97cc5002 */, -0.72652846578 /* 0x0.b9fdc5002 */, -0.72848570353 /* 0x0.ba7e0a004 */, -0.73046034578 /* 0x0.baff73003 */, -0.73244112730 /* 0x0.bb8143000 */, -0.73443359139 /* 0x0.bc03d7002 */, -0.73646944762 /* 0x0.bc8943000 */, -0.73839598903 /* 0x0.bd0785006 */, -0.74041211608 /* 0x0.bd8ba6002 */, -0.74243509775 /* 0x0.be103a004 */, -0.74444299943 /* 0x0.be93d1004 */, -0.74646854405 /* 0x0.bf1890003 */, -0.74849390993 /* 0x0.bf9d4c006 */, -0.75051373248 /* 0x0.c021ab003 */, -0.75252974037 /* 0x0.c0a5ca002 */, -0.75460278996 /* 0x0.c12da6006 */, -0.75663453342 /* 0x0.c1b2cd001 */, -0.75867807874 /* 0x0.c238ba006 */, -0.76072299481 /* 0x0.c2bebe000 */, -0.76271909478 /* 0x0.c3418f002 */, -0.76482868204 /* 0x0.c3cbd0006 */, -0.76694220311 /* 0x0.c45653004 */, -0.76902121311 /* 0x0.c4de93003 */, -0.77110719688 /* 0x0.c56748005 */, -0.77314376835 /* 0x0.c5ecc0003 */, -0.77531152970 /* 0x0.c67ad1004 */, -0.77739948042 /* 0x0.c703a7005 */, -0.77948719274 /* 0x0.c78c79007 */, -0.78161448246 /* 0x0.c817e3004 */, -0.78381162885 /* 0x0.c8a7e1002 */, -0.78587090971 /* 0x0.c92ed6001 */, -0.78799921275 /* 0x0.c9ba51001 */, -0.79011362800 /* 0x0.ca44e3006 */, -0.79225623615 /* 0x0.cad14e005 */, -0.79441082487 /* 0x0.cb5e82006 */, -0.79654645924 /* 0x0.cbea78003 */, -0.79873132707 /* 0x0.cc79a8001 */, -0.80093026168 /* 0x0.cd09c4005 */, -0.80304825308 /* 0x0.cd9492001 */, -0.80526113516 /* 0x0.ce2598004 */, -0.80742740634 /* 0x0.ceb390002 */, -0.80963188410 /* 0x0.cf4409000 */, -0.81180763254 /* 0x0.cfd2a0006 */, -0.81401169308 /* 0x0.d06312005 */, -0.81622666121 /* 0x0.d0f43b000 */, -0.81843453653 /* 0x0.d184ed005 */, -0.82070738078 /* 0x0.d219e1001 */, -0.82289630179 /* 0x0.d2a955003 */, -0.82509487868 /* 0x0.d3396b000 */, -0.82737630616 /* 0x0.d3ceef007 */, -0.82961845408 /* 0x0.d461e0007 */, -0.83179849386 /* 0x0.d4f0bf000 */, -0.83408612023 /* 0x0.d586ab007 */, -0.83636939536 /* 0x0.d61c4e007 */, -0.83862531186 /* 0x0.d6b026000 */, -0.84094470740 /* 0x0.d74827000 */, -0.84316509971 /* 0x0.d7d9ab006 */, -0.84546715027 /* 0x0.d87089004 */, -0.84781247378 /* 0x0.d90a3d000 */, -0.85004067431 /* 0x0.d99c44007 */, -0.85237431530 /* 0x0.da3534003 */, -0.85468208790 /* 0x0.dacc72000 */, -0.85696077349 /* 0x0.db61c8002 */, -0.85931611062 /* 0x0.dbfc24000 */, -0.86171466122 /* 0x0.dc9955007 */, -0.86397939929 /* 0x0.dd2dc1006 */, -0.86633706098 /* 0x0.ddc844004 */, -0.86868536481 /* 0x0.de622a006 */, -0.87101131681 /* 0x0.defa99002 */, -0.87337517739 /* 0x0.df9584000 */, -0.87576484682 /* 0x0.e03220001 */, -0.87814646969 /* 0x0.e0ce35007 */, -0.88050335648 /* 0x0.e168ab002 */, -0.88291734457 /* 0x0.e206df000 */, -0.88522624975 /* 0x0.e29e30004 */, -0.88768237833 /* 0x0.e33f27003 */, -0.89007008077 /* 0x0.e3dba2001 */, -0.89250904327 /* 0x0.e47b79004 */, -0.89490824949 /* 0x0.e518b5007 */, -0.89735335113 /* 0x0.e5b8f3001 */, -0.89977204799 /* 0x0.e65776000 */, -0.90221023561 /* 0x0.e6f740001 */, -0.90468037137 /* 0x0.e79922006 */, -0.90711551909 /* 0x0.e838b9003 */, -0.90958660844 /* 0x0.e8daab002 */, -0.91205561170 /* 0x0.e97c7a006 */, -0.91451990614 /* 0x0.ea1dfa006 */, -0.91699457179 /* 0x0.eac028007 */, -0.91948717833 /* 0x0.eb6383000 */, -0.92201787240 /* 0x0.ec095d004 */, -0.92446959027 /* 0x0.ecaa0a006 */, -0.92700457577 /* 0x0.ed502c003 */, -0.92946064473 /* 0x0.edf122000 */, -0.93202102187 /* 0x0.ee98ee001 */, -0.93454003345 /* 0x0.ef3e04007 */, -0.93707615143 /* 0x0.efe439004 */, -0.93964391957 /* 0x0.f08c81007 */, -0.94217014323 /* 0x0.f13210007 */, -0.94470518835 /* 0x0.f1d833005 */, -0.94727593667 /* 0x0.f280ad004 */, -0.94985383753 /* 0x0.f3299f002 */, -0.95245110992 /* 0x0.f3d3d6002 */, -0.95500063903 /* 0x0.f47aec004 */, -0.95758175857 /* 0x0.f52414004 */, -0.96018302447 /* 0x0.f5ce8e004 */, -0.96279788024 /* 0x0.f679ec005 */, -0.96541762355 /* 0x0.f7259c002 */, -0.96803289660 /* 0x0.f7d101005 */, -0.97066921004 /* 0x0.f87dc7006 */, -0.97328519823 /* 0x0.f92938001 */, -0.97589331867 /* 0x0.f9d425001 */, -0.97858297827 /* 0x0.fa846a001 */, -0.98121380814 /* 0x0.fb30d4005 */, -0.98389244083 /* 0x0.fbe060002 */, -0.98657202723 /* 0x0.fc8ffc001 */, -0.98919564488 /* 0x0.fd3bed001 */, -0.99194401506 /* 0x0.fdf00b002 */, -0.99460238224 /* 0x0.fe9e43004 */, -0.99728542574 /* 0x0.ff4e19005 */, -1.00000000000 /* 0x1.000000000 */, -1.00271666054 /* 0x1.00b20a003 */, -1.00544095058 /* 0x1.01649400c */, -1.00819313547 /* 0x1.0218f200e */, -1.01089513312 /* 0x1.02ca06007 */, -1.01363527782 /* 0x1.037d9a005 */, -1.01635849497 /* 0x1.04301200e */, -1.01918780808 /* 0x1.04e97e003 */, -1.02182090297 /* 0x1.05960e00a */, -1.02468311789 /* 0x1.0651a2002 */, -1.02744102491 /* 0x1.070660009 */, -1.03019988541 /* 0x1.07bb2e002 */, -1.03300857552 /* 0x1.087340005 */, -1.03580951708 /* 0x1.092ad000b */, -1.03865504271 /* 0x1.09e54c004 */, -1.04145348082 /* 0x1.0a9cb2007 */, -1.04426109801 /* 0x1.0b54b2007 */, -1.04706287389 /* 0x1.0c0c50003 */, -1.04996109020 /* 0x1.