diff --git a/README.md b/README.md index a63a5bd4..46aea7c3 100644 --- a/README.md +++ b/README.md @@ -74,6 +74,7 @@ to get latency instead of reciprocal throughput. When you run ./perf.sh acosf, it does the following: + $ export OPENMP=-fopenmp $ cd src/binary32/acos $ make clean $ make CFLAGS="-O3 -march=native" diff --git a/ci.sh b/ci.sh index 2bdc3fa0..3a780994 100755 --- a/ci.sh +++ b/ci.sh @@ -11,7 +11,7 @@ fi # use the same order as on https://core-math.gitlabpages.inria.fr/ FUNCTIONS_EXHAUSTIVE=(acosf acoshf acospif asinf asinhf asinpif atanf atanhf atanpif cbrtf cosf coshf cospif erff erfcf expf exp10f exp10m1f exp2f exp2m1f expm1f lgammaf logf log10f log10p1f log1pf log2f log2p1f rsqrtf sinf sinhf sinpif tanf tanhf tanpif tgammaf) -FUNCTIONS_WORST=(acos acosh acospi asin asinh asinpi atan atan2 atan2f atan2pi atan2pif atanh atanpi cbrt cos cosh cospi erf erfc exp exp10 exp10m1 exp2 exp2m1 hypot hypotf log log10 log10p1 log1p log2 log2p1 pow powf rsqrt sin sinh sinpi tan tanh tanpi) +FUNCTIONS_WORST=(acos acosh acospi asin asinh asinpi atan atan2 atan2f atan2pi atan2pif atanh atanpi cbrt cos cosh cospi erf erfc exp exp10 exp10m1 exp2 exp2l exp2m1 hypot hypotf log log10 log10p1 log1p log2 log2p1 pow powf rsqrt sin sinh sinpi tan tanh tanpi) FUNCTIONS_SPECIAL=(atan2pif hypotf) echo "Reference commit is $LAST_COMMIT" diff --git a/src/binary32/atan2/Makefile b/src/binary32/atan2/Makefile index 0d4b800d..24dbe39a 100644 --- a/src/binary32/atan2/Makefile +++ b/src/binary32/atan2/Makefile @@ -1,3 +1,14 @@ FUNCTION_UNDER_TEST := atan2f include ../support/Makefile.bivariate + +all:: check_special + +check_special.o: check_special.c + $(CC) $(CFLAGS) $(CORE_MATH_DEFINES) -c -fopenmp -o $@ $< + +check_special: check_special.o $(CORE_MATH_OBJS) $(FUNCTION_UNDER_TEST)_mpfr.o + $(CC) $(LDFLAGS) -fopenmp -o $@ $^ -lmpfr -lm + +clean:: + rm -f check_special diff --git a/src/binary32/atan2/check_special.c b/src/binary32/atan2/check_special.c new file mode 100644 index 00000000..437ede30 --- /dev/null +++ b/src/binary32/atan2/check_special.c @@ -0,0 +1,160 @@ +/* Generate special cases for atan2f testing. + +Copyright (c) 2022-2024 Stéphane Glondu and Paul Zimmermann, Inria. + +This file is part of the CORE-MATH project +(https://core-math.gitlabpages.inria.fr/). + +Permission is hereby granted, free of charge, to any person obtaining a copy +of this software and associated documentation files (the "Software"), to deal +in the Software without restriction, including without limitation the rights +to use, copy, modify, merge, publish, distribute, sublicense, and/or sell +copies of the Software, and to permit persons to whom the Software is +furnished to do so, subject to the following conditions: + +The above copyright notice and this permission notice shall be included in all +copies or substantial portions of the Software. + +THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR +IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY, +FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE +AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER +LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, +OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE +SOFTWARE. +*/ + +#include +#include +#include +#include +#include +#include +#include +#include +#include + +float cr_atan2f (float, float); +void ref_init (void); + +int rnd1[] = { FE_TONEAREST, FE_TOWARDZERO, FE_UPWARD, FE_DOWNWARD }; +int rnd2[] = { MPFR_RNDN, MPFR_RNDZ, MPFR_RNDU, MPFR_RNDD }; + +int rnd = 0; + +int verbose = 0; + +/* reference code using MPFR */ +static float +ref_atan2 (float y, float x, int rnd) +{ + mpfr_t xi, yi; + mpfr_inits2 (24, xi, yi, NULL); + mpfr_set_flt (xi, x, MPFR_RNDN); + mpfr_set_flt (yi, y, MPFR_RNDN); + int inex = mpfr_atan2 (xi, yi, xi, rnd2[rnd]); + mpfr_subnormalize (xi, inex, rnd2[rnd]); + float ret = mpfr_get_flt (xi, MPFR_RNDN); + mpfr_clears (xi, yi, NULL); + return ret; +} + +typedef union { uint32_t n; float x; } union_t; + +static float +asfloat (uint32_t n) +{ + union_t u; + u.n = n; + return u.x; +} + +static void +check (float y, float x) +{ + float z, t; + t = ref_atan2 (y, x, rnd); + z = cr_atan2f (y, x); + if ((isnan (t) && !isnan(z)) || (!isnan (t) && isnan(z)) || + (!isnan (t) && !isnan(z) && z != t)) + { + printf ("FAIL y=%a x=%a ref=%a z=%a\n", y, x, t, z); + exit (1); + } +} + +#define N 1000000000 + +static void +check_random (int i) +{ + long l; + float x, y; + struct drand48_data buffer[1]; + ref_init (); + fesetround (rnd1[rnd]); + srand48_r (i, buffer); + for (int n = 0; n < N; n++) + { + lrand48_r (buffer, &l); + y = asfloat (l); + lrand48_r (buffer, &l); + x = asfloat (l); + check (y, x); + check (y, -x); + check (-y, x); + check (-y, -x); + } +} + +int +main (int argc, char *argv[]) +{ + while (argc >= 2) + { + if (strcmp (argv[1], "--rndn") == 0) + { + rnd = 0; + argc --; + argv ++; + } + else if (strcmp (argv[1], "--rndz") == 0) + { + rnd = 1; + argc --; + argv ++; + } + else if (strcmp (argv[1], "--rndu") == 0) + { + rnd = 2; + argc --; + argv ++; + } + else if (strcmp (argv[1], "--rndd") == 0) + { + rnd = 3; + argc --; + argv ++; + } + else if (strcmp (argv[1], "--verbose") == 0) + { + verbose = 1; + argc --; + argv ++; + } + else + { + fprintf (stderr, "Error, unknown option %s\n", argv[1]); + exit (1); + } + } + + int nthreads; +#pragma omp parallel + nthreads = omp_get_num_threads (); + /* check random values */ +#pragma omp parallel for + for (int i = 0; i < nthreads; i++) + check_random (getpid () + i); + return 0; +} diff --git a/src/binary64/acos/acos.c b/src/binary64/acos/acos.c index 93c97414..59533428 100644 --- a/src/binary64/acos/acos.c +++ b/src/binary64/acos/acos.c @@ -1,6 +1,6 @@ /* Correctly-rounded arc cosine of binary64 value. -Copyright (c) 2021-2022 Paul Zimmermann. +Copyright (c) 2024 Alexei Sibidanov. This file is part of the CORE-MATH project (https://core-math.gitlabpages.inria.fr/). @@ -25,6 +25,7 @@ SOFTWARE. */ #include +#include // Warning: clang also defines __GNUC__ #if defined(__GNUC__) && !defined(__clang__) @@ -33,733 +34,269 @@ SOFTWARE. #pragma STDC FENV_ACCESS ON -/* h + l <- a * b */ -static void -dekker (double *h, double *l, double a, double b) -{ - *h = a * b; -#ifdef __FP_FAST_FMA - *l = __builtin_fma (a, b, -*h); -#else /* use Dekker's algorithm */ -#define MAGIC 0x8000001 - double ah = a * MAGIC, bh = b * MAGIC; - ah = (a - ah) + ah; - bh = (b - bh) + bh; - double al = a - ah; - double bl = b - bh; - *l = (((ah * bh - *h) + ah * bl) + al * bh) + al * bl; -#endif +typedef uint64_t u64; +typedef int64_t i64; +typedef unsigned short ushort; +typedef union {double f; uint64_t u;} b64u64_u; + +static inline double fasttwosum(double x, double y, double *e){ + double s = x + y, z = s - x; + *e = y - z; + return s; } -/* return h=sqrt(x) and l such that h+l approximates sqrt(x) to about - 106 bits of accuracy */ -static double -sqrt_dbl_dbl (double x, double *l) -{ - double h = __builtin_sqrt (x); -#ifdef __FP_FAST_FMA - double e = -__builtin_fma (h, h, -x); -#else - double u, v; - dekker (&u, &v, h, h); - double e = (x - u) - v ; -#endif - /* e = x - h^2 */ - *l = e / (h + h); - return h; +static inline double twosum(double xh, double ch, double *l){ + double s = xh + ch, d = s - xh; + *l = (ch - d) + (xh + (d - s)); + return s; } -/* s + t <- a + b, assuming |a| >= |b| */ -static void -fast_two_sum (double *s, double *t, double a, double b) -{ - *s = a + b; - double e = *s - a; - *t = b - e; +static inline double fastsum(double xh, double xl, double yh, double yl, double *e){ + double sl, sh = fasttwosum(xh, yh, &sl); + *e = (xl + yl) + sl; + return sh; } -/* h_out + l_out = (h_in + l_in) * y */ -static void -mul2_1 (double *h_out, double *l_out, double h_in, double l_in, double y) -{ - dekker (h_out, l_out, h_in, y); - *l_out += l_in * y; +static inline double fasttwosub(double x, double y, double *e){ + double s = x - y; + *e = (x - s) - y; + return s; } -/* The following table was generated with - Gen_P_aux(6,256,threshold=192,verbose=true,extra0=12,extra1=3,k1=192) - for the first part (0 <= i < 192), and for the second part (192 <= i < 256) - with - Gen_P_aux(5,256,threshold=192,verbose=true,extra0=12,extra1=3,k0=192) - For 0 <= i < 192, each entry contains 8 coefficients corresponding to - a degree-6 polynomial and its evaluation point: - * T[i][0] is p[0] (the upper 12 bits of the low part are zero) - * T[i][1] is p[1] (the upper 3 bits of the low part are zero) - * T[i][2] is p[2] - * T[i][3] is p[3] - * T[i][4] is p[4] - * T[i][5] is p[5] - * T[i][6] is p[6] - * T[i][7] is the evaluation point (xmid). - For 192 <= i < 256, each entry contains 7 coefficients corresponding to - a degree-5 polynomial and its evaluation point: - * T[i][0] is p[0] - * T[i][1] is p[1] - * T[i][2] is p[2] - * T[i][3] is p[3] - * T[i][4] is p[4] - * T[i][5] is p[5] - * T[i][6] is the evaluation point (xmid). -*/ -static const double T[256][8] = { - { 0x1.921fb54442d18p+0, /*0x4.6989e4b05fa3p-56,*/ -0x1p+0, -0xe.3605b41a5d07p-52, -0x2.aaaaaaaa26314p-4, -0x1.d02e84f046fbp-28, -0x1.3330337ffdfc1p-4, -0x2.5ca13405c66b6p-12, 0x0p+0 }, /* i=0 73.489 */ - { 0x1.909fb4b44253fp+0, -0x1.00012001e6037p+0, -0xc.00288071475c8p-12, -0x2.aac5ab293276cp-4, -0x9.005461cb2ecep-12, -0x1.3355447aa843dp-4, -0x7.809a8297c2bbcp-12, 0x1.7fffffffebc6fp-8 }, /* i=1 74.13 */ - { 0x1.8f9fb2a990bfbp+0, -0x1.0003200ea64c8p+0, -0x1.400bb85b9a23fp-8, -0x2.aaf5ae7b579bep-4, -0xf.0186b75746918p-12, -0x1.33914cbc551f1p-4, -0xc.8295e5760bb98p-12, 0x2.80000000140e4p-8 }, /* i=2 74.124 */ - { 0x1.8e9fae1ec5e86p+0, -0x1.00062038483f3p+0, -0x1.c02029ec97416p-8, -0x2.ab3db95355f9p-4, -0x1.504305dafd9f7p-8, -0x1.33eb677d14e3dp-4, -0x1.186edf2c1538bp-8, 0x3.800000002e7b8p-8 }, /* i=3 74.117 */ - { 0x1.8d9fa613b89eap+0, -0x1.000a2099d022ap+0, -0x2.40445ec276a82p-8, -0x2.ab9dd2bb5d952p-4, -0x1.b08e7d9b5ed11p-8, -0x1.3463a5fffc8c4p-4, -0x1.68eb18bc28196p-8, 0x4.7fffffffc6fbcp-8 }, /* i=4 74.108 */ - { 0x1.8c9f99881e5bcp+0, -0x1.000f215747cefp+0, -0x2.c07cda70f2514p-8, -0x2.ac16041872d36p-4, -0x2.1104415368d9p-8, -0x1.34fa1f513523fp-4, -0x1.b9aa6a457192fp-8, 0x5.8000000039eep-8 }, /* i=5 74.099 */ - { 0x1.8b9f877b8725bp+0, -0x1.0015229dc21c5p+0, -0x3.40ce2285cdfe2p-8, -0x2.aca6592c394f6p-4, -0x2.71adc7b80261cp-8, -0x1.35aef04dfe9d2p-4, -0x2.0ac0bc5ec1148p-8, 0x6.7fffffffc9304p-8 }, /* i=6 74.09 */ - { 0x1.8a9f6eed4e15fp+0, -0x1.001c24a35f6c6p+0, -0x3.c13cbefda1e8ap-8, -0x2.ad4ee01738444p-4, -0x2.d29491715f22cp-8, -0x1.36823bad3f08bp-4, -0x2.5c3a32c94c508p-8, 0x7.8000000009a98p-8 }, /* i=7 74.078 */ - { 0x1.899f4edc9635ap+0, -0x1.002427a752d4cp+0, -0x4.41cd3ab2eccd8p-8, -0x2.ae0fa95b8dcp-4, -0x3.33c22ae8a1b92p-8, -0x1.37742a0b7a1e4p-4, -0x2.ae29dc08ce6d2p-8, 0x8.7ffffffff7918p-8 }, /* i=8 74.064 */ - { 0x1.889f26483e1ecp+0, -0x1.002d2bf1e8623p+0, -0x4.c28423d24ffe8p-8, -0x2.aee8c7e01c9eep-4, -0x3.95402e27b217cp-8, -0x1.3884e9f63c6e9p-4, -0x3.009d1698267ecp-8, 0x9.7fffffff3f388p-8 }, /* i=9 74.049 */ - { 0x1.879ef42ed5a5bp+0, -0x1.003731d48c3fap+0, -0x5.43660c4e68278p-8, -0x2.afda50f431414p-4, -0x3.f71844b60aeb4p-8, -0x1.39b4affcb63bp-4, -0x3.539f5bba69818p-8, 0xa.7fffffff76be8p-8 }, /* i=10 74.036 */ - { 0x1.869eb78e991c6p+0, -0x1.004239a9d28aep+0, -0x5.c4778a518ae48p-8, -0x2.b0e45c5398ecep-4, -0x4.5954297214a34p-8, -0x1.3b03b6be3ce92p-4, -0x3.a74d8446ef28ap-8, 0xb.7fffffffb7a98p-8 }, /* i=11 74.021 */ - { 0x1.859e6f6564ab3p+0, -0x1.004e43d5805a6p+0, -0x6.45bd38b44adbcp-8, -0x2.b207042b3956cp-4, -0x4.bbfdaa8ac5514p-8, -0x1.3c723f003ff56p-4, -0x3.fbae296f78cd8p-8, 0xc.800000001912p-8 }, /* i=12 74.004 */ - { 0x1.849e1ab0aca76p+0, -0x1.005b50c4957e2p+0, -0x6.c73bb7725c3f8p-8, -0x2.b342651e1e994p-4, -0x5.1f1eab5ff321cp-8, -0x1.3e008fbf7c925p-4, -0x4.50d3670de1bep-8, 0xd.8000000023c4p-8 }, /* i=13 73.987 */ - { 0x1.839db86d7338ep+0, -0x1.006960ed574a5p+0, -0x7.48f7ac21cd944p-8, -0x2.b4969e4b085ecp-4, -0x5.82c1267cb2a44p-8, -0x1.3faef648f515ap-4, -0x4.a6cf5d1c9e298p-8, 0xe.7fffffffec158p-8 }, /* i=14 73.969 */ - { 0x1.829d47983f084p+0, -0x1.007874cf5c462p+0, -0x7.caf5c26acc3e4p-8, -0x2.b603d152745a8p-4, -0x5.e6ef2f93f1878p-8, -0x1.417dc652943adp-4, -0x4.fdb49ecb2ee9cp-8, 0xf.80000000188fp-8 }, /* i=15 73.947 */ - { 0x1.819cc72d142dbp+0, -0x1.00888cf398a56p+0, -0x8.4d3aac7f6b99p-8, -0x2.b78a225d25584p-4, -0x6.4bb2f588a1cdp-8, -0x1.436d5a16421b5p-4, -0x5.558bce13bdd5p-8, 0x1.07fffffff9c8fp-4 }, /* i=16 73.926 */ - { 0x1.809c3627667cep+0, -0x1.0099a9ec6c1b3p+0, -0x8.cfcb2398098bp-8, -0x2.b929b82336418p-4, -0x6.b116c470aedb4p-8, -0x1.457e126dfa8e5p-4, -0x5.ae725e241fdap-8, 0x1.18000000005e6p-4 }, /* i=17 73.901 */ - { 0x1.7f9b938215cf2p+0, -0x1.00abcc55b001dp+0, -0x9.52abe86bf7968p-8, -0x2.bae2bbf3a27ep-4, -0x7.172507b730604p-8, -0x1.47b056f437d6ep-4, -0x6.08797fdf25adp-8, 0x1.27fffffffc329p-4 }, /* i=18 73.881 */ - { 0x1.7e9ade375e48ep+0, -0x1.00bef4d4c742ap+0, -0x9.d5e1c3b1b0b2p-8, -0x2.bcb559bc684d8p-4, -0x7.7de84c3c1cbd8p-8, -0x1.4a049625c398ep-4, -0x6.63b04475fb8dcp-8, 0x1.3800000005926p-4 }, /* i=19 73.859 */ - { 0x1.7d9a1540d593ap+0, -0x1.00d32418ae534p+0, -0xa.59718699fe43p-8, -0x2.bea1c0131ee6ep-4, -0x7.e56b427ac8b98p-8, -0x1.4c7b4585fc60fp-4, -0x6.c02b232597bc8p-8, 0x1.47fffffff9be3p-4 }, /* i=20 73.839 */ - { 0x1.7c99379758aa9p+0, -0x1.00e85ada0d548p+0, -0xa.dd600b54a1fe8p-8, -0x2.c0a8203e34c9cp-4, -0x8.4db8c0c794ac8p-8, -0x1.4f14e1c4ac981p-4, -0x7.1dfe2bcaa789p-8, 0x1.580000000393cp-4 }, /* i=21 73.813 */ - { 0x1.7b9844330bddep+0, -0x1.00fe99db49c9ap+0, -0xb.61b2358d6977p-8, -0x2.c2c8ae3e9b126p-4, -0x8.b6dbc5930227p-8, -0x1.51d1eee6a4e68p-4, -0x7.7d366b13065a8p-8, 0x1.68000000008bep-4 }, /* i=22 73.788 */ - { 0x1.7a973a0b48f84p+0, -0x1.0115e1e89abf8p+0, -0xb.e66cf2f442008p-8, -0x2.c503a0da260bap-4, -0x9.20df79b5bba78p-8, -0x1.54b2f873a0e64p-4, -0x7.ddefcbc5733acp-8, 0x1.7800000001812p-4 }, /* i=23 73.758 */ - { 0x1.79961816995f6p+0, -0x1.012e33d81d053p+0, -0xc.6b953bc11a3a8p-8, -0x2.c75931a66c2d6p-4, -0x9.8bcf32dc703b8p-8, -0x1.57b891a2a8474p-4, -0x8.4032bdd1257dp-8, 0x1.880000000b248p-4 }, /* i=24 73.731 */ - { 0x1.7894dd4aad755p+0, -0x1.01479089e89e7p+0, -0xc.f130133b373a8p-8, -0x2.c9c99d1443048p-4, -0x9.f7b675dfcd44p-8, -0x1.5ae3558a8e26bp-4, -0x8.a42ad40c037ap-8, 0x1.9800000000ff4p-4 }, /* i=25 73.705 */ - { 0x1.7793889c4dcbdp+0, -0x1.0161f8e827e39p+0, -0xd.77428845eb048p-8, -0x2.cc55227be899p-4, -0xa.64a0f962883a8p-8, -0x1.5e33e75926448p-4, -0x9.09dcfb7973f4p-8, 0x1.a7fffffff17b3p-4 }, /* i=26 73.674 */ - { 0x1.769218ff52aeap+0, -0x1.017d6de72f22bp+0, -0xd.fdd1b5ec4de8p-8, -0x2.cefc0429c02fp-4, -0xa.d29aa84b1257p-8, -0x1.61aaf285d96ecp-4, -0x9.715ac9d491178p-8, 0x1.b7fffffffb717p-4 }, /* i=27 73.643 */ - { 0x1.75908d669e9ecp+0, -0x1.0199f08594facp+0, -0xe.84e2c3edcf2cp-8, -0x2.d1be876bab71ap-4, -0xb.41afa45e93158p-8, -0x1.65492b0f68076p-4, -0x9.dacb9f52cbd58p-8, 0x1.c800000003818p-4 }, /* i=28 73.613 */ - { 0x1.748ee4c40f636p+0, -0x1.01b781cc4cd07p+0, -0xf.0c7ae75234ebp-8, -0x2.d49cf49f2623cp-4, -0xb.b1ec490698e68p-8, -0x1.690f4db6cd4p-4, -0xa.4643cb605d618p-8, 0x1.d7fffffffdaabp-4 }, /* i=29 73.586 */ - { 0x1.738d1e087244bp+0, -0x1.01d622cec2209p+0, -0xf.949f62fea16e8p-8, -0x2.d79797400a2c6p-4, -0xc.235d2e10a8bap-8, -0x1.6cfe2040ea4a9p-4, -0xa.b3d85c425f238p-8, 0x1.e800000002cdp-4 }, /* i=30 73.547 */ - { 0x1.728b38237fc97p+0, -0x1.01f5d4aaf412dp+0, -0x1.01d55884965c6p-4, -0x2.daaebdf7f10cp-4, -0xc.960f2a874efcp-8, -0x1.711671b94ba69p-4, -0xb.239e9f0c1c8b8p-8, 0x1.f7ffffffed1edp-4 }, /* i=31 73.511 */ - { 0x1.71893203c6f8fp+0, -0x1.0216988994331p+0, -0x1.0a6a2b7997277p-4, -0x2.dde2baae7fb84p-4, -0xd.0a0f57a961478p-8, -0x1.75591abb938bbp-4, -0xb.95a8b052283d8p-8, 0x2.07fffffff8b82p-4 }, /* i=32 73.485 */ - { 0x1.70870a96adc0dp+0, -0x1.02386f9e23cdp+0, -0x1.1308c60fda193p-4, -0x2.e133e29a31444p-4, -0xd.7f6b13df54cbp-8, -0x1.79c6fdbcfdd48p-4, -0xc.0a285b98d4f48p-8, 0x2.1800000012728p-4 }, /* i=33 73.451 */ - { 0x1.6f84c0c86028fp+0, -0x1.025b5b271497p+0, -0x1.1bb1804d0488ep-4, -0x2.e4a28e521a2f2p-4, -0xd.f63005f9011ep-8, -0x1.7e61075b239fp-4, -0xc.812ccfb30e728p-8, 0x2.2800000035fc4p-4 }, /* i=34 73.411 */ - { 0x1.6e825383cd1afp+0, -0x1.027f5c6de8d69p+0, -0x1.2464b3456dc13p-4, -0x2.e82f19e049f4ep-4, -0xe.6e6c2055b0758p-8, -0x1.83282eb1ebe64p-4, -0xc.fac5acd3a4c8p-8, 0x2.37fffffff27dep-4 }, /* i=35 73.377 */ - { 0x1.6d7fc1b280c44p+0, -0x1.02a474c7599bp+0, -0x1.2d22b9277965ep-4, -0x2.ebd9e4d577614p-4, -0xe.e82da4310dacp-8, -0x1.881d75af61cedp-4, -0xd.773458d78cfc8p-8, 0x2.480000000e48p-4 }, /* i=36 73.334 */ - { 0x1.6c7d0a3cc04edp+0, -0x1.02caa59375263p+0, -0x1.35ebed44f8951p-4, -0x2.efa3525c9ebc2p-4, -0xf.6383253880d1p-8, -0x1.8d41e972e5acp-4, -0xd.f6634e8b35108p-8, 0x2.580000001cc4cp-4 }, /* i=37 73.302 */ - { 0x1.6b7a2c0965d62p+0, -0x1.02f1f03dc7808p+0, -0x1.3ec0ac1eecacp-4, -0x2.f38bc9505e116p-4, -0xf.e07b8cdad4bb8p-8, -0x1.9296a2aab38d5p-4, -0xe.789cd4b1e4b7p-8, 0x2.6800000004e6p-4 }, /* i=38 73.264 */ - { 0x1.6a7725fdd5bc9p+0, -0x1.031a563d81032p+0, -0x1.47a15370afc09p-4, -0x2.f793b450e2d7ep-4, -0x1.05f261e2d7b9fp-4, -0x1.981cc5fa65a18p-4, -0xe.fdfddd3bfefbp-8, 0x2.77fffffff2bbep-4 }, /* i=39 73.227 */ - { 0x1.6973f6fdf680fp+0, -0x1.0343d9159dd8dp+0, -0x1.508e423b48b34p-4, -0x2.fbbb81dabb2f4p-4, -0x1.0df9279aafcc4p-4, -0x1.9dd58465923cp-4, -0xf.8696701d4ec38p-8, 0x2.880000001f244p-4 }, /* i=40 73.184 */ - { 0x1.68709dec32aa8p+0, -0x1.036e7a550d25cp+0, -0x1.5987d8d0a96fep-4, -0x3.0003a45e70268p-4, -0x1.161d0a111844cp-4, -0x1.a3c21bbece4cdp-4, -0x1.012818df20cc4p-4, 0x2.97fffffff5e62p-4 }, /* i=41 73.151 */ - { 0x1.676d19a94e1bcp+0, -0x1.039a3b96e0e74p+0, -0x1.628e78e0bf137p-4, -0x3.046c9259d9ff4p-4, -0x1.1e5f0fb7dd5ddp-4, -0x1.a9e3d71bc4af6p-4, -0x1.0a1f6dd2593c5p-4, 0x2.a7fffffff9bb2p-4 }, /* i=42 73.105 */ - { 0x1.666969147661cp+0, -0x1.03c71e8275c5fp+0, -0x1.6ba28584c398ep-4, -0x3.08f6c67188262p-4, -0x1.26c0459a58df2p-4, -0x1.b03c0f5207f82p-4, -0x1.135226a841bfcp-4, 0x2.b800000001b18p-4 }, /* i=43 73.071 */ - { 0x1.65658b0b297aep+0, -0x1.03f524cba3263p+0, -0x1.74c4634c4bf68p-4, -0x3.0da2bf8be7a8p-4, -0x1.2f41bfa442c8ep-4, -0x1.b6cc2b758d196p-4, -0x1.1cc12f7dd6dbcp-4, 0x2.c800000003fd4p-4 }, /* i=44 73.023 */ - { 0x1.64617e692a3p+0, -0x1.04245032ea9fp+0, -0x1.7df4784a2f89bp-4, -0x3.127100ed4e5f4p-4, -0x1.37e498e85441ep-4, -0x1.bd95a160f6a9dp-4, -0x1.26704ce77d56bp-4, 0x2.d800000007654p-4 }, /* i=45 72.984 */ - { 0x1.635d420875812p+0, -0x1.0454a285a8d14p+0, -0x1.87332c21b99f1p-4, -0x3.1762125526c3ap-4, -0x1.40a9f3eceb242p-4, -0x1.c499f6433ff6p-4, -0x1.30627a5c5d56cp-4, 0x2.e800000000d74p-4 }, /* i=46 72.936 */ - { 0x1.6258d4c132bacp+0, -0x1.04861d9e48dbdp+0, -0x1.9080e81462ee2p-4, -0x3.1c76801c66a64p-4, -0x1.4992fafb1c3e8p-4, -0x1.cbdabf336ef02p-4, -0x1.3a97b45c4c021p-4, 0x2.f80000000207p-4 }, /* i=47 72.903 */ - { 0x1.61543569aaa93p+0, -0x1.04b8c364782cep+0, -0x1.99de170fa5909p-4, -0x3.21aedb55207dap-4, -0x1.52a0e06c1e2d6p-4, -0x1.d359a1cdc2e3ap-4, -0x1.4515a21e5983cp-4, 0x3.07fffffff4dbep-4 }, /* i=48 72.859 */ - { 0x1.604f62d634e06p+0, -0x1.04ec95cd5deeep+0, -0x1.a34b25bb8a91fp-4, -0x3.270bb9eb8f572p-4, -0x1.5bd4df01d79e5p-4, -0x1.db1854d5fd617p-4, -0x1.4fdd284dce08ap-4, 0x3.17ffffffef9f6p-4 }, /* i=49 72.808 */ - { 0x1.5f4a5bd92e0a3p+0, -0x1.052196dbd285ap+0, -0x1.acc8828947cc5p-4, -0x3.2c8db6c84bc88p-4, -0x1.65303a3a304dbp-4, -0x1.e318a0e3e743ep-4, -0x1.5af453ba13ccdp-4, 0x3.27fffffff7d2ap-4 }, /* i=50 72.764 */ - { 0x1.5e451f42e9f7cp+0, -0x1.0557c8a099a78p+0, -0x1.b6569dc26b1efp-4, -0x3.323571f3f8c7cp-4, -0x1.6eb43eae7c501p-4, -0x1.eb5c6115dd46ap-4, -0x1.665b1206461b2p-4, 0x3.38000000043a4p-4 }, /* i=51 72.718 */ - { 0x1.5d3fabe1a56dep+0, -0x1.058f2d3a9e659p+0, -0x1.bff5e99873377p-4, -0x3.380390bc636fp-4, -0x1.7862426dfbd5p-4, -0x1.f3e583cf00be9p-4, -0x1.721512657c562p-4, 0x3.47ffffffff82ap-4 }, /* i=52 72.682 */ - { 0x1.5c3a0081755adp+0, -0x1.05c7c6d731b24p+0, -0x1.c9a6da34f05bep-4, -0x3.3df8bddb32204p-4, -0x1.823ba560faea5p-4, -0x1.fcb60b7cd79eep-4, -0x1.7e27d5c87e887p-4, 0x3.57ffffffefa82p-4 }, /* i=53 72.629 */ - { 0x1.5b341bec33a5bp+0, -0x1.060197b24b7cap+0, -0x1.d369e5ca30f48p-4, -0x3.4415a99e33bdap-4, -0x1.8c41d1b19e43p-4, -0x2.05d00f66cf7e6p-4, -0x1.8a94b92c5f705p-4, 0x3.680000003ed6cp-4 }, /* i=54 72.587 */ - { 0x1.5a2dfce98c38p+0, -0x1.063ca216c6ap+0, -0x1.dd3f84a331e7ep-4, -0x3.4a5b0a108adfp-4, -0x1.96763c3284854p-4, -0x2.0f35bc883f4e6p-4, -0x1.975f97a8dedd6p-4, 0x3.78000000088f8p-4 }, /* i=55 72.535 */ - { 0x1.5927a23ebd7cdp+0, -0x1.0678e85eafecdp+0, -0x1.e7283136e849ep-4, -0x3.50c99b27567b8p-4, -0x1.a0da64cf7b789p-4, -0x2.18e956757d6bap-4, -0x1.a48e869e2cc49p-4, 0x3.880000000f778p-4 }, /* i=56 72.494 */ - { 0x1.58210aaebb6d3p+0, -0x1.06b66cf38158dp+0, -0x1.f12468385dc26p-4, -0x3.57621eedc7cf2p-4, -0x1.ab6fd7015f33ap-4, -0x2.22ed384ca44fap-4, -0x1.b2239b0d502c5p-4, 0x3.97ffffffaa52ap-4 }, /* i=57 72.448 */ - { 0x1.571a34f9eb46ap+0, -0x1.06f5324e76f25p+0, -0x1.fb34a8ab3949bp-4, -0x3.5e255db58f592p-4, -0x1.b6382a459425bp-4, -0x2.2d43d5b1b6e88p-4, -0x1.c023bcb6ff9fbp-4, 0x3.a7fffffffa8c2p-4 }, /* i=58 72.395 */ - { 0x1.56131fde742b5p+0, -0x1.07353af8c2f65p+0, -0x2.055973f327a5ap-4, -0x3.651426456badap-4, -0x1.c1350299056c3p-4, -0x2.37efbbd4d44a8p-4, -0x1.ce923cdd7680ap-4, 0x3.b7fffffe0c4c6p-4 }, /* i=59 72.349 */ - { 0x1.550bca175781dp+0, -0x1.0776898c0fbffp+0, -0x2.0f934defd9c5p-4, -0x3.6c2f4e11dea6p-4, -0x1.cc681101b077fp-4, -0x2.42f39290a4488p-4, -0x1.dd759c6cb4961p-4, 0x3.c7fffffff10b2p-4 }, /* i=60 72.289 */ - { 0x1.5404325db6048p+0, -0x1.07b920b27c2f3p+0, -0x2.19e2bd041e3f4p-4, -0x3.7377b1693990ep-4, -0x1.d7d3140bbb35p-4, -0x2.4e521d80d6a76p-4, -0x1.eccf208ae3d17p-4, 0x3.d7fffffffba76p-4 }, /* i=61 72.251 */ - { 0x1.52fc576782753p+0, -0x1.07fd03273bf8ap+0, -0x2.24484a370e876p-4, -0x3.7aee33b3555d8p-4, -0x1.e377d85f7b4dp-4, -0x2.5a0e3d41785p-4, -0x1.fca7b6a10ee9p-4, 0x3.e7fffffffdee6p-4 }, /* i=62 72.194 */ - { 0x1.51f437e808d47p+0, -0x1.084233b6c7882p+0, -0x2.2ec48143c2d8ep-4, -0x3.8293bfa711b9cp-4, -0x1.ef583954ae3fep-4, -0x2.662af0abb66d8p-4, -0x2.0d0210b36ce7cp-4, 0x3.f800000005bbcp-4 }, /* i=63 72.143 */ - { 0x1.50ebd28fc514dp+0, -0x1.0888b53f39c35p+0, -0x2.3957f0b08508cp-4, -0x3.8a694786de49p-4, -0x1.fb76218aae08cp-4, -0x2.72ab5629f9c36p-4, -0x2.1de2c67cff35p-4, 0x4.07ffffffd041cp-4 }, /* i=64 72.101 */ - { 0x1.4fe3260c3d6b5p+0, -0x1.08d08ab0b0357p+0, -0x2.440329e69c616p-4, -0x3.926fc55fb45bep-4, -0x2.07d38b8a38954p-4, -0x2.7f92ad1c173dap-4, -0x2.2f515f4ba4222p-4, 0x4.17fffffffdc94p-4 }, /* i=65 72.042 */ - { 0x1.4eda3108130a3p+0, -0x1.0919b70d9f765p+0, -0x2.4ec6c148a62b8p-4, -0x3.9aa83b49014a4p-4, -0x2.1472826cf4f2cp-4, -0x2.8ce4574be423cp-4, -0x2.41568bd3e2aeap-4, 0x4.27fffffff5254p-4 }, /* i=66 71.987 */ - { 0x1.4dd0f22acc672p+0, -0x1.09643d6b3d714p+0, -0x2.59a34e4c85964p-4, -0x3.a313b3a95b46cp-4, -0x2.21552293e187ep-4, -0x2.9aa3da7bddc58p-4, -0x2.53f008869a3b6p-4, 0x4.38000000044bp-4 }, /* i=67 71.939 */ - { 0x1.4cc76818d8ee5p+0, -0x1.09b020f1df239p+0, -0x2.64996b93cee0cp-4, -0x3.abb3417c46418p-4, -0x2.2e7d9a52c7d62p-4, -0x2.a8d4e1ff53b7cp-4, -0x2.672ca7adf46c4p-4, 0x4.4800000002238p-4 }, /* i=68 71.893 */ - { 0x1.4bbd917370a87p+0, -0x1.09fd64dd635e9p+0, -0x2.6fa9b7067c38p-4, -0x3.b488009c01be6p-4, -0x2.3bee2abce5f48p-4, -0x2.b77b4072d6b0ap-4, -0x2.7b0eb38661e62p-4, 0x4.5800000017b98p-4 }, /* i=69 71.839 */ - { 0x1.4ab36cd88d8ebp+0, -0x1.0a4c0c7d99782p+0, -0x2.7ad4d1ed70ae2p-4, -0x3.bd93160d91cccp-4, -0x2.49a92865b8ac6p-4, -0x2.c69af183b9498p-4, -0x2.8f9e4924ebb48p-4, 0x4.67fffffff6c3cp-4 }, /* i=70 71.784 */ - { 0x1.49a8f8e2c6ba4p+0, -0x1.0a9c1b36b409cp+0, -0x2.861b610f21aa6p-4, -0x3.c6d5b050f98a8p-4, -0x2.57b0fc35fad62p-4, -0x2.d6381bd45aa62p-4, -0x2.a4e40fc475512p-4, 0x4.77ffffffda2ccp-4 }, /* i=71 71.733 */ - { 0x1.489e342943062p+0, -0x1.0aed9481b8618p+0, -0x2.917e0ccc376d6p-4, -0x3.d05107b409152p-4, -0x2.66082448af0dep-4, -0x2.e65712f8d46a4p-4, -0x2.bae5089c6da46p-4, 0x4.8800000016538p-4 }, /* i=72 71.68 */ - { 0x1.47931d3fb83abp+0, -0x1.0b407beced595p+0, -0x2.9cfd813c98424p-4, -0x3.da065ea82bb82p-4, -0x2.74b134ccaa99p-4, -0x2.f6fc598a01988p-4, -0x2.d1aa90e84261p-4, 0x4.97ffffffe300cp-4 }, /* i=73 71.626 */ - { 0x1.4687b2b62a177p+0, -0x1.0b94d51c619ddp+0, -0x2.a89a6e5037e5ep-4, -0x3.e3f7021e2dcc8p-4, -0x2.83aed8fa03c04p-4, -0x3.082ca35eb837ep-4, -0x2.e93c3caa9a7bep-4, 0x4.a7fffffff63a4p-4 }, /* i=74 71.572 */ - { 0x1.457bf318fe923p+0, -0x1.0beaa3ca5b872p+0, -0x2.b45587ed4f60ap-4, -0x3.ee2449e2c79e2p-4, -0x2.9303d409fa8cp-4, -0x3.19ecd7d7941bcp-4, -0x3.01a40a66a664ap-4, 0x4.b7fffffffc21cp-4 }, /* i=75 71.516 */ - { 0x1.446fdcf0ce1e2p+0, -0x1.0c41ebc7e1e01p+0, -0x2.c02f86129b0b2p-4, -0x3.f88f99019fd1cp-4, -0x2.a2b30241d09fcp-4, -0x3.2c4214554864cp-4, -0x3.1aea47ad70d62p-4, 0x4.c800000019e58p-4 }, /* i=76 71.456 */ - { 0x1.43636ec2c3571p+0, -0x1.0c9ab0fd19b47p+0, -0x2.cc2924f4615f8p-4, -0x4.033a5e26dea2cp-4, -0x2.b2bf59fe3500cp-4, -0x3.3f31aec103b98p-4, -0x3.351a0aa633ab2p-4, 0x4.d7fffff9db5ecp-4 }, /* i=77 71.403 */ - { 0x1.4256a70e6ccc2p+0, -0x1.0cf4f76a81efdp+0, -0x2.d8432537f523p-4, -0x4.0e26141f60588p-4, -0x2.c32becf6c0daap-4, -0x3.52c1386b0d8e8p-4, -0x3.503d2946e793cp-4, 0x4.e80000000cdfp-4 }, /* i=78 71.35 */ - { 0x1.41498451c1bcep+0, -0x1.0d50c3282299fp+0, -0x2.e47e4be95cdaap-4, -0x4.1954421dc75ep-4, -0x2.d3fbe92dd691ap-4, -0x3.66f6809e24286p-4, -0x3.6c5c4e3a6b944p-4, 0x4.f800000004578p-4 }, /* i=79 71.295 */ - { 0x1.403c0504d76d7p+0, -0x1.0dae186785edcp+0, -0x2.f0db62d1a7cf6p-4, -0x4.24c67c59ee7fp-4, -0x2.e5329a6dfb784p-4, -0x3.7bd797ed2f294p-4, -0x3.8983b00daadap-4, 0x5.0800000199e7p-4 }, /* i=80 71.237 */ - { 0x1.3f2e279c592fep+0, -0x1.0e0cfb7372c78p+0, -0x2.fd5b3880dbc82p-4, -0x4.307e646f7075cp-4, -0x2.f6d36b70aea06p-4, -0x3.916ad33981b3p-4, -0x3.a7bfa906ae634p-4, 0x5.18000000095dp-4 }, /* i=81 71.18 */ - { 0x1.3e1fea87ffd4ap+0, -0x1.0e6d70b107882p+0, -0x3.09fea087bb348p-4, -0x4.3c7da9ebc1628p-4, -0x3.08e1e754819e2p-4, -0x3.a7b6cf29245aep-4, -0x3.c71ae566ea698p-4, 0x5.27ffffffbb014p-4 }, /* i=82 71.12 */ - { 0x1.3d114c3369c94p+0, -0x1.0ecf7ca00785cp+0, -0x3.16c6739722a12p-4, -0x4.48c60ac810ffcp-4, -0x3.1b61bafa35122p-4, -0x3.bec273a26fc8cp-4, -0x3.e7a51f6231fc4p-4, 0x5.37ffffffde72cp-4 }, /* i=83 71.063 */ - { 0x1.3c024b05a180cp+0, -0x1.0f3323dba2f4p+0, -0x3.23b38fb078f7cp-4, -0x4.555953f76ddb8p-4, -0x3.2e56b69126ce8p-4, -0x3.d694f7923f352p-4, -0x4.09676021c0728p-4, 0x5.48000000074fp-4 }, /* i=84 71.002 */ - { 0x1.3af2e56101fd3p+0, -0x1.0f986b1b23d44p+0, -0x3.30c6d853735b2p-4, -0x4.623961f71a398p-4, -0x3.41c4cf2554448p-4, -0x3.ef35e4e719dd8p-4, -0x4.2c755ddc14358p-4, 0x5.580000002823p-4 }, /* i=85 70.946 */ - { 0x1.39e319a321df4p+0, -0x1.0fff57329df85p+0, -0x3.3e0136ad3956cp-4, -0x4.6f68216502c48p-4, -0x3.55b02050f76bcp-4, -0x4.08ad1cbded514p-4, -0x4.50d7be5b90d38p-4, 0x5.6800000020cc8p-4 }, /* i=86 70.882 */ - { 0x1.38d2e624afd24p+0, -0x1.1067ed13aa36ap+0, -0x3.4b6399ca02406p-4, -0x4.7ce78f9dac06cp-4, -0x3.6a1cedf19bb68p-4, -0x4.2302dbd1f71a4p-4, -0x4.76a5abb44b40cp-4, 0x5.780000001f4ap-4 }, /* i=87 70.825 */ - { 0x1.37c249396449fp+0, -0x1.10d231ce1f749p+0, -0x3.58eef6c7812ccp-4, -0x4.8ab9bb6032258p-4, -0x3.7f0fa6082268cp-4, -0x4.3e3fbf2c6f53cp-4, -0x4.9de849b57e75cp-4, 0x5.87ffffffb490cp-4 }, /* i=88 70.768 */ - { 0x1.36b1412fbd2e5p+0, -0x1.113e2a90e6ebp+0, -0x3.66a4490beec4ap-4, -0x4.98e0c57c7f44cp-4, -0x3.948ce29f00208p-4, -0x4.5a6cc917739bcp-4, -0x4.c6b4a74d0d5b8p-4, 0x5.980000000ab1p-4 }, /* i=89 70.708 */ - { 0x1.359fcc5120892p+0, -0x1.11abdcaaae8afp+0, -0x3.74849279f721ap-4, -0x4.a75ee1841ea28p-4, -0x3.aa996bd2b0cep-4, -0x4.7793665d69794p-4, -0x4.f11c144b80da8p-4, 0x5.a80000000449p-4 }, /* i=90 70.646 */ - { 0x1.348de8e17d2d3p+0, -0x1.121b4d8ad51a5p+0, -0x3.8290dbad43868p-4, -0x4.b6365689ff39p-4, -0x3.c13a39f68ae66p-4, -0x4.95bd73d66e9bcp-4, -0x5.1d31e9d0c6914p-4, 0x5.b7fffffff01b4p-4 }, /* i=91 70.583 */ - { 0x1.337b951f42c49p+0, -0x1.128c82c23b213p+0, -0x3.90ca3434e2096p-4, -0x4.c5697fe6799bcp-4, -0x3.d87477d1965b6p-4, -0x4.b4f544487ed5p-4, -0x5.4b0bb3e448ef8p-4, 0x5.c80000000f398p-4 }, /* i=92 70.523 */ - { 0x1.3268cf4349b4ep+0, -0x1.12ff82042105cp+0, -0x3.9f31b2d0c403p-4, -0x4.d4face053f2ap-4, -0x3.f04d84fce06d2p-4, -0x4.d545a6a06977cp-4, -0x5.7abbe7f3fbe74p-4, 0x5.d8000000028f8p-4 }, /* i=93 70.461 */ - { 0x1.3155958099f49p+0, -0x1.137451271a74fp+0, -0x3.adc875b3644dep-4, -0x4.e4ecc73ecb938p-4, -0x4.08caf85f4a00cp-4, -0x4.f6b9ec8e92fd4p-4, -0x5.ac59d94946f1cp-4, 0x5.e8000000181ap-4 }, /* i=94 70.395 */ - { 0x1.3041e6045d564p+0, -0x1.13eaf625f791dp+0, -0x3.bc8fa2c3b4dfcp-4, -0x4.f54208b991538p-4, -0x4.21f2a2cb87d7cp-4, -0x5.195df17dcc82p-4, -0x5.dfffa701a4b9p-4, 0x5.f800000001d18p-4 }, /* i=95 70.336 */ - { 0x1.2f2dbef5a889dp+0, -0x1.14637720c7a0cp+0, -0x3.cb8867e3e2346p-4, -0x5.05fd4758358b4p-4, -0x4.3bca91c784684p-4, -0x5.3d3e2203bf1ccp-4, -0x6.15c38e6fcbaa4p-4, 0x6.07ffffffe5824p-4 }, /* i=96 70.273 */ - { 0x1.2e191e755a64ep+0, -0x1.14ddda5ddae36p+0, -0x3.dab3fb39b7a22p-4, -0x5.172150b1d406cp-4, -0x4.565912722c624p-4, -0x5.626783bdbf14p-4, -0x6.4dbf8b3d74f64p-4, 0x6.1800000011878p-4 }, /* i=97 70.209 */ - { 0x1.2d04029e0651p+0, -0x1.155a264ac80a8p+0, -0x3.ea139b794c7a2p-4, -0x5.28b10c156691cp-4, -0x4.71a4b49475188p-4, -0x5.88e7bda40cd74p-4, -0x6.880f0a1d71cbp-4, 0x6.27fffffffe63cp-4 }, /* i=98 70.142 */ - { 0x1.2bee6983af089p+0, -0x1.15d8617d9002dp+0, -0x3.f9a8903561fa2p-4, -0x5.3aaf7b9cb08acp-4, -0x4.8db44ddf18d04p-4, -0x5.b0cd20e952cc4p-4, -0x6.c4d388733e06p-4, 0x6.38000000025ap-4 }, /* i=99 70.078 */ - { 0x1.2ad85133b22p+0, -0x1.165892b5b5bc3p+0, -0x4.09742a304bffcp-4, -0x5.4d1fbd4960da4p-4, -0x4.aa8efd58bb97cp-4, -0x5.da26b26379dbcp-4, -0x7.042675fd71ba4p-4, 0x6.4800000022028p-4 }, /* i=100 70.012 */ - { 0x1.29c1b7b49be5cp+0, -0x1.16dac0dd6a3c1p+0, -0x4.1977c3b182358p-4, -0x5.60050c319a738p-4, -0x4.c83c2ef1f19d4p-4, -0x6.0504348668ae8p-4, -0x7.462aa050ceff8p-4, 0x6.580000002ec9p-4 }, /* i=101 69.945 */ - { 0x1.28aa9b05f6c7ap+0, -0x1.175ef30ac53c1p+0, -0x4.29b4c0deffbc4p-4, -0x5.7362c1bb8d688p-4, -0x4.e6c39f598d894p-4, -0x6.31763204b07bcp-4, -0x7.8afee166220a8p-4, 0x6.680000001554p-4 }, /* i=102 69.884 */ - { 0x1.2792f920207e8p+0, -0x1.17e5308105f7ep+0, -0x4.3a2c901a07354p-4, -0x5.873c56e841abp-4, -0x5.062d5ffafc4f4p-4, -0x6.5f8e0917ba26cp-4, -0x7.d2ce91d150604p-4, 0x6.77ffffffc4804p-4 }, /* i=103 69.813 */ - { 0x1.267acff40ffabp+0, -0x1.186d80b1e69ccp+0, -0x4.4ae0aa60b4c78p-4, -0x5.9b9565afec1a8p-4, -0x5.2681db49c47f8p-4, -0x6.8f5df784eef3cp-4, -0x8.1db6fb02a97b8p-4, 0x6.87ffffffe0a84p-4 }, /* i=104 69.749 */ - { 0x1.25621d6b45916p+0, -0x1.18f7eb3ee6efep+0, -0x4.5bd293b124e88p-4, -0x5.b071aa6c94f38p-4, -0x5.47c9d92ca328p-4, -0x6.c0f9275c8f4acp-4, -0x8.6beb9f79e598p-4, 0x6.97fffffff986cp-4 }, /* i=105 69.679 */ - { 0x1.2448df677b8b6p+0, -0x1.198477fac1edcp+0, -0x4.6d03db74ad3d4p-4, -0x5.c5d5055bad368p-4, -0x5.6a0e83d094dbcp-4, -0x6.f473bc99313acp-4, -0x8.bd8db0f22eea8p-4, 0x6.a80000004f038p-4 }, /* i=106 69.612 */ - { 0x1.232f13c29537bp+0, -0x1.1a132eead180dp+0, -0x4.7e761cebd8f0cp-4, -0x5.dbc37c2e74f5cp-4, -0x5.8d596c9ca22ccp-4, -0x7.29e2e3921598cp-4, -0x9.12cdb61ed961p-4, 0x6.b7fffffff040cp-4 }, /* i=107 69.545 */ - { 0x1.2214b84e34163p+0, -0x1.1aa41848ac9dcp+0, -0x4.902affa4a903cp-4, -0x5.f2413bb5cf1a4p-4, -0x5.b1b4918e79edp-4, -0x7.615ce0733b7b8p-4, -0x9.6bdd72694573p-4, 0x6.c7ffffffe1cd4p-4 }, /* i=108 69.475 */ - { 0x1.20f9cad3b7ef8p+0, -0x1.1b373c839d872p+0, -0x4.a22437ef412acp-4, -0x6.0952999b9e32p-4, -0x5.d72a62d570b84p-4, -0x7.9af91f9f81abcp-4, -0x9.c8eb58588884p-4, 0x6.d800000019828p-4 }, /* i=109 69.41 */ - { 0x1.1fde4914008dfp+0, -0x1.1bcca4424573ep+0, -0x4.b463875b9cec4p-4, -0x6.20fc1637d0d1p-4, -0x5.fdc5c8c2a14a4p-4, -0x7.d6d0473ae2dd8p-4, -0xa.2a2f48ab82e8p-4, 0x6.e7fffffff0d5cp-4 }, /* i=110 69.335 */ - { 0x1.1ec230c71572p+0, -0x1.1c6458645d9e9p+0, -0x4.c6eabd3e8937cp-4, -0x6.39425e8022178p-4, -0x6.25922a1c556p-4, -0x8.14fc49dcd1898p-4, -0xa.8fea73231751p-4, 0x6.f7fffffff4b6cp-4 }, /* i=111 69.268 */ - { 0x1.1da57f9c0822bp+0, -0x1.1cfe6204698ffp+0, -0x4.d9bbb738b3028p-4, -0x6.522a4e0ce151p-4, -0x6.4e9b72d41108p-4, -0x8.55987a82ab85p-4, -0xa.fa4e07b2bf0fp-4, 0x7.080000004c9p-4 }, /* i=112 69.196 */ - { 0x1.1c883338c5f3dp+0, -0x1.1d9aca7981d9fp+0, -0x4.ecd861c4cd1p-4, -0x6.6bb8f13a4215p-4, -0x6.78ee1b0d20e9cp-4, -0x8.98c1a1ce85e18p-4, -0xb.699daa840366p-4, 0x7.17fffffff9f04p-4 }, /* i=113 69.125 */ - { 0x1.1b6a4939a326cp+0, -0x1.1e399b5956faap+0, -0x5.0042b8d0e92d4p-4, -0x6.85f3876d140acp-4, -0x6.a4972eb0999fp-4, -0x8.de9614d5c0dep-4, -0xb.de1d70d38091p-4, 0x7.27fffffff3284p-4 }, /* i=114 69.054 */ - { 0x1.1a4bbf3156ea1p+0, -0x1.1edade7a08c53p+0, -0x5.13fcc85718824p-4, -0x6.a0df856c44fbp-4, -0x6.d1a4555cab698p-4, -0x9.2735cd5e5e5e8p-4, -0xc.5817223928e08p-4, 0x7.37ffffffcc574p-4 }, /* i=115 68.981 */ - { 0x1.192c92a8929fep+0, -0x1.1f7e9df447dbep+0, -0x5.2808ad03f39d8p-4, -0x6.bc8297e415f2p-4, -0x7.0023dae4d54acp-4, -0x9.72c283e002248p-4, -0xc.d7d3f16dc9cd8p-4, 0x7.47ffffffea114p-4 }, /* i=116 68.911 */ - { 0x1.180cc11ddad6ep+0, -0x1.2024e42566747p+0, -0x5.3c6894e03a12p-4, -0x6.d8e2a605fe7fp-4, -0x7.3024b846b0c68p-4, -0x9.c15fcb467047p-4, -0xd.5da879da75a8p-4, 0x7.57ffffffe905cp-4 }, /* i=117 68.838 */ - { 0x1.16ec48052a33bp+0, -0x1.20cdbbb19c57fp+0, -0x5.511ec00625f9cp-4, -0x6.f605d4528a5ap-4, -0x7.61b69d3f863bp-4, -0xa.13332eae52cb8p-4, -0xd.e9eab4fce00fp-4, 0x7.67ffffffeb144p-4 }, /* i=118 68.764 */ - { 0x1.15cb24c7b45dep+0, -0x1.21792f864e7c8p+0, -0x5.662d815cf16f8p-4, -0x7.13f287875d598p-4, -0x7.94e9fa70bacbp-4, -0xa.68645136c25e8p-4, -0xe.7cf59724f1918p-4, 0x7.77fffffffae7cp-4 }, /* i=119 68.688 */ - { 0x1.14a954c3a1c3bp+0, -0x1.22274adc711fcp+0, -0x5.7b973f5db1efcp-4, -0x7.32af67b775f6cp-4, -0x7.c9d00c28fe458p-4, -0xa.c11d1014fb86p-4, -0xf.172de9fd6423p-4, 0x7.87ffffffb59c4p-4 }, /* i=120 68.613 */ - { 0x1.1386d54ba021ap+0, -0x1.22d8193b1bd46p+0, -0x5.915e74e4cabbp-4, -0x7.5243639460a4cp-4, -0x8.007ae5ea9c32p-4, -0xb.1d89a72463278p-4, -0xf.b8fa751831068p-4, 0x7.98000000340f8p-4 }, /* i=121 68.538 */ - { 0x1.1263a3a6de6f8p+0, -0x1.238ba679f577bp+0, -0x5.a785b20543e94p-4, -0x7.72b5b3dafcc6cp-4, -0x8.38fd7e93a3cap-4, -0xb.7dd8d7f687fap-4, -0x1.062cd246e6acp+0, 0x7.a7ffffffe48dcp-4 }, /* i=122 68.464 */ - { 0x1.113fbd1058181p+0, -0x1.2441fec425bd9p+0, -0x5.be0f9cf3d31b4p-4, -0x7.940ddf059a4a8p-4, -0x8.736bbd7a859bp-4, -0xb.e23c13f8ccfdp-4, -0x1.11515efa000e9p+0, 0x7.b7fffffffb334p-4 }, /* i=123 68.387 */ - { 0x1.101b1eb6d081p+0, -0x1.24fb2e9af69e9p+0, -0x5.d4fef2efb359p-4, -0x7.b653bd2047d44p-4, -0x8.afda883473b48p-4, -0xc.4ae7a96d34208p-4, -0x1.1d0587127d8ep+0, 0x7.c80000000676p-4 }, /* i=124 68.308 */ - { 0x1.0ef5c5bc514efp+0, -0x1.25b742d8df698p+0, -0x5.ec568940a9c88p-4, -0x7.d98f7be3e575cp-4, -0x8.ee5fd16fd91d8p-4, -0xc.b812f3e30d58p-4, -0x1.295124f7c97ccp+0, 0x7.d80000003ef6p-4 }, /* i=125 68.232 */ - { 0x1.0dcfaf35ef7afp+0, -0x1.267648b481c97p+0, -0x6.04194e3bf22bcp-4, -0x7.fdc9a305d004cp-4, -0x9.2f12a8a1b41ep-4, -0xd.29f8902ec46ep-4, -0x1.363e049e0de42p+0, 0x7.e7ffffffcbaacp-4 }, /* i=126 68.154 */ - { 0x1.0ca8d82b329d9p+0, -0x1.27384dc402fc9p+0, -0x6.1c4a4a5dc8d6cp-4, -0x8.230b18d3ad99p-4, -0x9.720b4af4e481p-4, -0xd.a0d6946f08498p-4, -0x1.43d523412b4f6p+0, 0x7.f7fffffff6a04p-4 }, /* i=127 68.075 */ - { 0x1.0b813d95feb08p+0, -0x1.27fd600031d0cp+0, -0x6.34eca16651844p-4, -0x8.495d27044eb5p-4, -0x9.b763351ef59c8p-4, -0xe.1ceecc1215bep-4, -0x1.5220c8aed571fp+0, 0x8.080000001a72p-4 }, /* i=128 67.996 */ - { 0x1.0a58dc620307cp+0, -0x1.28c58dc81f30cp+0, -0x6.4e03938f1558cp-4, -0x8.70c97fe15c2e8p-4, -0x9.ff353696dc068p-4, -0xe.9e86f8a1db368p-4, -0x1.612c29c4f4832p+0, 0x8.180000000f7dp-4 }, /* i=129 67.915 */ - { 0x1.092fb16c4224cp+0, -0x1.2990e5e4ccab4p+0, -0x6.67927ece45de4p-4, -0x8.995a43bd3c68p-4, -0xa.499d861a679cp-4, -0xf.25e917811d738p-4, -0x1.71026c5d36295p+0, 0x8.280000010859p-4 }, /* i=130 67.834 */ - { 0x1.0805b9830e811p+0, -0x1.2a5f778cb0eccp+0, -0x6.819ce0205a5ccp-4, -0x8.c31a06ace94b8p-4, -0xa.96b9d76a05c48p-4, -0xf.b363acd154988p-4, -0x1.81b0dea82a6fbp+0, 0x8.37fffffff1f18p-4 }, /* i=131 67.753 */ - { 0x1.06daf164d8746p+0, -0x1.2b31526835582p+0, -0x6.9c2654fd6e394p-4, -0x8.ee13d6c598598p-4, -0xa.e6a972f701088p-4, -0x1.0474a14c9c252p+0, -0x1.93441d35ee076p+0, 0x8.47ffffffe8958p-4 }, /* i=132 67.67 */ - { 0x1.05af55c07f3edp+0, -0x1.2c06869553dc3p+0, -0x6.b7329cbfaa96cp-4, -0x9.1a53428528a38p-4, -0xb.398d4eb0276e8p-4, -0x1.0e1f4daaad957p+0, -0x1.a5ca92f3e11c3p+0, 0x8.57ffffffa4728p-4 }, /* i=133 67.589 */ - { 0x1.0482e3345ce53p+0, -0x1.2cdf24ac42f69p+0, -0x6.d2c59a39cde7p-4, -0x9.47e45fcf112bp-4, -0xb.8f8828faf2358p-4, -0x1.183c2173ed5aap+0, -0x1.b953da2657c35p+0, 0x8.6800000023ebp-4 }, /* i=134 67.505 */ - { 0x1.0355964e22ff3p+0, -0x1.2dbb3dc3be91fp+0, -0x6.eee355502382cp-4, -0x9.76d3d339abbc8p-4, -0xb.e8bea55c64718p-4, -0x1.22d15d681aac4p+0, -0x1.cdf0460a07ee5p+0, 0x8.77ffffffe8e58p-4 }, /* i=135 67.42 */ - { 0x1.02276b89f6e02p+0, -0x1.2e9ae3760d62ap+0, -0x7.0b8ffcb964c18p-4, -0x9.a72ed7eed282p-4, -0xc.45576b6377d38p-4, -0x1.2de5a85dbb599p+0, -0x1.e3b13364fa1bap+0, 0x8.880000003bafp-4 }, /* i=136 67.337 */ - { 0x1.00f85f524826dp+0, -0x1.2f7e27e5b41cp+0, -0x7.28cfe7c61ff24p-4, -0x9.d90347eed13ep-4, -0xc.a57b4795fa1e8p-4, -0x1.398016ae983e1p+0, -0x1.faa9b4611c082p+0, 0x8.980000004176p-4 }, /* i=137 67.25 */ - { 0xf.fc86dff0d9398p-4, -0x1.30651dc2d07fbp+0, -0x7.46a7984faf95p-4, -0xa.0c5fa4f34eafp-4, -0xd.09554ef90a3c8p-4, -0x1.45a83245eaf41p+0, -0x2.12ee79734040cp+0, 0x8.a7fffffff8df8p-4 }, /* i=138 67.165 */ - { 0xf.e9793d53d1a2p-4, -0x1.314fd85084a52p+0, -0x7.651bbcbca7b9p-4, -0xa.415321db625e8p-4, -0xd.7113052aa67bp-4, -0x1.5266035748ecap+0, -0x2.2c94dd35b78fp+0, 0x8.b7ffffffc7398p-4 }, /* i=139 67.078 */ - { 0xf.d65cd063f8fc8p-4, -0x1.323e6b6aa34b6p+0, -0x7.8431322241f98p-4, -0xa.77edacb528dcp-4, -0xd.dce4853fb458p-4, -0x1.5fc219cf7457ep+0, -0x2.47b47d75ae664p+0, 0x8.c7fffffff7d08p-4 }, /* i=140 66.99 */ - { 0xf.c3315af63356p-4, -0x1.3330eb8b9e115p+0, -0x7.a3ed06844f9f4p-4, -0xa.b03ff96fec59p-4, -0xe.4cfcadc29f138p-4, -0x1.6dc597904e504p+0, -0x2.64664ed2b4a66p+0, 0x8.d7fffffffefe8p-4 }, /* i=141 66.901 */ - { 0xf.aff69d91c949p-4, -0x1.34276dd2e0208p+0, -0x7.c4547b3ad035cp-4, -0xa.ea5b8d4cb7a2p-4, -0xe.c19150086d218p-4, -0x1.7c7a3b8ea772cp+0, -0x2.82c5f27e5affcp+0, 0x8.e800000003b7p-4 }, /* i=142 66.812 */ - { 0xf.9cac5766f703p-4, -0x1.3522080b5339ep+0, -0x7.e56d077639954p-4, -0xb.2652cb0b19e3p-4, -0xf.3adb6326bdd3p-4, -0x1.8bea6de0f203p+0, -0x2.a2f0206fe2138p+0, 0x8.f7fffffff9c28p-4 }, /* i=143 66.722 */ - { 0xf.89524643e38c8p-4, -0x1.3620d0b246484p+0, -0x8.073c5aeb67e7p-4, -0xb.6438ffecae0dp-4, -0xf.b9173ac4e1d18p-4, -0x1.9c214cdb2ebd2p+0, -0x2.c50503ebd7d18p+0, 0x9.07ffffffb7eb8p-4 }, /* i=144 66.632 */ - { 0xf.75e8268838b58p-4, -0x1.3723defeb8854p+0, -0x8.29c860a99967p-4, -0xb.a422719fb1728p-4, -0x1.03c84c256fd27p+0, -0x1.ad2abb5072b7bp+0, -0x2.e925f8a4b93a8p+0, 0x9.17ffffffd1d78p-4 }, /* i=145 66.54 */ - { 0xf.626db31af415p-4, -0x1.382b4ae8de57fp+0, -0x8.4d174216d6438p-4, -0xb.e6246d16b2fdp-4, -0x1.0c567bccd8972p+0, -0x1.bf13701381eb3p+0, -0x3.0f7834c946064p+0, 0x9.28000000398dp-4 }, /* i=146 66.448 */ - { 0xf.4ee2a55e8028p-4, -0x1.39372d321827bp+0, -0x8.712f6a1c6ea2p-4, -0xc.2a55566cc7d48p-4, -0x1.154080976fdaep+0, -0x1.d1e906db3965bp+0, -0x3.38230b8570a16p+0, 0x9.37ffffffe96e8p-4 }, /* i=147 66.354 */ - { 0xf.3b46b51fb5538p-4, -0x1.3a479f6d917e1p+0, -0x8.9617888d6d738p-4, -0xc.70ccb9f86783p-4, -0x1.1e8b1ee701bcap+0, -0x1.e5ba12ae6d533p+0, -0x3.6351be7edc792p+0, 0x9.480000004b9ap-4 }, /* i=148 66.259 */ - { 0xf.2799988d7c908p-4, -0x1.3b5cbc08d1f65p+0, -0x8.bbd695b105a08p-4, -0xc.b9a35e73c9b9p-4, -0x1.283b668ee128p+0, -0x1.fa9631f3b636p+0, -0x3.913153da5d25ap+0, 0x9.580000011df3p-4 }, /* i=149 66.164 */ - { 0xf.13db042b44e38p-4, -0x1.3c769e5500aefp+0, -0x8.e273d60d9e618p-4, -0xd.04f35882400dp-4, -0x1.3256b8403fecep+0, -0x2.108e245b4c126p+0, -0x3.c1f6039355d84p+0, 0x9.680000002654p-4 }, /* i=150 66.069 */ - { 0xf.000aaab9a6b58p-4, -0x1.3d9562912adadp+0, -0x9.09f6de8302188p-4, -0xd.52d81fc3c5648p-4, -0x1.3ce2cb72f8163p+0, -0x2.27b3e2db8982p+0, -0x3.f5d4653c4b8b4p+0, 0x9.780000005858p-4 }, /* i=151 65.972 */ - { 0xe.ec283d3357338p-4, -0x1.3eb925f3e4a1cp+0, -0x9.3267987cb9a58p-4, -0xd.a36ea52086f2p-4, -0x1.47e5b4bb39c98p+0, -0x2.401ab9d187876p+0, -0x4.2d089b30b6f1cp+0, 0x9.8800000002a2p-4 }, /* i=152 65.874 */ - { 0xe.d8336ab413d48p-4, -0x1.3fe206b6a9169p+0, -0x9.5bce46942a128p-4, -0xd.f6d56b0eb8c8p-4, -0x1.5365ecb80ae04p+0, -0x2.59d765b2c4498p+0, -0x4.67d17653f05f8p+0, 0x9.980000004bb8p-4 }, /* i=153 65.776 */ - { 0xe.c42be06f18a3p-4, -0x1.41102420e572bp+0, -0x9.8633895d4d228p-4, -0xe.4d2c9f64aeaf8p-4, -0x1.5f6a578b54c8bp+0, -0x2.7500326626eb6p+0, -0x4.a674da60b3354p+0, 0x9.a7ffffff93068p-4 }, /* i=154 65.676 */ - { 0xe.b0114996acd28p-4, -0x1.42439e94764e5p+0, -0x9.b1a064a141968p-4, -0xe.a69637590a1bp-4, -0x1.6bfa4d00a99fcp+0, -0x2.91ad1db410e8cp+0, -0x4.e93e4f4cd18e4p+0, 0x9.b7ffffff34ae8p-4 }, /* i=155 65.575 */ - { 0xe.9be34f4ef4378p-4, -0x1.437c979a1cb4ap+0, -0x9.de1e44d6b3c8p-4, -0xf.03360d6f5b8ap-4, -0x1.791da160c712bp+0, -0x2.aff7fcff6a6f6p+0, -0x5.307f01a17d97cp+0, 0x9.c7ffffffa4828p-4 }, /* i=156 65.473 */ - { 0xe.87a1989b64bb8p-4, -0x1.44bb31eeeb01ep+0, -0xa.0bb70500bbb38p-4, -0xf.633201c4659d8p-4, -0x1.86dcaf0bdc21ap+0, -0x2.cffca6b88303ap+0, -0x5.7c9171676f43cp+0, 0x9.d800000033b1p-4 }, /* i=157 65.371 */ - { 0xe.734bca491137p-4, -0x1.45ff91929871bp+0, -0xa.3a74f4f79799p-4, -0xf.c6b21ce7229dp-4, -0x1.954060f1b1f3ep+0, -0x2.f1d91ff1b9cc4p+0, -0x5.cdd5e0d91f19cp+0, 0x9.e8000000a6e1p-4 }, /* i=158 65.267 */ - { 0xe.5ee186dba926p-4, -0x1.4749dbd66b9a8p+0, -0xa.6a62e015da318p-4, -0x1.02de0b55bb9c4p+0, -0x1.a4523df3bb35dp+0, -0x3.15adce7fd34bcp+0, -0x6.24b5ab830fb0cp+0, 0x9.f7ffffffee3f8p-4 }, /* i=159 65.162 */ - { 0xe.4a626e726f9bp-4, -0x1.489a376d74d4ap+0, -0xa.9b8c146b44fa8p-4, -0x1.098ea983bc81ap+0, -0x1.b41c7553e44d5p+0, -0x3.3b9db03b619dcp+0, -0x6.81a5d03a674f8p+0, 0xa.08000000671dp-4 }, /* i=160 65.057 */ - { 0xe.35ce1ebacea18p-4, -0x1.49f0cc7cc78dep+0, -0xa.cdfc6a4b70528p-4, -0x1.107ff34ca96bfp+0, -0x1.c4a9ec3cf085dp+0, -0x3.63ce97d295ac4p+0, -0x6.e523598631e44p+0, 0xa.18000000a8dep-4 }, /* i=161 64.95 */ - { 0xe.212432d2deae8p-4, -0x1.4b4dc4ada2061p+0, -0xb.01c04c87f3c4p-4, -0x1.17b50cbdf1819p+0, -0x1.d6064c91d451ep+0, -0x3.8e697000e91a8p+0, -0x7.4fb94945b364p+0, 0xa.280000000edbp-4 }, /* i=162 64.841 */ - { 0xe.0c64432e94f9p-4, -0x1.4cb14b406a7c6p+0, -0xb.36e4c136317cp-4, -0x1.1f314a31c802cp+0, -0x1.e83e151fd238ep+0, -0x3.bb9a85cb578cap+0, -0x7.c1fd2577e27ccp+0, 0xa.380000003a55p-4 }, /* i=163 64.732 */ - { 0xd.f78de584226ep-4, -0x1.4e1b8d203e315p+0, -0xb.6d7772ff5effp-4, -0x1.26f833c35e679p+0, -0x1.fb5eab4b68097p+0, -0x3.eb91da867b524p+0, -0x8.3c95edce3e4cp+0, 0xa.480000001a1cp-4 }, /* i=164 64.622 */ - { 0xd.e2a0acab44df8p-4, -0x1.4f8cb8f87e796p+0, -0xb.a586bb3b3d1cp-4, -0x1.2f0d891164b6bp+0, -0x2.0f766e7b99fc4p+0, -0x4.1e837ebef22dcp+0, -0x8.c0380dbbc9bep+0, 0xa.580000000c97p-4 }, /* i=165 64.51 */ - { 0xd.cd9c28823f488p-4, -0x1.5104ff4b34aa7p+0, -0xb.df21acb4e29cp-4, -0x1.3775454f57ccbp+0, -0x2.2494cd5a18a52p+0, -0x4.54a7f6e8e1b78p+0, -0x9.4daa973b25618p+0, 0xa.68000000924dp-4 }, /* i=166 64.397 */ - { 0xd.b87fe5d38c68p-4, -0x1.52849288b1478p+0, -0xc.1a581f3453e18p-4, -0x1.4033a3aee1a75p+0, -0x2.3aca5d253aap+0, -0x4.8e3cab11bc898p+0, -0x9.e5c77c671132p+0, 0xa.77ffffff63548p-4 }, /* i=167 64.283 */ - { 0xd.a34b6e2b17f88p-4, -0x1.540ba729ba7f7p+0, -0xc.573abc0f06f48p-4, -0x1.494d2431409b6p+0, -0x2.5228f35cc9c5ap+0, -0x4.cb846319172d4p+0, -0xa.89806f34e2de8p+0, 0xa.87ffffffd7168p-4 }, /* i=168 64.168 */ - { 0xd.8dfe47c30bffp-4, -0x1.559a73c98e71cp+0, -0xc.95db0b623c0d8p-4, -0x1.52c690d9d9187p+0, -0x2.6ac3c1e5771d4p+0, -0x5.0cc7d0931da4cp+0, -0xb.39ddfebc099a8p+0, 0xa.980000002c9p-4 }, /* i=169 64.051 */ - { 0xd.7897f55837828p-4, -0x1.573131433bfe7p+0, -0xc.d64b8292038e8p-4, -0x1.5ca503606ec3bp+0, -0x2.84af761ae8532p+0, -0x5.5256288e6d18cp+0, -0xb.f80268aa35ce8p+0, 0xa.a800000003d7p-4 }, /* i=170 63.933 */ - { 0xd.6317f6055cf1p-4, -0x1.58d01ad03e283p+0, -0xd.189f93cd49e08p-4, -0x1.66edeb624a635p+0, -0x2.a0025b02ef3bap+0, -0x5.9c85cee8e8034p+0, -0xc.c531363909ccp+0, 0xa.b800000029d5p-4 }, /* i=171 63.814 */ - { 0xd.4d7dc51f17738p-4, -0x1.5a776e28e8334p+0, -0xd.5cebbec01b078p-4, -0x1.71a71521d762ep+0, -0x2.bcd47f0afec4p+0, -0x5.ebb515865fbap+0, -0xd.a2cc3c037107p+0, 0xa.c80000007fcfp-4 }, /* i=172 63.693 */ - { 0xd.37c8da0bc4ep-4, -0x1.5c276ba71e8f6p+0, -0xd.a345a29d90868p-4, -0x1.7cd6b0e5a90ecp+0, -0x2.db3fddb52347p+0, -0x6.404b120acc92p+0, -0xe.925e34b468c4p+0, 0xa.d7ffffff53288p-4 }, /* i=173 63.571 */ - { 0xd.21f8a80f32fa8p-4, -0x1.5de0566c31dap+0, -0xd.ebc411bcf2e4p-4, -0x1.88835b0c4255ep+0, -0x2.fb608dc3a826ep+0, -0x6.9ab88d33ec13p+0, -0xf.9599114c4ca5p+0, 0xa.e800000009a2p-4 }, /* i=174 63.447 */ - { 0xd.0c0c9e2c189bp-4, -0x1.5fa274875f554p+0, -0xe.367f267caa37p-4, -0x1.94b424d56db05p+0, -0x3.1d54f4301d1f6p+0, -0x6.fb790eafd73ep+0, -0x1.0ae60d2a21c22p+4, 0xa.f7fffffffd5c8p-4 }, /* i=175 63.321 */ - { 0xc.f60426e6da11p-4, -0x1.616e0f21419d9p+0, -0xe.83905a3c10cp-4, -0x1.a1709e11597a6p+0, -0x3.413dfcdb06e3cp+0, -0x7.63140a255ccacp+0, -0x1.1decc2bace9c4p+4, 0xb.080000000ffdp-4 }, /* i=176 63.195 */ - { 0xc.dfdea818b84p-4, -0x1.634372a8b9516p+0, -0xe.d3129dfc0be88p-4, -0x1.aec0dfb44f60cp+0, -0x3.673f5957bcbbap+0, -0x7.d21e312a92574p+0, -0x1.3292e501f59c9p+4, 0xb.1800000025e7p-4 }, /* i=177 63.066 */ - { 0xc.c99b82b89faep-4, -0x1.6522ef03a2634p+0, -0xf.2522752ccc32p-4, -0x1.bcad977769f87p+0, -0x3.8f7fc6c5a6786p+0, -0x8.493aefc1788e8p+0, -0x1.4901f5629cae3p+4, 0xb.280000001985p-4 }, /* i=178 62.936 */ - { 0xc.b33a12a166e18p-4, -0x1.670cd7c2fc64fp+0, -0xf.79de12c33186p-4, -0x1.cb40149fec3dbp+0, -0x3.ba295b8f59408p+0, -0x8.c91e192e2755p+0, -0x1.616805ebdf193p+4, 0xb.380000003d47p-4 }, /* i=179 62.804 */ - { 0xc.9cb9ae573ffb8p-4, -0x1.6901845aa491p+0, -0xf.d16578c801dbp-4, -0x1.da82560d50653p+0, -0x3.e769de07c8d22p+0, -0x9.528dcbf8b685p+0, -0x1.7bf8a595e7c32p+4, 0xb.480000000657p-4 }, /* i=180 62.671 */ - { 0xc.8619a6c4c482p-4, -0x1.6b01505d970f5p+0, -0x1.02bda9abdde68p+0, -0x1.ea7f19b8b70adp+0, -0x4.1773252228c74p+0, -0x9.e6649543d1948p+0, -0x1.98ed63f054b21p+4, 0xb.5800000020f8p-4 }, /* i=181 62.535 */ - { 0xc.6f5946fa3e238p-4, -0x1.6d0c9bbe240eap+0, -0x1.0896182fcc849p+0, -0x1.fb41edc94a51p+0, -0x4.4a7b847c3f81cp+0, -0xa.8593dc6fdef8p+0, -0x1.b886c8c4d5608p+4, 0xb.68000000278bp-4 }, /* i=182 62.398 */ - { 0xc.5877d3e308fdp-4, -0x1.6f23cb13866d8p+0, -0x1.0ea207b824cf7p+0, -0x2.0cd743760f186p+0, -0x4.80be455c78028p+0, -0xb.3126a21a5862p+0, -0x1.db0cf573fdcfep+4, 0xb.7800000069f5p-4 }, /* i=183 62.259 */ - { 0xc.41748bfbeafa8p-4, -0x1.714747e450ae1p+0, -0x1.14e403a64884bp+0, -0x2.1f4c83e43bdbp+0, -0x4.ba7c2e431d474p+0, -0xb.ea449eafcbe48p+0, -0x2.00d1167250cf2p+4, 0xb.87ffffffdd438p-4 }, /* i=184 62.118 */ - { 0xc.2a4ea6fbf6a38p-4, -0x1.737780f775926p+0, -0x1.1b5ec1289036ap+0, -0x2.32b0274b4de2cp+0, -0x4.f7fc1b3a2fb44p+0, -0xc.b235cf99e9d88p+0, -0x2.2a2e65dc98f1cp+4, 0xb.980000000c4bp-4 }, /* i=185 61.975 */ - { 0xc.1305558526a98p-4, -0x1.75b4eaaa78e78p+0, -0x1.2215228b4bd63p+0, -0x2.4711ce94e43fcp+0, -0x5.398ba8fadbcbp+0, -0xd.8a66837acbaf8p+0, -0x2.578b8a79cbbcp+4, 0xb.a800000005d4p-4 }, /* i=186 61.831 */ - { 0xb.fb97c0ced40dp-4, -0x1.77ffff4e90137p+0, -0x1.290a3adaa9d69p+0, -0x2.5c825fd298e6p+0, -0x5.7f7ff5b00d0ecp+0, -0xe.746bf9cb3b598p+0, -0x2.895c879b1b5b6p+4, 0xb.b7fffff7d0848p-4 }, /* i=187 61.684 */ - { 0xb.e4050a09f1048p-4, -0x1.7a593f93c2a1bp+0, -0x1.304151f251a6ep+0, -0x2.731426249575cp+0, -0x5.ca367b453ab08p+0, -0xf.7209b02a2582p+0, -0x2.c0245764ffebap+4, 0xb.c7ffffff70458p-4 }, /* i=188 61.534 */ - { 0xb.cc4c4a6c05538p-4, -0x1.7cc132eb4a884p+0, -0x1.37bde8bd19f81p+0, -0x2.8adaf49baf224p+0, -0x6.1a1603f5b78b8p+0, -0x1.085376f69fa61p+4, -0x2.fc776922c34dp+4, 0xb.d7ffffffe7128p-4 }, /* i=189 61.383 */ - { 0xb.b46c924e2e73p-4, -0x1.7f386809bc4fbp+0, -0x1.3f83be29922a7p+0, -0x2.a3ec4e08a85b4p+0, -0x6.6f8fc228d64ccp+0, -0x1.1b0284955276ap+4, -0x3.3efddaa411b94p+4, 0xb.e80000000e16p-4 }, /* i=190 61.229 */ - { 0xb.9c64e8eb3ce7p-4, -0x1.81bf7562d8fefp+0, -0x1.4796d46955bap+0, -0x2.be5f90d2c9c28p+0, -0x6.cb208bb6b409cp+0, -0x1.2f5529ded2291p+4, -0x3.887707a8ec552p+4, 0xb.f7ffffffc86d8p-4 }, /* i=191 61.073 */ - { 0x1.71f93c6d63c51p+0, -0x2.1f53124f173dp-4, 0x8.972b8c4a20448p-8, -0x2.e4f3dcbb95cb6p-8, 0x1.1e4f5193c9038p-8, -0x7.7e6f5037aee1p-12, 0xc.07ffffffe3c58p-4 }, /* i=192 69.804 */ - { 0x1.71d74fd079481p+0, -0x2.1e40b7836dd52p-4, 0x8.8e8361e012ap-8, -0x2.e07f4aa881dc4p-8, 0x1.1bfae59d98d05p-8, -0x7.6ab46d8822b6p-12, 0xc.180000062602p-4 }, /* i=193 69.821 */ - { 0x1.71b57450b185bp+0, -0x2.1d2f70e89a9d2p-4, 0x8.85e887448c588p-8, -0x2.dc13fdfffce02p-8, 0x1.19ac9a3a4d121p-8, -0x7.573852d0b665cp-12, 0xc.2800000040d7p-4 }, /* i=194 69.838 */ - { 0x1.7193a9dcb1183p+0, -0x2.1c1f3cd52faeap-4, 0x8.7d5ae0c25bb08p-8, -0x2.d7b1de61e151p-8, 0x1.17645bed0ee29p-8, -0x7.43fa15c498a34p-12, 0xc.37fffffffcbe8p-4 }, /* i=195 69.857 */ - { 0x1.7171f06367b2p+0, -0x2.1b1019a4b978cp-4, 0x8.74da52f953a1p-8, -0x2.d358d3c1bfedcp-8, 0x1.1522178791ebcp-8, -0x7.30f8d013572f4p-12, 0xc.480000002707p-4 }, /* i=196 69.872 */ - { 0x1.715047d3d6663p+0, -0x2.1a0205b5e4eecp-4, 0x8.6c66c2cebd1f8p-8, -0x2.cf08c65e35b18p-8, 0x1.12e5ba1c65e02p-8, -0x7.1e339f31034ecp-12, 0xc.57ffffffb4608p-4 }, /* i=197 69.891 */ - { 0x1.712eb01d12eabp+0, -0x2.18f4ff6a93158p-4, 0x8.6400156d5d68p-8, -0x2.cac19ec04a7a6p-8, 0x1.10af310c6e4f7p-8, -0x7.0ba9a47253cf4p-12, 0xc.6800000023c9p-4 }, /* i=198 69.908 */ - { 0x1.710d292e52438p+0, -0x2.17e90528277fp-4, 0x8.5ba6304751768p-8, -0x2.c68345bbbf5aap-8, 0x1.0e7e69f7eb7cfp-8, -0x6.f95a04c347eecp-12, 0xc.78000000529fp-4 }, /* i=199 69.925 */ - { 0x1.70ebb2f6e1063p+0, -0x2.16de1557432bp-4, 0x8.5358f9134d4c8p-8, -0x2.c24da46d0594ep-8, 0x1.0c5352c06ae07p-8, -0x6.e743e8c00ed5cp-12, 0xc.880000001087p-4 }, /* i=200 69.942 */ - { 0x1.70ca4d66233aep+0, -0x2.15d42e63bcc4ep-4, 0x8.4b1855cbca8cp-8, -0x2.be20a4383606p-8, 0x1.0a2dd99306652p-8, -0x6.d5667c8fbba3p-12, 0xc.980000001774p-4 }, /* i=201 69.961 */ - { 0x1.70a8f86b98b8p+0, -0x2.14cb4ebcbc85ep-4, 0x8.42e42caf539ep-8, -0x2.b9fc2ec89ae2p-8, 0x1.080decd700a23p-8, -0x6.c3c0efd7fdf5cp-12, 0xc.a7ffffffdcd38p-4 }, /* i=202 69.978 */ - { 0x1.7087b3f6d7d5p+0, -0x2.13c374d48b368p-4, 0x8.3abc643e6dd3p-8, -0x2.b5e02e0f07e3ep-8, 0x1.05f37b3589c31p-8, -0x6.b25275b70af1cp-12, 0xc.b80000000307p-4 }, /* i=203 69.994 */ - { 0x1.70667ff7922dcp+0, -0x2.12bc9f20b157ep-4, 0x8.32a0e33c02058p-8, -0x2.b1cc8c417804ep-8, 0x1.03de739bfc68dp-8, -0x6.a11a449bed2bcp-12, 0xc.c7fffffff7858p-4 }, /* i=204 70.011 */ - { 0x1.70455c5d9026ep+0, -0x2.11b6cc19ccf26p-4, 0x8.2a9190ab821e8p-8, -0x2.adc133d989a7ep-8, 0x1.01cec52ee141ep-8, -0x6.901796493c1dcp-12, 0xc.d8000000021fp-4 }, /* i=205 70.028 */ - { 0x1.70244918b34fcp+0, -0x2.10b1fa3b9df52p-4, 0x8.228e53d0c0b6p-8, -0x2.a9be0f93d84b2p-8, 0xf.fc45f545aabf8p-12, -0x6.7f49a7ba9da44p-12, 0xc.e80000000789p-4 }, /* i=206 70.046 */ - { 0x1.70034618f5379p+0, -0x2.0fae2804f6838p-4, 0x8.1a97142eecc8p-8, -0x2.a5c30a6eea076p-8, 0xf.dbf31b07f00fp-12, -0x6.6eafb92d00a74p-12, 0xc.f8000000017p-4 }, /* i=207 70.063 */ - { 0x1.6fe2534e65ee6p+0, -0x2.0eab53f7a8daep-4, 0x8.12abb9877d658p-8, -0x2.a1d00faa180d4p-8, 0xf.bbf2c20d19ec8p-12, -0x6.5e490dea020e8p-12, 0xd.08000000a1p-4 }, /* i=208 70.078 */ - { 0x1.6fc170a932b07p+0, -0x2.0da97c98b5602p-4, 0x8.0acc2bdb15678p-8, -0x2.9de50ac574af4p-8, 0xf.9c43eb9e32928p-12, -0x6.4e14ec4b84b24p-12, 0xd.17fffffff9918p-4 }, /* i=209 70.096 */ - { 0x1.6fa09e1997e16p+0, -0x2.0ca8a06fd665ap-4, 0x8.02f8536573568p-8, -0x2.9a01e77f3c5dap-8, 0xf.7ce59d21b8b8p-12, -0x6.3e129dbe1c1fcp-12, 0xd.2800000039efp-4 }, /* i=210 70.114 */ - { 0x1.6f7fdb8ff0e27p+0, -0x2.0ba8be07f63bap-4, 0x7.fb3018a08bdp-8, -0x2.962691d4da7c4p-8, 0xf.5dd6df0e03fb8p-12, -0x6.2e416e9a0d6b4p-12, 0xd.37ffffffe12d8p-4 }, /* i=211 70.131 */ - { 0x1.6f5f28fcab6a7p+0, -0x2.0aa9d3eec5fap-4, 0x7.f3736440d4e88p-8, -0x2.9252f6008d6f8p-8, 0xf.3f16bd835d5a8p-12, -0x6.1ea0ae1de35dcp-12, 0xd.47ffffffd1938p-4 }, /* i=212 70.148 */ - { 0x1.6f3e86504d97dp+0, -0x2.09abe0b4e70e2p-4, 0x7.ebc21f360d9ap-8, -0x2.8e87007947b4p-8, 0xf.20a448166881p-12, -0x6.0f2fae61bfd94p-12, 0xd.5800000044f3p-4 }, /* i=213 70.165 */ - { 0x1.6f1df37b7785fp+0, -0x2.08aee2edf17cep-4, 0x7.e41c32aaf19ap-8, -0x2.8ac29df209558p-8, 0xf.027e91b25ba68p-12, -0x5.ffedc452bd8f4p-12, 0xd.67ffffffed178p-4 }, /* i=214 70.181 */ - { 0x1.6efd706edaac7p+0, -0x2.07b2d9302afbp-4, 0x7.dc8188028afdp-8, -0x2.8705bb580f63ap-8, 0xe.e4a4b0799de8p-12, -0x5.f0da478ce6bbp-12, 0xd.78000000198bp-4 }, /* i=215 70.198 */ - { 0x1.6edcfd1b440abp+0, -0x2.06b7c214d0254p-4, 0x7.d4f208d9f0fa4p-8, -0x2.835045d333f76p-8, 0xe.c715be021b258p-12, -0x5.e1f4926b75b44p-12, 0xd.87ffffffa2bb8p-4 }, /* i=216 70.215 */ - { 0x1.6ebc9971913b1p+0, -0x2.05bd9c37ba2p-4, 0x7.cd6d9f0517c8cp-8, -0x2.7fa22ac3e308ap-8, 0xe.a9d0d6f824c78p-12, -0x5.d33c01f27e5acp-12, 0xd.9800000034bbp-4 }, /* i=217 70.231 */ - { 0x1.6e9c4562bce7ap+0, -0x2.04c46637b948cp-4, 0x7.c5f4349116ba8p-8, -0x2.7bfb57c3bfae8p-8, 0xe.8cd51b402fddp-12, -0x5.c4aff5b121748p-12, 0xd.a8000000147cp-4 }, /* i=218 70.247 */ - { 0x1.6e7c00dfd2646p+0, -0x2.03cc1eb62fd4ep-4, 0x7.be85b3c0a8d44p-8, -0x2.785bbaa377514p-8, 0xe.7021adb144a7p-12, -0x5.b64fcfc7c150cp-12, 0xd.b800000029p-4 }, /* i=219 70.265 */ - { 0x1.6e5bcbd9f4eep+0, -0x2.02d4c4574446cp-4, 0x7.b722070d3fbb8p-8, -0x2.74c3416ad4246p-8, 0xe.53b5b4686703p-12, -0x5.a81af4ece85p-12, 0xd.c800000051cep-4 }, /* i=220 70.281 */ - { 0x1.6e3ba6425edefp+0, -0x2.01de55c1d5c2p-4, 0x7.afc919263969p-8, -0x2.7131da57e7854p-8, 0xe.3790586f3532p-12, -0x5.9a10cc368766cp-12, 0xd.d7ffffffb41d8p-4 }, /* i=221 70.297 */ - { 0x1.6e1b900a5a905p+0, -0x2.00e8d19f401dap-4, 0x7.a87ad4eea8b38p-8, -0x2.6da773dd85c9ep-8, 0xe.1bb0c5c26405p-12, -0x5.8c30bf27f154p-12, 0xd.e800000031bcp-4 }, /* i=222 70.314 */ - { 0x1.6dfb89234e8ddp+0, -0x1.fff4369bb4117p-4, 0x7.a137257f892b4p-8, -0x2.6a23fca3e8ff8p-8, 0xe.00162b4ca90a8p-12, -0x5.7e7a39b94478p-12, 0xd.f8000000406ap-4 }, /* i=223 70.33 */ - { 0x1.6ddb917eb3508p+0, -0x1.ff008365e33e6p-4, 0x7.99fdf624d327cp-8, -0x2.66a76386d8cf6p-8, 0xd.e4bfbac12daep-12, -0x5.70ecaa1dee078p-12, 0xe.07fffffff1e08p-4 }, /* i=224 70.347 */ - { 0x1.6dbba90e13891p+0, -0x1.fe0db6aefd6a9p-4, 0x7.92cf325cfea88p-8, -0x2.63319795036fep-8, 0xd.c9aca8c809ebp-12, -0x5.638780ddb9bp-12, 0xe.18000000bdap-4 }, /* i=225 70.363 */ - { 0x1.6d9bcfc31739cp+0, -0x1.fd1bcf2affcdap-4, 0x7.8baac5daf31bp-8, -0x2.5fc2881082754p-8, 0xd.aedc2cdb77788p-12, -0x5.564a30cd04eb4p-12, 0xe.27ffffffda998p-4 }, /* i=226 70.379 */ - { 0x1.6d7c058f6fabfp+0, -0x1.fc2acb901799p-4, 0x7.84909c80f8bacp-8, -0x2.5c5a246c0386ap-8, 0xd.944d80ed6acp-12, -0x5.49342edeaa6dp-12, 0xe.38000000392ep-4 }, /* i=227 70.396 */ - { 0x1.6d5c4a64eb89bp+0, -0x1.fb3aaa9735b61p-4, 0x7.7d80a264b07ap-8, -0x2.58f85c4c4abe8p-8, 0xd.79ffe1ec9b718p-12, -0x5.3c44f24f347c8p-12, 0xe.48000000578p-4 }, /* i=228 70.412 */ - { 0x1.6d3c9e356adc1p+0, -0x1.fa4b6afbae969p-4, 0x7.767ac3cbd8aa8p-8, -0x2.559d1f864017ap-8, 0xd.5ff28f481efp-12, -0x5.2f7bf46169da4p-12, 0xe.5800000034eap-4 }, /* i=229 70.428 */ - { 0x1.6d1d00f2e3d2ap+0, -0x1.f95d0b7b5983ap-4, 0x7.6f7eed2cd6438p-8, -0x2.52485e1ece198p-8, 0xd.4624cb0eb8368p-12, -0x5.22d8b07eecd6p-12, 0xe.67fffffed5cc8p-4 }, /* i=230 70.445 */ - { 0x1.6cfd728f57671p+0, -0x1.f86f8ad63635fp-4, 0x7.688d0b2bae1b4p-8, -0x2.4efa08490ede4p-8, 0xd.2c95d9dde21bp-12, -0x5.165aa41e7955cp-12, 0xe.77fffffff1688p-4 }, /* i=231 70.461 */ - { 0x1.6cddf2fce8cddp+0, -0x1.f782e7cf189dap-4, 0x7.61a50a9eabd2cp-8, -0x2.4bb20e68234a6p-8, 0xd.13450303aeacp-12, -0x5.0a014ebf75ccp-12, 0xe.87fffffffe5b8p-4 }, /* i=232 70.477 */ - { 0x1.6cbe822dc67a3p+0, -0x1.f697212af6f8ep-4, 0x7.5ac6d888cdaf4p-8, -0x2.4870610c2bc72p-8, 0xc.fa31900078328p-12, -0x4.fdcc31d67acbp-12, 0xe.97ffffffc3098p-4 }, /* i=233 70.493 */ - { 0x1.6c9f201432a22p+0, -0x1.f5ac35b125683p-4, 0x7.53f2621b267ccp-8, -0x2.4534f0f2944f2p-8, 0xc.e15acd0fde2c8p-12, -0x4.f1bad0d9da49p-12, 0xe.a7fffffff4148p-4 }, /* i=234 70.51 */ - { 0x1.6c7fcca286aafp+0, -0x1.f4c2242b6adccp-4, 0x7.4d2794b51c5e8p-8, -0x2.41ffaf05d5f7p-8, 0xc.c8c008b0ade08p-12, -0x4.e5ccb11ad575cp-12, 0xe.b7ffffff60bd8p-4 }, /* i=235 70.525 */ - { 0x1.6c6087cb29418p+0, -0x1.f3d8eb65b2754p-4, 0x7.46665de1c5228p-8, -0x2.3ed08c5bdd24ap-8, 0xc.b06093bb5fbap-12, -0x4.da0159d5ea39cp-12, 0xe.c7ffffffee1b8p-4 }, /* i=236 70.541 */ - { 0x1.6c4151809b324p+0, -0x1.f2f08a2e66ea4p-4, 0x7.3faeab5a33628p-8, -0x2.3ba77a36c6c3cp-8, 0xc.983bc193ca8bp-12, -0x4.ce585430d738p-12, 0xe.d7fffffff4578p-4 }, /* i=237 70.556 */ - { 0x1.6c2229b56bc1ep+0, -0x1.f208ff561717cp-4, 0x7.39006b02772dcp-8, -0x2.38846a031eaf2p-8, 0xc.8050e79b894c8p-12, -0x4.c2d12afef9eep-12, 0xe.e80000002114p-4 }, /* i=238 70.574 */ - { 0x1.6c03105c3fb8bp+0, -0x1.f12249afa616cp-4, 0x7.325b8aeaab1a8p-8, -0x2.35674d5808508p-8, 0xc.689f5dc228bp-12, -0x4.b76b6b00c89f4p-12, 0xe.f7ffffffc9918p-4 }, /* i=239 70.589 */ - { 0x1.6be40567cbc8bp+0, -0x1.f03c68101d418p-4, 0x7.2bbff94d4a78p-8, -0x2.325015f621ce6p-8, 0xc.51267e1971bf8p-12, -0x4.ac26a2a62a35p-12, 0xf.07ffffffb8ca8p-4 }, /* i=240 70.606 */ - { 0x1.6bc508cad8c84p+0, -0x1.ef57594ec74e8p-4, 0x7.252da48fa4678p-8, -0x2.2f3eb5c7668cep-8, 0xc.39e5a4d02c578p-12, -0x4.a1026225c45c8p-12, 0xf.17fffffff0eb8p-4 }, /* i=241 70.621 */ - { 0x1.6ba61a784300fp+0, -0x1.ee731c4526d7ap-4, 0x7.1ea47b414191cp-8, -0x2.2c331ede94614p-8, 0xc.22dc30677c828p-12, -0x4.95fe3b5e0f83p-12, 0xf.27fffffff3028p-4 }, /* i=242 70.636 */ - { 0x1.6b873a62f7b52p+0, -0x1.ed8fafcedfd4fp-4, 0x7.18246c1aec09p-8, -0x2.292d437666b6ap-8, 0xc.0c098156e721p-12, -0x4.8b19c1de2dc7p-12, 0xf.37fffffff4c78p-4 }, /* i=243 70.652 */ - { 0x1.6b68687df638fp+0, -0x1.ecad12c9bb975p-4, 0x7.11ad65fe7b1b8p-8, -0x2.262d15f12e972p-8, 0xb.f56cfa4c1af58p-12, -0x4.80548ad59cabcp-12, 0xf.480000003e4fp-4 }, /* i=244 70.668 */ - { 0x1.6b49a4bc4fb6p+0, -0x1.ebcb4415a2f0cp-4, 0x7.0b3f57f65805p-8, -0x2.233288d84abe8p-8, 0xb.df06001451878p-12, -0x4.75ae2d1c3ae4cp-12, 0xf.5800000137bep-4 }, /* i=245 70.684 */ - { 0x1.6b2aef112d00ep+0, -0x1.eaea4294c4d8ap-4, 0x7.04da313647304p-8, -0x2.203d8edc36eep-8, 0xb.c8d3f979c1afp-12, -0x4.6b26411818c7cp-12, 0xf.680000004d18p-4 }, /* i=246 70.699 */ - { 0x1.6b0c476fbe603p+0, -0x1.ea0a0d2b1b796p-4, 0x6.fe7de1179a9dp-8, -0x2.1d4e1ad27d2c8p-8, 0xb.b2d64f1effe88p-12, -0x4.60bc60b0909cp-12, 0xf.780000004f59p-4 }, /* i=247 70.716 */ - { 0x1.6aedadcb4d608p+0, -0x1.e92aa2beeaea9p-4, 0x6.f82a571c7f1e8p-8, -0x2.1a641fb6f1cfap-8, 0xb.9d0c6be17ffcp-12, -0x4.56702775473b4p-12, 0xf.880000001af1p-4 }, /* i=248 70.731 */ - { 0x1.6acf221732c71p+0, -0x1.e84c023873904p-4, 0x6.f1df82ed7acf4p-8, -0x2.177f90aa40cecp-8, 0xb.8775bc756c568p-12, -0x4.4c41325ac273p-12, 0xf.97ffffffc27d8p-4 }, /* i=249 70.747 */ - { 0x1.6ab0a446d8578p+0, -0x1.e76e2a81fb3cfp-4, 0x6.eb9d545964758p-8, -0x2.14a060f1a14p-8, 0xb.7211af78d8788p-12, -0x4.422f1fdadf3a4p-12, 0xf.a7ffffff921e8p-4 }, /* i=250 70.761 */ - { 0x1.6a92344db8424p+0, -0x1.e6911a87c53d3p-4, 0x6.e563bb54dfc84p-8, -0x2.11c683f651252p-8, 0xb.5cdfb55752cp-12, -0x4.38398fed3149p-12, 0xf.b80000004b85p-4 }, /* i=251 70.778 */ - { 0x1.6a73d21f61d8p+0, -0x1.e5b4d13830a31p-4, 0x6.df32a7faedf1cp-8, -0x2.0ef1ed4590aeep-8, 0xb.47df409951498p-12, -0x4.2e6023e6d831p-12, 0xf.c80000009bc8p-4 }, /* i=252 70.792 */ - { 0x1.6a557daf74927p+0, -0x1.e4d94d8390583p-4, 0x6.d90a0a8b846ep-8, -0x2.0c22908fb6d7p-8, 0xb.330fc54ef2078p-12, -0x4.24a27e8c56c24p-12, 0xf.d7ffffffa51a8p-4 }, /* i=253 70.809 */ - { 0x1.6a3736f19a9c5p+0, -0x1.e3fe8e5bfff7fp-4, 0x6.d2e9d36a10a58p-8, -0x2.095861a73faeep-8, 0xb.1e70b9983501p-12, -0x4.1b00440c49fep-12, 0xf.e7ffffffd3a88p-4 }, /* i=254 70.824 */ - { 0x1.6a18fde8aede9p+0, -0x1.e32493228aa7ep-4, 0x6.ccd1f6299285cp-8, -0x2.069355e2ce8eep-8, 0xb.0a019f6843748p-12, -0x4.11791ea2793p-12, 0xf.f7fff7fffd878p-4 }, /* i=255 70.84 */ -}; +static inline double sum(double xh, double xl, double ch, double cl, double *l){ + double sl, sh = twosum(xh,ch, &sl); + *l = (xl + cl) + sl; + return sh; +} -static const double pi_hi = 0x1.921fb54442d18p1; -static const double pi_lo = 0x1.1a62633145c07p-53; +static inline double muldd(double xh, double xl, double ch, double cl, double *l){ + double ahhh = ch*xh; + *l = (cl*xh + ch*xl) + __builtin_fma(ch, xh, -ahhh); + return ahhh; +} -/* For the slow path, use polynomials of degree DEGREE (thus with DEGREE+1 - coefficients), with coefficients of degree < LARGE represented as - double-double, and coefficients of degree >= LARGE as double only. - Thus each polynomial needs DEGREE+LARGE+1 'doubles'. */ -#define DEGREE 11 -#define LARGE 8 +static inline double polydd(double xh, double xl, int n, const double c[][2], double *l){ + int i = n-1; + double ch = fasttwosum(c[i][0], *l, l), cl = c[i][1] + *l; + while(--i>=0){ + ch = muldd(xh,xl, ch,cl, &cl); + ch = fastsum(c[i][0],c[i][1], ch,cl, &cl); + } + *l = cl; + return ch; +} -/* Each entry contains a degree 11-polynomial and the evaluation point xmid, - so that: - * for |x| < 0.5, i.e., 0 <= i < 64, acos(x)-pi/2 ~ p(x-xmid); - * for 0.5 <= |x| < 1, acos(1-x) ~ sqrt(x)*p(x-xmid). - The coefficients of degree < LARGE are stored as two double numbers (most - significant first). - Generated with: - Gen_P_aux(11,128,threshold=64,large=8,verbose=true,slow=1,prec=128). */ -static const double T2[128][DEGREE+LARGE+2] = { - { 0x7.3f7b5c6f3abcp-120, 0x6.aa86b9baf9cab614bp-176, -0x1p+0, -0x4.045deep-104, 0x5.e6990ab0c2dd8p-92, -0x7.40b83a2b1b71454c98p-148, -0x2.aaaaaaaaaaaaap-4, -0xa.aaaae0ef10118e456p-60, 0x1.0160b49131a62p-68, -0x7.963a9045d1a6daedf2p-124, -0x1.3333333333333p-4, -0x6.015892f570086cb23ep-60, 0x4.f0883d2b50248p-52, -0xc.e10e4b3894d2b935c8p-108, -0xb.6db6db6e11cd8p-8, 0x2.bcd79079f2c4abcc19p-60, 0x4.4f35e4ec4bd2p-36, -0x7.c71c9380dc4fcp-8, 0x9.eba442f49964p-24, -0x5.bb98b11f1845p-8, 0x0p+0 }, /* i=0 117.1 */ - { -0x3.0004801239fb4p-8, 0x1.c7305887fe50696224p-64, -0x1.0004801e60e3dp+0, -0x7.023ec56b5ce7e77d04p-56, -0x1.801440e3d9586p-8, -0x6.9ef9beeedeb98a93f8p-64, -0x2.ab16b2941ef82p-4, 0xb.58b641169bbd0d67e8p-60, -0x1.202a33a27b15fp-8, -0x2.6b29211b91f914266p-68, -0x1.33ba46964a456p-4, 0x4.828c4ec205b6156d5ap-60, -0xf.044f1d0a0794p-12, 0x3.3528852e9ea44128f5p-64, -0xb.779131c48b988p-8, 0x2.06e1efb066f0b5a5fdp-60, -0xd.263c033a0cbbp-12, -0x7.d2335f752895p-8, -0xb.d88311b4bd9ep-12, -0x5.c672cfed3749p-8, 0x3p-8 }, /* i=1 115.6 */ - { -0x5.0014d63fc2f6p-8, 0x9.a9afbebc108d40843p-64, -0x1.000c80ea73147p+0, -0x1.603503f2bf69be97eep-56, -0x2.805dcb72fdedep-8, -0x7.ac245975dcd852336p-64, -0x2.abd6e7bd684fcp-4, 0x7.88b3d8f7ca980ee054p-60, -0x1.e0c37ec3b2803p-8, -0x5.22092fe7b71318476cp-64, -0x1.34aac8e3e936fp-4, -0x1.77055e8d9b0c603406p-60, -0x1.913f80fa00244p-8, -0x6.0cc691b2f88cf6cdcap-64, -0xb.8920e8cb460dp-8, 0x2.12732af294d8d7d6fp-60, -0x1.5fce7e060e262p-8, -0x7.e5fdcce61d648p-8, -0x1.3d71c9158346fp-8, -0x5.dc43c52ba8a18p-8, 0x5p-8 }, /* i=2 114.8 */ - { -0x7.00392f97c0c1p-8, -0x1.8d9822a9352bd84d68p-60, -0x1.00188384efb56p+0, -0x1.9e38be72f1d290f8fep-56, -0x3.81017d9a51848p-8, 0xf.fcc8c7cd6f1c44381cp-64, -0x2.acf7956d0c9c2p-4, 0x7.ddc8ba05bfed073b6cp-60, -0x2.a218ebb0302p-8, -0xe.00782f64664d278648p-64, -0x1.361472d1cef2cp-4, 0x5.0c23d206cb3877fa52p-60, -0x2.336e056048622p-8, -0x1.048359d7b3775c4604p-64, -0xb.a3944f235132p-8, -0x1.12ae0f735fdf980c9p-60, -0x1.eef7e59d50c2bp-8, -0x8.03dc4d4a96668p-8, -0x1.bfb5e8527c3b4p-8, -0x5.fd45609a9ba9p-8, 0x7p-8 }, /* i=3 114.3 */ - { -0x9.0079914fef96p-8, 0x7.9919e3720f5e815e2p-64, -0x1.0028899ee96f2p+0, 0x1.f02d504dc33579b604p-56, -0x4.8223988e5f804p-8, 0x1.24e896e2c72391bde8p-64, -0x2.ae792caf62116p-4, -0x5.23e2c1d0e9d717da98p-60, -0x3.6476851ae3a1p-8, -0xa.bf28a954b0a89afd8p-68, -0x1.37f85a3916f82p-4, -0x7.37fa8a155055dd7a5ep-60, -0x2.d74dd09a504ap-8, -0xf.065d667385196c9ee8p-64, -0xb.c70d046f05548p-8, -0x1.e9e639fb20fcf44c84p-60, -0x2.809742069052p-8, -0x8.2c07a71b58808p-8, -0x2.454e4a438e228p-8, -0x6.29cf5a1f56cp-8, 0x9p-8 }, /* i=4 113.9 */ - { -0xb.00de0491731ap-8, -0x2.33c42de1b15e0e5137p-60, -0x1.003c957ad60cbp+0, 0x2.e8ebcafcc589a16c38p-56, -0x5.83e88f0f3777p-8, 0x1.0ca00567fa6daae4dp-60, -0x2.b05c44c66c612p-4, -0x9.43d6bdadd054bcc944p-60, -0x4.282920e5796c4p-8, 0xc.a9d711debd8dcd7f08p-64, -0x1.3a57f3b4be11ap-4, -0x1.0b22af1783f22e176ap-60, -0x3.7d5e5bcc9102p-8, -0xe.b26e9187cbbc2f8c64p-64, -0xb.f3b840a1318ep-8, -0x1.9da6e2fa8461507dcap-60, -0x3.15688dc464eeap-8, -0x8.5ecc775a3bfb8p-8, -0x2.cf3d87d2daedcp-8, -0x6.6258878f46474p-8, 0xbp-8 }, /* i=5 113.6 */ - { -0xd.016e979c75fbp-8, 0x2.42eeb4bd53f53ac77bp-60, -0x1.0054a9ed716d4p+0, 0x6.a4f0e93b528c03909ep-56, -0x6.867513d1768d4p-8, 0x7.f61f66a00ca15692c8p-64, -0x2.b2a19b9e59876p-4, 0x4.9efcb191227740e90cp-60, -0x4.ed7e9be790fb4p-8, -0x1.5956c1dc457be11ep-64, -0x1.3d35147cb93b5p-4, 0xe.cbf0a41a4c5245662p-64, -0x4.2621ec3ede32cp-8, -0x1.f8d91354acd800b6068p-60, -0xc.29cf2a40e5b38p-8, -0x3.0c42f9cf57cd1f32fdp-60, -0x3.ae2ddec277414p-8, -0x8.9c8bfe0a25d4p-8, -0x3.5e91d54f523b2p-8, -0x6.a77883a9acc4cp-8, 0xdp-8 }, /* i=6 113.3 */ - { -0xf.02335eedc94ep-8, 0x2.1eba39d3cb0b0724d5p-60, -0x1.0070ca5eda78bp+0, 0x4.4698a04828924874e8p-56, -0x7.89ee2818a4314p-8, -0x1.74c41536e8ac2c8f83p-60, -0x2.b54a166032e88p-4, 0x9.7f98a8a1503dd5dab4p-60, -0x5.b4c61705d932p-8, -0x1.7a7d3b17e346b366d88p-60, -0x1.4091f4be69f0dp-4, 0x5.e5e6853ed886151de8p-60, -0x4.d21e3d4b4b37cp-8, -0x1.d321a1f6c23dd76398p-60, -0xc.699743e9e5b78p-8, 0x1.6d23f3e8c1b2b8e291p-60, -0x4.4bb0e2a02b81p-8, -0x8.e5bd23096b05p-8, -0x3.f467e9c697c0cp-8, -0x6.f9e9ccbf379cp-8, 0xfp-8 }, /* i=7 113.1 */ - { -0x1.103347666f892p-4, 0x5.ac543b551ba7a06cep-64, -0x1.0090facbeaf37p+0, 0x3.e9d3c9cdc30da5abccp-56, -0x8.8e792a8e57c6p-8, -0x2.d75c9c599f2963dac1p-60, -0x2.b856c2237e82ep-4, 0xc.bedd5ddd6414dcfd4p-64, -0x6.7e5035e8c7bcp-8, -0x5.838a49ddecc6b7b438p-64, -0x1.44713276eea77p-4, 0x5.ae8683b5279e546554p-60, -0x5.81dd30f34aa1p-8, -0x1.99d60dd06b9805dcd28p-60, -0xc.b362f22f93a8p-8, 0x2.858dff82832e431499p-60, -0x4.eec46f68d846p-8, -0x9.3aedb6f4a101p-8, -0x4.91ee1a7de9498p-8, -0x7.5a8c64dcf1858p-8, 0x1.1p-4 }, /* i=8 112.9 */ - { -0x1.3047a02794911p-4, 0x7.5ac7a969f75addd40ep-60, -0x1.00b53fc7cb3bdp+0, -0x7.5d094975c91de18538p-56, -0x9.943be661eacc8p-8, -0x1.876d7d06081e9e5ac5p-60, -0x2.bbc8d4bfb4916p-4, 0x3.16d54e90819c9634e4p-60, -0x7.4a6f5fa5bf064p-8, -0x1.8ad6654a718ae19b4a8p-60, -0x1.48d5d4d4ce7fdp-4, 0x6.3d5871f3fa3128f8e6p-60, -0x6.35ed8879fad14p-8, -0x1.31014e960e85e3b368p-60, -0xd.07921b4bbbd58p-8, 0x2.c730a8b0ffd5c4d042p-60, -0x5.98462d19700bp-8, -0x9.9cc3f496c07b8p-8, -0x5.3867b62c3bf9cp-8, -0x7.ca68ffa1a3448p-8, 0x1.3p-4 }, /* i=9 112.7 */ - { -0x1.5060c31541da5p-4, -0x6.764f6ab0927a4a3a52p-60, -0x1.00dd9e7dc32bcp+0, 0x3.059549c81809fe094p-56, -0xa.9b5ca2bcd89c8p-8, 0x1.a4f72628dbed900aedp-60, -0x2.bfa1adbe985p-4, 0x3.aa66eb723afdfa9d4cp-60, -0x8.197801b139b9p-8, -0x2.11f0447a80867a97a5p-60, -0x1.4dc350278e557p-4, -0x3.ba7f55aaac29deb9d2p-60, -0x6.eee3a6784cd04p-8, 0x1.af0cc75f9c608cc0ccp-60, -0xd.6692e24b6478p-8, 0x2.7700bfae94b563b806p-60, -0x6.49205cad4c6dp-8, -0xa.0c00485f61528p-8, -0x5.e930acc157e9p-8, -0x8.4ab4ccac41998p-8, 0x1.5p-4 }, /* i=10 112.5 */ - { -0x1.707f33c173a99p-4, 0x4.219874125e4d6fbc06p-60, -0x1.010a1cb349899p+0, -0x5.248e08ea83600a2dep-60, -0xb.a40232985a81p-8, -0x4.3d23c1089ff87ee2p-68, -0x2.c3e2d770aef52p-4, -0x2.d8d086aabe3c43f278p-60, -0x8.ebc0d57504af8p-8, 0x1.545af62ae17c7823ap-64, -0x1.533d8a64de43dp-4, -0x4.a0c9b8699b39a42e7ap-60, -0x7.ad5a5bf99080cp-8, -0x1.820d8993ddddab4bc68p-60, -0xd.d0e27fbaa24b8p-8, -0x3.683aa4518d38a3351bp-60, -0x7.024bc1d797d34p-8, -0xa.897f64655fe28p-8, -0x6.a5c191ee2fb8p-8, -0x8.dcd5f08f398f8p-8, 0x1.7p-4 }, /* i=11 112.3 */ - { -0x1.90a376809684p-4, -0x5.2435c5b68d2c3a5204p-60, -0x1.013ac0ca53a83p+0, 0x2.1f08fb5d1d627cc792p-56, -0xc.ae5405014de58p-8, 0x1.56ab9d57cd0e1038f6p-60, -0x2.c88e08253eb86p-4, 0xf.344d66e572456c1bacp-60, -0x9.c1a328eabd9p-8, 0x1.24ab251dba978ccee6p-60, -0x1.5948e04c44b89p-4, -0x5.d8f7f5babd05ee859p-60, -0x8.71f3c24d51c88p-8, 0x2.6188a395951b5c9dcfp-60, -0xe.470e3a26adb5p-8, -0x5.231dd02d10e247984p-64, -0x7.c4d1b50ea10e4p-8, -0xb.163ca8a8aaaap-8, -0x7.6fb40a52fedfcp-8, -0x9.8268c1b2fba68p-8, 0x1.9p-4 }, /* i=12 112.1 */ - { -0x1.b0ce107d3f69p-4, -0x7.c8e4c30e758d9ec1dap-60, -0x1.016f91c3e7096p+0, -0x5.f82ca03392f122b39p-56, -0xd.ba7a35d8032p-8, 0x3.9ee9e0d1178da88f4ep-60, -0x2.cda52387715p-4, -0x2.6022c3923504cec20cp-60, -0xa.9b7b2aa0c284p-8, 0xf.4238579cf985fd2b2p-64, -0x1.5fea2b337ac83p-4, -0xa.a66c4594b7aabdaap-68, -0x9.3d5a235ec4ca8p-8, -0x1.3d91ea217005d02f42p-60, -0xe.c9b4812c5a9ep-8, 0x4.f45716eb5784996d2p-64, -0x8.91ce642495688p-8, -0xb.b354e8974117p-8, -0x8.48c7b53893098p-8, -0xa.3d45e2882bd5p-8, 0x1.bp-4 }, /* i=13 112.0 */ - { -0x1.d0ff87cc3a7a5p-4, 0x2.ddab47f13b2d58bef2p-60, -0x1.01a89742ef0f4p+0, 0x5.2b6ac9787ebb47ac52p-56, -0xe.c89d9f1a377dp-8, -0x1.f159171ce24c99081ep-60, -0x2.d32a3c226a11p-4, 0x9.463d6bfe442e0ea61cp-60, -0xb.79a839968fc1p-8, -0xf.e837e6f2394f3a8f9p-64, -0x1.6726c78718976p-4, -0x5.7ae9796351e274d83ep-60, -0xa.1040f28ac7e8p-8, 0x8.0cee182f857e4799p-68, -0xf.59862e3224898p-8, -0xc.e5e7d1e4563487d4bp-64, -0x9.6a73485883dcp-8, -0xc.620998566504p-8, -0x9.32e7a71a1b99p-8, -0xb.0f8956f3b24cp-8, 0x1.dp-4 }, /* i=14 111.8 */ - { -0x1.f1386380f8b9ap-4, -0x4.9c5b12bdd5536e8c08p-60, -0x1.01e5d98f59023p+0, -0x4.45eff70ad666bfde72p-56, -0xf.d8e7eac635b18p-8, -0x3.a68cad6f53b93ead07p-60, -0x2.d91f950e583c8p-4, 0x6.932e39fb5cc7aa1a94p-60, -0xc.5c8d396544bf8p-8, 0xe.79e7b00e522176f7fp-64, -0x1.6f049c0cbc9c2p-4, 0x2.6d9229c6d4b46e8228p-60, -0xa.eb65d81c5a4p-8, 0x3.fad11ca5521eeaa6cdp-60, -0xf.f747ee61e58e8p-8, 0x2.df6aa762e23fe3e99ap-60, -0xa.5009d9967f258p-8, -0xd.23c46e0185468p-8, -0xa.30308c0f8f3e8p-8, -0xb.fb9ab830b4d58p-8, 0x1.fp-4 }, /* i=15 111.6 */ - { -0x2.11792bc265cdep-4, -0x6.328f56db8108a55208p-60, -0x1.0227619978f0bp+0, 0x3.0656c72a57a6533c08p-56, -0x1.0eb83a566e63dp-4, 0x7.251e63a30fa9cfc33ap-60, -0x2.df87a3c8ca8dp-4, 0x9.883cde197831344cd8p-60, -0xd.4490eb31cb188p-8, -0xe.168557f111584a942p-64, -0x1.778a21f58a06dp-4, -0x3.3e6e5784ce083ad74p-60, -0xb.cf91d1ccffee8p-8, -0x3.9f7367505278b48c68p-60, -0x1.0a3d3d9f8f18ep-4, 0x7.6ebf6d08dabbd16c54p-60, -0xb.43f6878a23f98p-8, -0xd.fa1b84fd953c8p-8, -0xb.42f78c71bdc8p-8, -0xd.0436b08dd4288p-8, 0x2.1p-4 }, /* i=16 111.5 */ - { -0x2.31c269e02f15ep-4, -0xf.41b37d98e3a044cdp-60, -0x1.026d38fdba2bep+0, -0x7.794dc2a8f64a0c491p-56, -0x1.2009c51597f42p-4, -0x4.6f04486e9add4e2774p-60, -0x2.e665123aca37cp-4, -0x4.6ef3df6bbc32896facp-60, -0xe.321e4beff543p-8, -0x3.350188a881b79f85efp-60, -0x1.80be6dd1b731p-4, -0x2.eb9e3c4f6c9c44d032p-60, -0xc.bd9a6ae3b949p-8, 0xb.5ed30daa57b2eb371p-64, -0x1.1601b3d97dadp-4, -0x5.8714b39c36f458825p-60, -0xc.47bc023855868p-8, -0xe.e6d613b3f3a78p-8, -0xc.6dd211ec9b468p-8, -0xe.2c79ef890a248p-8, 0x2.3p-4 }, /* i=17 111.3 */ - { -0x2.5214a86885ad4p-4, 0x1.d1c5881b1ed7659904p-60, -0x1.02b76a089e6c7p+0, 0x3.16a7a2c3fc121f5c98p-56, -0x1.3185e7ade82bfp-4, -0xe.91cc6b81d3e03829cp-64, -0x2.edbac0ef89fdcp-4, 0x7.56c7a4942c839bc0cp-64, -0xf.25a4f889006fp-8, -0x2.a50982f79cd284c945p-60, -0x1.8aa93977f279bp-4, 0x5.479cb46e445b88c8c4p-60, -0xd.b6630ed2dfa1p-8, 0x3.fd7d4834c1b6bc186cp-60, -0x1.22d289ae01667p-4, 0x7.7eb10a5064cc1cbf28p-60, -0xd.5cfedd111bab8p-8, -0xf.ebf1c6900fc18p-8, -0xd.b39e8fba3c12p-8, -0xf.77edcf4c490f8p-8, 0x2.5p-4 }, /* i=18 111.1 */ - { -0x2.7270733e656b8p-4, 0xb.af991a19247bcb8204p-60, -0x1.0305ffbb0ef02p+0, 0xc.dca961eab7a38a93cp-60, -0x1.432f7cd08d4c2p-4, -0x7.7bc78583db43102ed6p-60, -0x2.f58bc97ec2268p-4, 0xc.56636f9e4c8336df38p-60, -0x1.01f9998845356p-4, -0x7.4f8b620d04d1bd813ep-60, -0x1.9552eef5a94d6p-4, -0x3.10dccd6c8321f3cf9cp-60, -0xe.bade79847de38p-8, 0x3.102e8058f824009ee1p-60, -0x1.30c21e667e797p-4, -0x3.a7900ba2879eab74b4p-60, -0xe.858998d793b78p-8, -0x1.10ba8d60520b3p-4, -0xf.178e76104ce98p-8, -0x1.0ea96ee54d91cp-4, 0x2.7p-4 }, /* i=19 111.0 */ - { -0x2.92d657b06b572p-4, 0x1.5f053e118fc42bc28cp-60, -0x1.035905cf0331fp+0, -0x5.f6db1637cbc28a235ap-56, -0x1.55097279eec0cp-4, -0x2.e403f26c56fcd84e3ep-60, -0x2.fddb812e2519p-4, -0x8.7eeb9bac4d70bed068p-60, -0x1.120764fdf4128p-4, -0x6.e6c6a98a5af9c13ee2p-60, -0x1.a0c4b49fc1d9cp-4, 0x7.b242896efd644807acp-60, -0xf.cc1048ded555p-8, -0x2.bc0e71168febf440f9p-60, -0x1.3fe4b09dfb36fp-4, 0x6.32a4339d39f90a0fa4p-60, -0xf.c351226350db8p-8, -0x1.24878f0be7f28p-4, -0x1.09d317f0270d7p-4, -0x1.289060bb8114fp-4, 0x2.9p-4 }, /* i=20 110.8 */ - { -0x2.b346e490467d4p-4, -0x1.30e178922672fd2c68p-60, -0x1.03b088bc812e1p+0, 0x2.119e8ed372a11f815ap-56, -0x1.6716cb603786fp-4, -0x5.6317b8423125af174p-64, -0x3.06ad7bcdb27cap-4, -0x5.16a305d39a37fef34p-64, -0x1.228bb38d02e07p-4, 0x3.a14c45243915b3026p-60, -0x1.ad087a5e24c33p-4, 0x2.450edc78a8178d70dep-60, -0x1.0eb0eb371206cp-4, -0x4.fdf30a636a9e21f00ap-60, -0x1.50508b232eab5p-4, -0x6.5c264af8217838722ep-60, -0x1.11879d6252324p-4, -0x1.3a52b1701817cp-4, -0x1.248828a6eef18p-4, -0x1.4586b822402b8p-4, 0x2.bp-4 }, /* i=21 110.6 */ - { -0x2.d3c2aa4acea2ep-4, -0xc.315ad6689e72168f98p-60, -0x1.040c95befb7d1p+0, 0x3.b1a461ad7a28d28abap-56, -0x1.795aa073c56c8p-4, -0x9.33d886ca0fdd40dbap-64, -0x3.10058ed3113fap-4, -0x3.d1aba8e7be20147b64p-60, -0x1.338eee642e1f4p-4, 0x4.5714dad9d3e98eaa44p-60, -0x1.ba29084f92f49p-4, -0x5.5370ea96251be21f8p-64, -0x1.2190468acf9bp-4, -0x5.5127ded530c6bd86a6p-60, -0x1.621e3727e7c78p-4, -0x2.a2f5d1dc888a5e5bfcp-60, -0x1.2875d1a8b50d1p-4, -0x1.524dc88cab4e2p-4, -0x1.41df6471ee683p-4, -0x1.65eadcde5c842p-4, 0x2.dp-4 }, /* i=22 110.5 */ - { -0x2.f44a3b00ccd56p-4, 0x6.702830319a344089e4p-60, -0x1.046d3adb11f07p+0, 0x3.dc6ff72fe1cb76278p-60, -0x1.8bd8227304d5ep-4, 0x2.6dd1e7608ace4a54e8p-60, -0x3.19e7d4b884948p-4, 0xd.5afa3bae7a3c1de7f4p-60, -0x1.4519eefef5627p-4, 0x3.e458efeec61765868cp-60, -0x1.c8320ee6bf6efp-4, -0x5.d64f0cc41088973abap-60, -0x1.357329f94ff5fp-4, -0x4.d738dc6af07c93d69cp-60, -0x1.7568b45ec53aap-4, 0x2.ac4be3f96228aee4e8p-60, -0x1.4128fa5eaf9aep-4, -0x1.6cb08ed6dcd48p-4, -0x1.6228bf162570bp-4, -0x1.8a2839d638ff6p-4, 0x2.fp-4 }, /* i=23 110.3 */ - { -0x3.14de2aa082788p-4, -0x9.9347563cf5335bf33cp-60, -0x1.04d286e4b9beep+0, 0x6.5ff7c4d67d8fe41c8p-60, -0x1.9e929b935d8cbp-4, 0x5.4f4bed6482d1c36ed8p-60, -0x3.2458b0a485f12p-4, -0x6.54509f2931def72818p-60, -0x1.573608902158fp-4, 0x1.9b9b9cc35fe91832fcp-60, -0x1.d73038a58a9b9p-4, 0x6.ecafec3c958a32ca6p-60, -0x1.4a6f3595f97d7p-4, -0x1.614178c211dd9d09dap-60, -0x1.8a4db7be4a7a4p-4, 0x5.6abb5e2f9ce0d3bd7cp-60, -0x1.5bce88783dcbcp-4, -0x1.89b95e198a6efp-4, -0x1.85be07b51b4b3p-4, -0x1.b2b920234581dp-4, 0x3.1p-4 }, /* i=24 110.2 */ - { -0x3.357f0efffc1dp-4, 0xd.ad54442f02da6edb6p-60, -0x1.053c8985d2bc9p+0, -0x1.8e1719e46120dc2566p-56, -0x1.b18d7140f4d4p-4, -0x6.2d362cc209fbea3cf8p-60, -0x3.2f5cd25f8fa7ap-4, -0x5.01653de3685c3b8d88p-60, -0x1.69ed12265aa66p-4, 0x5.137c99e920d196265cp-60, -0x1.e7313d9f9a867p-4, 0x1.7fa6787634d28cb1cp-64, -0x1.609bbde37b139p-4, 0x6.82e7720d713b345f08p-60, -0x1.a0edf1b99c119p-4, -0x2.087ba1015e96dd9e4p-60, -0x1.789890e99d2eap-4, -0x1.a9ae01fb55853p-4, -0x1.ad04480ebc302p-4, -0x1.e028f73f1b549p-4, 0x3.3p-4 }, /* i=25 110.0 */ - { -0x3.562d7ff83e1bap-4, 0x8.b23961f0e00283c984p-60, -0x1.05ab53452f914p+0, 0x6.da82e0193d6eae4efcp-56, -0x1.c4cc25f72be96p-4, 0x5.dbd1c3c38119a7eebap-60, -0x3.3af93a9e3219p-4, 0xe.f01d760fffc06bbb88p-60, -0x1.7d49719d7d85cp-4, 0x7.fd080542b5ea5c2b3ap-60, -0x1.f843f8f272342p-4, 0x7.2725662d988253ef1p-60, -0x1.7811f7b07f32cp-4, -0x2.9dc3fbf176ccab11f8p-60, -0x1.b96d5cdc146f9p-4, 0x1.c0d69123a6057eab9p-60, -0x1.97be5ae8fcbf8p-4, -0x1.ccdca7ef41792p-4, -0x1.d86d57ad21b5fp-4, -0x2.1316c7608e0f8p-4, 0x3.5p-4 }, /* i=26 109.8 */ - { -0x3.76ea178159bdep-4, 0x4.9138ee4b1d0db1583cp-60, -0x1.061ef58e175b7p+0, -0x7.4d9691355bf43c913ap-56, -0x1.d8525b33e883bp-4, -0x1.2dfb1df665b1796fa8p-60, -0x3.47333fa62a632p-4, 0xf.8abeaaa0d6895c0d7cp-60, -0x1.915627713e873p-4, -0x1.3657b3a8bb5a07ad22p-60, -0x2.0a788066acfp-4, 0xf.9549cd6ffaf04921dp-60, -0x1.90ed2881a903ap-4, -0x4.2ade80042745f060c8p-60, -0x1.d3f395d608c31p-4, -0x6.d43866e9b9fea9f814p-60, -0x1.b97d003824c88p-4, -0x1.f39cf0efaf657p-4, -0x2.0879ab5fc629ap-4, -0x2.4c382d81876a4p-4, 0x3.7p-4 }, /* i=27 109.7 */ - { -0x3.97b571cf7a8ccp-4, -0xb.dc6cf43cf0f67cc048p-60, -0x1.069782b847ba6p+0, 0x7.7811e9e7adfc10abcap-56, -0x1.ec23d387df2b4p-4, -0x1.aebaa64c1536545cd2p-60, -0x3.54109255de6d8p-4, 0x6.ed5d5e4683a839e18p-60, -0x1.a61edb87d792ap-4, -0x4.9c0917f45d483e4ea8p-60, -0x2.1de03e7436cfap-4, 0x5.da6682f40fc716203p-60, -0x1.ab4adc154b6cp-4, 0xb.a6b8c5ed7613b6fd6p-64, -0x1.f0ac3e2f2a27dp-4, -0x3.4b1755eb1f8ef63f28p-60, -0x1.de182202eef3ep-4, -0x2.1e512a199359ep-4, -0x2.3dba6adeadc92p-4, -0x2.8c5ccb63213cap-4, 0x3.9p-4 }, /* i=28 109.5 */ - { -0x3.b8902d70fc4bcp-4, -0xf.c95f78e45444028cf4p-60, -0x1.07150e107ec92p+0, -0x6.2f7adccb6183b5ep-68, -0x2.004474c645cep-4, -0x1.2ecbc9cead273601dcp-60, -0x3.619743966155ap-4, -0xa.d1321efd05edf21884p-60, -0x1.bbafeb0dd91c5p-4, 0x5.47dd35303e8f864a62p-60, -0x2.328e0eea5ab92p-4, 0x6.840939050bbcaee1bcp-60, -0x1.c74b1f9f53817p-4, 0x1.03c112c3b1db775332p-60, -0x2.0fc76afebfa5p-4, 0x9.ad2bee3dcc7aff22f8p-60, -0x2.05dab5423ec4p-4, -0x2.4d67b21350e38p-4, -0x2.78d3d825cc89cp-4, -0x2.d47249519f738p-4, 0x3.bp-4 }, /* i=29 109.3 */ - { -0x3.d97aeb6d9b1ep-4, -0xd.7d17d85154db0b236p-60, -0x1.0797abe195398p+0, -0x4.d76f40edee54d158fcp-56, -0x2.14b84a568837ap-4, 0xa.deb2e2360b9aa7eec8p-60, -0x3.6fcdca40f6a5p-4, 0x5.ec556d3f78065cfa8cp-60, -0x1.d216777eea9ecp-4, 0x2.d93ffb2e307de20a8cp-60, -0x2.48965e8464d2ap-4, -0xb.c15c1c05fcbaf1982cp-60, -0x1.e510c3707c1b8p-4, -0x7.456d295d5ea2087ffep-60, -0x2.317a213c721ccp-4, 0x6.18082801d94df180a8p-60, -0x2.3117ea064eae4p-4, -0x2.815c9225baa02p-4, -0x2.ba8016235f49ep-4, -0x3.25890384d8b9cp-4, 0x3.dp-4 }, /* i=30 109.2 */ - { -0x3.fa764f66d066p-4, -0x9.8ecb00191242f74af4p-60, -0x1.081f717e3165ep+0, -0x2.5ac18e65bde23e013ep-56, -0x2.298387aad08bep-4, 0x1.de6c5d9cef5ee883dcp-60, -0x3.7ebb0981f4e28p-4, 0xd.ee8d56acb6c5a425dcp-60, -0x1.e96076fa48a37p-4, -0x6.42508937471f6098b2p-60, -0x2.600f4dbc8791ap-4, -0xa.dfc1e746dc170eb274p-60, -0x2.04c1a3d374744p-4, 0x9.ec97b77fd46723a24p-64, -0x2.55fee176a75f4p-4, -0x3.abb47e8629cc5a9a04p-60, -0x2.602c319176876p-4, -0x2.babb53154de38p-4, -0x3.03925ec1906e8p-4, -0x3.80d981e823b4p-4, 0x3.fp-4 }, /* i=31 109.0 */ - { -0x4.1b82ffb97015cp-4, -0xe.dadddd6e6658663c9p-60, -0x1.08ac754b1cf11p+0, 0x4.9d7d625213f2e205e6p-56, -0x2.3eaa8ade74246p-4, -0xc.3e8db0e4005fe743d8p-60, -0x3.8e6657c3ebcbep-4, -0xe.834dfe9fcb8027a8fcp-60, -0x2.019cc60530faap-4, -0x8.415bbab249e7663ccp-64, -0x2.7910d738cff18p-4, -0xa.1e0b8236fc3a3a157p-60, -0x2.2686fa05a59c8p-4, -0x4.1c318dea901094fedp-60, -0x2.7d9644fec27b4p-4, 0x7.1116f548ca6259b82p-60, -0x2.937e67c979056p-4, -0x2.fa2117266fc22p-4, -0x3.54fabb3851ca6p-4, -0x3.e7cadf03c2002p-4, 0x4.1p-4 }, /* i=32 108.8 */ - { -0x4.3ca1a5a09b654p-4, 0x1.6b73b247c58dd21408p-60, -0x1.093ececa4756p+0, 0x5.7324aeffa310273ddep-56, -0x2.5431df7f99ddp-4, -0x9.82afce910b0870511p-60, -0x3.9ed7862f12f2cp-4, 0x8.490c08239577879cap-60, -0x2.1adb3ae13beaep-4, -0xa.60e5cc0babd81f5abcp-60, -0x2.93b4fa396efcap-4, -0xb.f7dd93ba3f12dc301cp-60, -0x2.4a8db6503b9f8p-4, 0x1.0f00a444a01e35249cp-60, -0x2.a887aee996584p-4, 0x2.f0537bd7860435c334p-60, -0x2.cb81253cfc14ap-4, -0x3.403f045366b5ep-4, -0x3.afca5508b9da2p-4, -0x4.5bfa49e9b3f08p-4, 0x4.3p-4 }, /* i=33 108.6 */ - { -0x4.5dd2ed5a1f3e4p-4, 0x1.a2fb3e84f654a73995p-56, -0x1.09d696a680a83p+0, 0x2.47c0929f0472e3c1ep-56, -0x2.6a1e4187baa92p-4, 0xa.e0e7f5e23873ca784p-60, -0x3.b016e8ca46396p-4, -0x3.384ca8faf9401f12dcp-60, -0x2.352cbaa0e9a52p-4, 0x3.9d37c9105b583df7acp-60, -0x2.b017e97ca701ep-4, 0xa.34ebe7a665a7a0b2cp-64, -0x2.7106e469a87fp-4, 0x4.a35d6e7decb4363dp-60, -0x2.d722139cbd4p-4, -0x5.4fec35f6f6a2ae3f4p-64, -0x3.08b43fd1f14e2p-4, -0x3.8ddd0ba261114p-4, -0x4.15387a248137cp-4, -0x4.df43d7ad25f5p-4, 0x4.5p-4 }, /* i=34 108.5 */ - { -0x4.7f17864c5624cp-4, 0xa.588412338764d188p-68, -0x1.0a73e6bff8b8p+0, 0x3.73c3cc4f16550cb484p-56, -0x2.8074a086f1088p-4, -0xc.6f32d68571adb308cp-64, -0x3.c22d5f4c3ad6ap-4, 0x7.1a154b9017c680211cp-60, -0x2.50a350297ed8ep-4, 0x3.40fffb9ed531128348p-60, -0x2.ce583f1b7d038p-4, 0x9.16bee573a017148034p-60, -0x2.9a281b70bd686p-4, 0xa.93b887fbe3cb66f344p-60, -0x3.09bcda0a8226p-4, -0x2.50a6e72de63fdebd7cp-60, -0x3.4ba6812e3417ap-4, -0x3.e3dd1ccbf3774p-4, -0x4.86a873b7747f4p-4, -0x5.73cce361b686p-4, 0x4.7p-4 }, /* i=35 108.3 */ - { -0x4.a070232da6fap-4, -0x2.340dca0c21a412c9fp-60, -0x1.0b16da398fd6cp+0, -0x6.5297fa72c22cd62bap-60, -0x2.973a23066887ep-4, 0x5.15269d5ed7ff29f15p-60, -0x3.d5245ead25ae2p-4, 0x4.34b0d7e81e89913dccp-60, -0x2.6d524556bd1cep-4, -0x9.ea4c62cfa22823fca8p-60, -0x2.ee9735f33027ep-4, -0xc.f88672bf824ced282cp-60, -0x2.c62bfb018f0dcp-4, -0x1.b5b2819713a3ed375cp-60, -0x3.40b8da38234b4p-4, 0xd.caa15b6486c8ccabd8p-60, -0x3.94f79b147c6dep-4, -0x4.433ed8112596p-4, -0x5.05b054f975cd4p-4, -0x6.1c104851e653cp-4, 0x4.9p-4 }, /* i=36 108.1 */ - { -0x4.c1dd7a2dbbae4p-4, -0x1.0b08737cd3bb19be828p-56, -0x1.0bbf8d8707978p+0, -0x5.7ea6a165241f7047fep-56, -0x2.ae742a26a4e8ap-4, 0x4.154069c9b9d97a9cf8p-60, -0x3.e905fb8ac84fap-4, 0xf.6b559b50cd20a39d74p-60, -0x2.8b4e3e7b2a12cp-4, -0xe.60dd8715de8f9d38a8p-60, -0x3.10f8e942b983cp-4, -0x4.c8b36c7550bd5dfd94p-60, -0x2.f552b71aa94dep-4, -0xa.6e66975ea2eb72764cp-60, -0x3.7c817d3877d5cp-4, 0x9.6c4e2898c21005f8e8p-60, -0x3.e55a634d58bb2p-4, -0x4.ad23d35140274p-4, -0x5.9420ee94d4658p-4, -0x6.daecd187ed12p-4, 0x4.bp-4 }, /* i=37 107.9 */ - { -0x4.e36045208cda4p-4, -0x6.fd9112162b0f9265e8p-60, -0x1.0c6e1e7c2324dp+0, -0x5.410e2454c525f3b8cap-56, -0x2.c628557eca058p-4, 0x6.05694bf57525186e1cp-60, -0x3.fddcf572cabf8p-4, -0xc.af1e2211e4fc5d7474p-60, -0x2.aaad587e8c45cp-4, 0x2.269e36b3f502fe846p-60, -0x3.35a49b3994068p-4, 0xc.5cd7f882f95efd295p-60, -0x3.27e2b4c7cee08p-4, -0x7.cc1c62f46174401fa4p-60, -0x3.bd8e036b04dbcp-4, 0x7.4368b0d9779e2624f8p-60, -0x4.3d97625041fd4p-4, -0x5.22d48b3db64p-4, -0x6.340f1bc91b7dp-4, -0x7.b3b64c8e5a86p-4, 0x4.dp-4 }, /* i=38 107.7 */ - { -0x5.04f941ab613b8p-4, -0x1.71db7c5df95849dda4p-56, -0x1.0d22ac5cc81dep+0, -0x2.3aa9d121ca63604f54p-56, -0x2.de5c87428b502p-4, 0xe.8505b354394a92ea18p-60, -0x4.13b4c329743d8p-4, -0xb.c2f3d1c0dfe84df798p-60, -0x2.cb8749e424328p-4, -0xd.32a02d64bc99a758f4p-60, -0x3.5cc5034e33d68p-4, 0x3.d69498399ff39b02a8p-60, -0x3.5e2939d00d50cp-4, -0x5.df01d900b72ef3b0a8p-60, -0x4.0462f6919d25cp-4, -0x1.a6e26789701839dea88p-56, -0x4.9e8fc1c83075cp-4, -0x5.a5c61e161a24p-4, -0x6.e7dea8d7c3e28p-4, -0x8.aa49c43bc20f8p-4, 0x4.fp-4 }, /* i=39 107.5 */ - { -0x5.26a93173e2498p-4, -0x1.c1d2f6ce8524972b8fp-56, -0x1.0ddd57ee32684p+0, 0x5.60c4175a3bbca84a36p-56, -0x2.f716e8b4f55c2p-4, -0x2.b8f5fdc59ec82bc12cp-60, -0x4.2a99a00544604p-4, 0x1.857d286f49098ea79e8p-56, -0x2.edf5870b14bdap-4, -0x3.783022d722664bf724p-60, -0x3.8688a54f659cep-4, -0x6.9acd36e498acf809bcp-60, -0x3.987b31f8f79fcp-4, -0x5.b2fa1b5b86c057f528p-60, -0x4.5193ce31e24fp-4, 0xf.94babdf63251b30788p-60, -0x5.0940aa500605p-4, -0x6.37a0f2c69d964p-4, -0x7.b24f1edcadep-4, -0x9.c32584684d0b8p-4, 0x5.1p-4 }, /* i=40 107.4 */ - { -0x5.4870da51697c8p-4, 0xa.f3f00c5933244cd12p-60, -0x1.0e9e43894f02dp+0, 0x1.fe18b5e7a90293b0d6p-56, -0x3.105deeeedefep-4, -0x8.64d0e1aaa6b57ae928p-60, -0x4.42989a7aa9258p-4, -0x1.c89e9060121412dc588p-56, -0x3.12136a059013ep-4, 0xf.1d4109a53db39c4adp-60, -0x3.b3223244de9aap-4, -0xe.0534f4060134750b4p-64, -0x3.d7360cd25c95ep-4, -0xa.b0e65b0c17438d2e78p-60, -0x4.a5c4cdc2890acp-4, 0x4.d9e757ba9613229c5p-60, -0x5.7ec7226f6c508p-4, -0x6.da4875c98504p-4, -0x8.968ad074a0a28p-4, -0xb.0385a9ced20bp-4, 0x5.3p-4 }, /* i=41 107.2 */ - { -0x5.6a510680ac7f4p-4, 0x1.35e8dbcb0816dda8298p-56, -0x1.0f65932e53afap+0, -0x9.0802b635672891fbap-60, -0x3.2a3860007bf4ep-4, -0x5.15265b489ff58876f4p-60, -0x4.5bbfa3f62053p-4, 0x1.4ece06c9f4263144e38p-56, -0x3.37fe5e6ee258ep-4, 0xc.b5b4a24a8b914a7aacp-60, -0x3.e2c8f45945354p-4, 0x3.d437351c678e2cae38p-60, -0x4.1ac0b76f21618p-4, -0x1.9ef0c5ca7010cb0246p-56, -0x5.01ad255d7975p-4, -0x1.6682f3d265ed42cea38p-56, -0x6.0064840deb804p-4, -0x7.8fe41d0280c98p-4, -0x9.9838951c8f3b8p-4, -0xc.71862b9971a28p-4, 0x5.5p-4 }, /* i=42 107.0 */ - { -0x5.8c4a84d9f15fp-4, 0x1.e8ea4df76e5db565p-60, -0x1.10336c99ab3f9p+0, -0x5.7a7f42452c8142d712p-56, -0x3.44ad58764b17p-4, -0x1.9b92b9eb996185b54p-60, -0x4.761da2268694cp-4, -0xa.bb3c172a1e749df9c8p-60, -0x3.5fd611b58fd5p-4, 0x7.facdf930857397df0cp-60, -0x4.15b94733b4fbcp-4, 0xb.30bd717825f8349478p-60, -0x4.638cb5f3d70e8p-4, 0x1.4cd2106ddd95676dd8p-60, -0x5.66195f209f848p-4, -0x1.740d074d19a658bf91p-56, -0x6.8f83a15a279a8p-4, -0x8.5ae9ed3aed6a8p-4, -0xa.bb90b7c5675p-4, -0xe.144b8020c43ep-4, 0x5.7p-4 }, /* i=43 106.8 */ - { -0x5.ae5e2909f6e54p-4, 0xd.8ee857e2bcf3b2675p-60, -0x1.1107f75a50748p+0, 0x4.c3dbfa6999c755e966p-56, -0x3.5fc4514a6ff64p-4, 0x7.e271422cf24cfbaafcp-60, -0x4.91c281dd3afcp-4, 0x1.0a443e6aeb49f630adp-56, -0x3.89bca85dae836p-4, -0x9.245287cd529efd5464p-60, -0x4.4c351e592b874p-4, 0x1.ad06c394272f3dd72ap-56, -0x4.b217617d7b168p-4, 0x1.4124567e5e8e4591fb8p-56, -0x5.d3ee251a258bp-4, -0xe.d50b7ca2cc58bcd51p-60, -0x7.2dbeb6a634bdcp-4, -0x9.3e2ac749498bp-4, -0xc.0575b8a3c2d5p-4, -0xf.f4333e9eb369p-4, 0x5.9p-4 }, /* i=44 106.6 */ - { -0x5.d08ccbcdc0adp-4, -0xc.3f474f7bd97c2dd928p-60, -0x1.11e35ce9b3cedp+0, 0x8.e374d3b0ae4b072b2p-60, -0x3.7b85264c76c1ap-4, 0x5.7439e8004d4f7fb608p-60, -0x4.aebf4bae216a8p-4, -0x1.6ade5cf49a71524d2f8p-56, -0x3.b5d6f8d0b339ep-4, 0x5.a961a2590568f798c8p-60, -0x4.86849b688328cp-4, -0x1.c8a0e9272c2111d1a48p-56, -0x5.06eb4f968e428p-4, 0x1.44c144de47dd20514e8p-56, -0x6.4c2b6d9ebd288p-4, 0x1.7c14fa60dd0b80c1458p-56, -0x7.dce64c1eaa5b8p-4, -0xa.3ce0d0b38a358p-4, -0xd.7b91a3f455048p-4, -0x1.21b0e6f1060c5p+0, 0x5.bp-4 }, /* i=45 106.4 */ - { -0x5.f2d74b317a3b4p-4, 0x4.6d49b267f40f1e9a58p-60, -0x1.12c5c8c54b3d2p+0, 0x3.1eb5c819784a14692p-56, -0x3.97f81d0a8bfd2p-4, -0x7.d58da1523c69dfd26cp-60, -0x4.cd263a7e8496p-4, -0xb.0ca9207e2f8ce63e28p-60, -0x3.e44ccc636d8f6p-4, 0x5.5590632799fe7b691p-60, -0x4.c4f6b646f72a4p-4, -0x1.9ccd99fbbd8b7dabe2p-56, -0x5.62a1e94304dep-4, 0x1.a8df74ab4852f127cp-56, -0x6.cff01e491510cp-4, 0x4.0837df25046c4ce838p-60, -0x8.9f0930b815d78p-4, -0xb.5ac05c4c79bd8p-4, -0xf.2478e8be5beep-4, -0x1.494679c1b0585p+0, 0x5.dp-4 }, /* i=46 106.2 */ - { -0x6.153e8ad2a868cp-4, 0x6.8fbd13590e196fbd6p-60, -0x1.13af6889ed89ep+0, 0x6.bb52720a3f089b8f5p-56, -0x3.b525ec485c2a8p-4, 0xe.b8962707447960bcacp-60, -0x4.ed0ad43775714p-4, -0x1.3a07bc876f6e62fe8f8p-56, -0x4.1549275145fccp-4, -0xc.6312689175b8fd1bdp-60, -0x5.07e1f9a133d38p-4, 0x1.b43eaaac308d989ad8p-56, -0x5.c5e538a23356p-4, -0x1.1cddb1d4d55dedc28b8p-56, -0x7.607e38b37a024p-4, 0xf.4b42cf83d04f0faf7p-60, -0x9.767dbf6ff25bp-4, -0xc.9c0bcb92192e8p-4, -0x1.107d3cd657638p+0, -0x1.76dd735689583p+0, 0x5.fp-4 }, /* i=47 106.0 */ - { -0x6.37c37425e4e1p-4, -0x8.53ee398078eac375f8p-60, -0x1.14a06c111e9abp+0, 0x1.576036fe881f2758ap-60, -0x3.d317c4111ddfep-4, -0x7.9ee9fca5c9c33c9adp-60, -0x5.0e8204d6a29dp-4, -0x3.63895582e73339cb38p-60, -0x4.48fa9885734dp-4, 0x1.7480b66193a4dcb5a9p-56, -0x5.4fa5567f8571cp-4, 0x1.cbeab9ff4470960633p-56, -0x6.3171f5479150cp-4, 0x1.eb8eef8ae36724d7cc8p-56, -0x7.ff3fa756c991p-4, 0x1.4a380399c690a8f4dep-56, -0xa.65eca95307fc8p-4, -0xe.05aafa41a849p-4, -0x1.32e8fde6df549p+0, -0x1.ab76969d8a808p+0, 0x6.1p-4 }, /* i=48 105.8 */ - { -0x6.5a66f6c0644e4p-4, 0x1.b53a9536565c3cfe55p-56, -0x1.159905907522cp+0, -0x1.2ab039a4dd5bef6922p-56, -0x3.f1d75673bfe0ap-4, 0xd.9feedc27251a377f98p-60, -0x5.31a23c1fdb2fp-4, -0xe.cb8ddf0402274f97p-64, -0x4.7f9392284f734p-4, -0x2.8043021e6e18e8481p-60, -0x5.9ca9121509eb4p-4, -0xf.8e5b920f3d973c3e08p-60, -0x6.a619d8c02b9fp-4, 0x1.2d7c958df8249bddbap-56, -0x8.adcbc4f82b35p-4, -0x3.6b9d43ecf246fe573p-56, -0xb.705d89fb56818p-4, -0xf.9d46e3b5653bp-4, -0x1.5a31b012142dap+0, -0x1.e84196012190fp+0, 0x6.3p-4 }, /* i=49 105.6 */ - { -0x6.7d2a08a58d1ecp-4, 0x1.71ef7327550cd438838p-56, -0x1.169969bb465b6p+0, -0x6.2868ede5b9c003a64ep-56, -0x4.116ee0f9da134p-4, -0x4.261e15125a91db9338p-60, -0x5.56838e39a5c6cp-4, -0xe.a453c41af73cf0d92p-60, -0x4.b94acc08d8834p-4, 0x3.15f21a5ac38b4909f8p-60, -0x5.ef5fd16c78ba4p-4, -0x3.26243b89f9eb5bf278p-60, -0x7.24c6464cc360cp-4, 0xe.5c650dbe668ee2ff1p-60, -0x9.6dedbdd3797fp-4, 0x2.02a1dad8accc2d9eafp-56, -0xc.994599d08fe3p-4, -0x1.1696a567a37ccp+0, -0x1.871aa3378a081p+0, -0x2.2ea66a3b041b8p+0, 0x6.5p-4 }, /* i=50 105.3 */ - { -0x6.a00da698eaaap-4, 0x4.de9e53952b1db5546p-60, -0x1.17a1cfe6c8b8dp+0, -0x1.a5eccfa2a616d84b2p-56, -0x4.31e936ebda1ccp-4, -0x5.10bce18cd1d4e48cb8p-60, -0x5.7d3fd788addb4p-4, -0x9.993a8a508577eab8p-60, -0x4.f65bb1217dba4p-4, -0xa.bdfeb076b3be78dcb8p-60, -0x6.4847c72448b7cp-4, 0x3.0cbe45f1ed98df0abp-60, -0x7.ae7b52b3d5c24p-4, 0x8.6d5d81e1c242c65198p-60, -0xa.41abef647e8d8p-4, -0x3.0d3feb175ea5951829p-56, -0xd.e498e1cec387p-4, -0x1.371a8b7be0a7cp+0, -0x1.ba88e799161fp+0, -0x2.8050aca9f9794p+0, 0x6.7p-4 }, /* i=51 105.1 */ - { -0x6.c312d474cee18p-4, -0x1.beb0350ac9f2184874p-56, -0x1.18b27230e36f8p+0, 0x3.2bb1d164c3df158772p-56, -0x4.5351cc76fa33p-4, 0x5.41dee430f0ff3148p-68, -0x5.a5f2e4287257p-4, -0x1.c076f617343e58b19a8p-56, -0x5.3706d9a479b9p-4, 0x4.d6f8e3b1230355f488p-60, -0x6.a7ec081372f28p-4, -0x1.9af47f4bb1b6bd88bf8p-56, -0x8.445b3b4191c38p-4, -0x2.bae3e05f1482056b0bp-56, -0xb.2b5072882d748p-4, 0x3.5f2bbf548f49ccb2c9p-56, -0xf.56de68970264p-4, -0x1.5becc0fcabeecp+0, -0x1.f589b0cede34dp+0, -0x2.df3d6d22f185ap+0, 0x6.9p-4 }, /* i=52 104.9 */ - { -0x6.e63a9d85fbce8p-4, -0xf.28344ce2b74e3c76bp-60, -0x1.19cb8da9e60cbp+0, -0x6.58873022d31ebfc1e8p-56, -0x4.75b4c2cbeafa4p-4, -0x1.7b46723fb3e861e3e68p-56, -0x5.d0ba9b6bce64cp-4, 0x1.8f9bef9d13bb6dd332p-56, -0x5.7b929330329a4p-4, -0x9.8716e98891aab3e85p-60, -0x7.0ee60c744e6ap-4, -0x1.27fee63fc381cc508d8p-56, -0x8.e7aa5da7a7b7p-4, -0x1.a03a5f9d2c306857ffp-56, -0xc.2d7303e798da8p-4, -0x1.60a9cdb5865d7202c2p-56, -0x1.0f547e8e66b4ap+0, -0x1.85b0bdd4565bap+0, -0x2.395a09a9134eap+0, -0x3.4dcc193d4e186p+0, 0x6.bp-4 }, /* i=53 104.7 */ - { -0x7.098614ecb5e14p-4, 0x8.a709737c8d31240f5p-60, -0x1.1aed628169723p+0, 0x1.70ca5a4bc35244accap-56, -0x4.991ef54fc1b14p-4, 0x7.94c97bc7258dae0d3p-60, -0x5.fdb72fdde53p-4, 0x1.e4a37cdadfb5ae1c8dp-56, -0x5.c44b7908a0818p-4, -0x1.7a0ff5e5d31279f3b98p-56, -0x7.7ddf64196b524p-4, 0x1.20ef92ad67d6c953698p-56, -0x9.99d3c589412cp-4, -0x3.341b990b368d1e64b6p-56, -0xd.4b048885efcep-4, 0x1.5eca46891bf9ba64b6p-56, -0x1.2c5cdbf4623e8p+0, -0x1.b524e819b4463p+0, -0x2.8770244685c46p+0, -0x3.ced331311974p+0, 0x6.dp-4 }, /* i=54 104.5 */ - { -0x7.2cf65603a8aep-4, -0x1.d9730350eb04931fcfp-56, -0x1.1c183436a246fp+0, 0xb.85360fe51c0909004p-60, -0x4.bd9e07fbbdf8p-4, -0xd.82e8346b83375743b8p-60, -0x6.2d0b544bf3914p-4, -0x1.df628c9dfc437adaaep-56, -0x6.11851e7908d88p-4, 0xe.05d0d983e70c2c5d1p-60, -0x7.f593a53f72a68p-4, -0x1.fa48707713e2b88ed98p-56, -0xa.5c6e683266ea8p-4, -0x1.99b32d390d69bf3392p-56, -0xe.875c7840eeaa8p-4, 0x5.39fa8ae4931eba1d2p-60, -0x1.4cf4fe1210b81p+0, -0x1.eb27782029e0ep+0, -0x2.e186a3d0c99d2p+0, -0x4.65b9b6d430f1p+0, 0x6.fp-4 }, /* i=55 104.2 */ - { -0x7.508c84cd112b4p-4, 0x1.c74e53df13c5e4059fp-56, -0x1.1d4c49cc747fdp+0, -0x9.942b1b1ecc27ab3c4p-60, -0x4.e340770be35a8p-4, 0x2.e99063efc8b8684278p-60, -0x6.5edc7672e3f7p-4, -0x1.b33547bf36009734f38p-56, -0x6.639acdd32cfp-4, -0x6.e7dc420c8d0390a298p-60, -0x8.76d29ecec0458p-4, 0x1.a9c28f91da5b9f3ep-56, -0xb.31432b65923c8p-4, 0x3.60807d2760da05d572p-56, -0xf.e648868e8c8c8p-4, 0x2.f5de4259e217fb536dp-56, -0x1.719bcdc04db07p+0, -0x2.28bc55af74b54p+0, -0x3.49aa542f6228cp+0, -0x5.1696811eca154p+0, 0x7.1p-4 }, /* i=56 104.0 */ - { -0x7.7449ce66aaf9cp-4, -0xe.835d60abc43f4d49cp-60, -0x1.1e89ee01a019cp+0, -0x2.ad7149335d0a1fe688p-56, -0x5.0a15a82041c18p-4, -0xb.1a65db2e7abbf47a28p-60, -0x6.935300009d9dp-4, 0xb.5a107375bed94ed938p-60, -0x6.baf05ee071f6p-4, 0x9.4001a7c1df05fecd2p-60, -0x9.0282d8593b928p-4, 0x1.6f456e41470c04ea09p-56, -0xc.1a53d9754a838p-4, -0x1.cdc30a9ede741b17a1p-56, -0x1.16c1ef356afdap+0, 0x7.0f9137a13255a64962p-56, -0x1.9ae4012b0f4fap+0, -0x2.6f14246d06f46p+0, -0x3.c24ae0eba3b18p+0, -0x5.e656edd602c4cp+0, 0x7.3p-4 }, /* i=57 103.8 */ - { -0x7.982f6984e9e3cp-4, -0xe.153898d98a350f5bp-64, -0x1.1fd16f8d68a0ep+0, -0x7.400f5083a7eb66c82ap-56, -0x5.322dfcf92f124p-4, -0x1.9c448e0268e10d16a68p-56, -0x6.ca9a9eb15e9c8p-4, -0x1.a54ad8c37e4b1e7cf4p-56, -0x7.17f3280903424p-4, -0x1.c59d4873fd287141e08p-56, -0x9.99a46be06fe98p-4, 0x2.b1f952322f1770b0ccp-56, -0xd.19e32b3ab069p-4, -0x3.431be98b1f2b551dfdp-56, -0x1.31dd4032c36bfp+0, 0x7.7e0ef36adbec1b116p-56, -0x1.c9778b142bf9bp+0, -0x2.bf94c238270a8p+0, -0x4.4e4f41232d628p+0, -0x6.daeed0c241848p+0, 0x7.5p-4 }, /* i=58 103.5 */ - { -0x7.bc3e96f615894p-4, -0x1.7b9360c3b82f34f4ef8p-56, -0x1.2123216123cd1p+0, 0x7.a28968ed6428a2990ep-56, -0x5.5b9ae7fbb865cp-4, 0x1.a1592351c7ba0f6bf28p-56, -0x7.04e2946d8cc1p-4, -0x1.7c68277d9d76bc245p-60, -0x7.7b1b0df77befp-4, 0x1.928b66e9d6381debde8p-56, -0xa.3d54478329628p-4, 0x2.7a93d95c425006dcb6p-56, -0xe.327e182028f2p-4, -0x1.e2d3c7d97a496f8a57p-56, -0x1.5011338438e55p+0, -0x2.30dc7f5b2a8b6cc104p-56, -0x1.fe1bb258a5094p+0, -0x3.1be38a2d455ecp+0, -0x4.f12ebcffa822p+0, -0x7.fb9403108ebbcp+0, 0x7.7p-4 }, /* i=59 103.3 */ - { -0x7.e078a22deb88p-4, 0x1.0803b3e82eddbc8b01p-56, -0x1.227f5aef2780cp+0, 0x4.16f507a6d4ecd6f6a4p-56, -0x5.866f02b14b018p-4, 0xb.2c4fb9cead1e6bb1ap-60, -0x7.425e106cf1d28p-4, 0xa.98b003e850f9d277fp-60, -0x7.e4ebb618da388p-4, 0x1.846e9d5cdd461044178p-56, -0xa.eecfe7aa1511p-4, 0x3.35dfb4d35b68d24dc1p-56, -0xf.6706a5b28ca9p-4, -0x3.c92520700083d74b43p-56, -0x1.71c5d0576da1ap+0, 0x3.02d3cfc1e3fbd320ap-60, -0x2.39b5f5077ee7ep+0, -0x3.85f1c316dc9ap+0, -0x5.af0fac9f3fb6cp+0, -0x9.51089f486fea8p+0, 0x7.9p-4 }, /* i=60 103.0 */ - { -0x8.04dee1da7c3b8p-4, 0x1.3064f6236756b8a9dbp-56, -0x1.23e678779d056p+0, 0x5.63783e8d83e13c1a4ep-56, -0x5.b2be267c215cp-4, -0xd.5aec252040d7b824f8p-60, -0x7.8344928a135d4p-4, 0x9.a8d69ccb7514ea703p-60, -0x8.55f5e10cb5b38p-4, 0x2.e25f882e83e8b2d73ap-56, -0xb.af799d3d205dp-4, -0x3.3baed139eb1285d95dp-56, -0x1.0bac07b569c76p+0, -0x3.b6ab4c0fa87ee9918p-60, -0x1.97729dbdb45cbp+0, 0x4.04c556d53dbe858c74p-56, -0x2.7d51e26e3dee2p+0, -0x4.000bb9682749p+0, -0x6.8ced5c79a4c7cp+0, -0xa.e5f7d2be77a48p+0, 0x7.bp-4 }, /* i=61 102.8 */ - { -0x8.2972b88307eap-4, 0x3.92a14219ff6137e4bp-56, -0x1.2558db5bceab9p+0, -0x3.ebc3d57b5eaf241456p-56, -0x5.e09d87c180cc8p-4, 0x5.e6ba8cd662253b88d8p-60, -0x7.c7d25a1c30238p-4, -0xb.9599fc71f13dcbed38p-60, -0x8.ced8f2ee29998p-4, -0x1.368aacdcf4b7a212f4p-56, -0xc.80dd76f16448p-4, -0x1.27ae29341b45dc6c97p-56, -0x1.2315f8c4daab1p+0, -0x6.449a99a24001933212p-56, -0x1.c1a13a3aacac7p+0, 0x4.bb596392381b38327ep-56, -0x2.ca2821967b29ap+0, -0x4.8ceb24f521e3cp+0, -0x7.90c6e51e9e1ccp+0, -0xc.c76a4cd68eca8p+0, 0x7.dp-4 }, /* i=62 102.6 */ - { -0x8.4e359531b5db8p-4, -0xd.ea1e9a3200cf0d924p-60, -0x1.26d6ea789648cp+0, -0x1.16f6b7d6efb71c02aep-56, -0x6.1023d3d371198p-4, 0xd.5d66587f875804e3fp-60, -0x8.1048e1e18136p-4, -0x2.0b38cc3907496ecd7cp-56, -0x9.5044b058fe218p-4, 0x2.d62ee4e9b9c8acf165p-56, -0xd.64b6e8f918b28p-4, -0x6.53c844f55d6b43487p-60, -0x1.3cf193ab14b55p+0, 0x5.ca89f73a03669acbf2p-56, -0x1.f0f06ecd5ff36p+0, -0x4.5ee92fe852d688ebb8p-56, -0x3.21a6e653f36c8p+0, -0x5.2fcda36496468p+0, -0x8.c1d9425108cbp+0, -0xf.0558cc82b0408p+0, 0x7.fp-4 }, /* i=63 102.3 */ - { 0x1.7af961ef39d23p+0, 0x1.7a0a884eb5ed49d27ep-56, -0x2.6d50b66b084e4p-4, -0xb.90201654085ef46fe4p-60, 0xb.3e1c32d40fabp-8, 0x1.0579cca1ffa5f743d5p-60, -0x4.5ee7d4a59065p-8, -0x8.812f079071ecc24bc8p-64, 0x1.f4b0a2c3879e3p-8, -0x7.b0af306ba75a443b4ep-64, -0xf.34930b8c1f0d8p-12, -0xd.8cb19026383c5bccfp-68, 0x7.cc7c604badf28p-12, -0x1.6fcfd5ece8a00dafd9p-64, -0x4.27dce47e41678p-12, 0x1.4caa3ad84917ab084ap-64, 0x2.473d20538eaaep-12, -0x1.46d8ef5a3db71p-12, 0xb.a65f48ebbe6d8p-16, -0x6.bd31ee5e96e7p-16, 0x8.1p-4 }, /* i=64 121.6 */ - { 0x1.7aabe4ae052a9p+0, 0x2.d9b9e43acfb16f4ep-56, -0x2.6a8472a78c1cep-4, 0x6.f2d0503fb0bc3370bp-60, 0xb.241168d4df21p-8, -0x2.f9cf91cf5205cee702p-60, -0x4.4f680592aaf64p-8, 0xa.bd10f61500464779a8p-64, 0x1.eb4cbd935ae08p-8, 0x1.e4456a1ff5ec6f994ap-64, -0xe.d85658cfc0edp-12, -0x3.ddb50ff0b16517928bp-64, 0x7.934a2607cd244p-12, -0x1.00e44c72c91527c7148p-64, -0x4.041e3a1bbd0d4p-12, -0xa.3f1ca68af9311ae9p-72, 0x2.30c2ca3d644bap-12, -0x1.38a4049141523p-12, 0xb.1619da740868p-16, -0x6.614defb93a4f8p-16, 0x8.3p-4 }, /* i=65 121.7 */ - { 0x1.7a5ec08d99337p+0, -0x8.08d97c04118cc8ecp-60, -0x2.67bea6095f8b6p-4, -0xc.fd2ece58f95128a3d8p-60, 0xb.0a62be1c7ed28p-8, 0x3.dc79537703aae54b91p-60, -0x4.40327148a50ecp-8, -0x1.020d24b7cb23d11f88p-64, 0x1.e221aa41fa701p-8, 0x2.6cc9d4ac5bc4e0d664p-64, -0xe.7ebc6d25f867p-12, 0x3.ed5dc82ecac6578bb8p-64, 0x7.5c02a8657e28p-12, -0x2.d7dfd22014087aae78p-68, -0x3.e1bf58b19bb2ap-12, 0x8.c8df31c03299a9be98p-68, 0x2.1b41f2d0c3b16p-12, -0x1.2b1e990fc00dfp-12, 0xa.8d7ec4e4ae07p-16, -0x6.0abe1256cf12cp-16, 0x8.5p-4 }, /* i=66 121.8 */ - { 0x1.7a11f4c07f71ap+0, 0x4.458d4425cf0f9a136p-60, -0x2.64ff39bfec2a6p-4, 0xd.12369a22b145f51a2p-60, 0xa.f10e7a90d50bp-8, 0x3.97e99ff224eff115c4p-60, -0x4.314557bc7e488p-8, -0x1.f6f30f9b7a3e395841p-60, 0x1.d92dca2b755dbp-8, 0x1.ea6af080340e8fb742p-64, -0xe.27aeb975dd95p-12, -0x2.f59f06dcd868fdd781p-64, 0x7.269315c81e518p-12, 0x1.fa9b6b1ac0389908568p-64, -0x3.c0b10947ba90ap-12, 0xc.5060d669958b980528p-68, 0x2.06ae97a5fceaep-12, -0x1.1e3f5faa715b2p-12, 0xa.0c1c848a2201p-16, -0x5.b92cd8af16958p-16, 0x8.7p-4 }, /* i=67 121.8 */ - { 0x1.79c5807c14aa5p+0, -0x5.d41ec3abaf6020fc0ap-56, -0x2.62461767553e4p-4, -0xc.b4beb0aa360d8f81f8p-60, 0xa.d812f0719a6cp-8, 0x2.0877f73e7cf09386d1p-60, -0x4.229f05a0aa27cp-8, -0x9.1f225d0fd29d4aebcp-64, 0x1.d06f8c7fbf422p-8, 0x4.56701e09bcaa23f534p-64, -0xd.d3178b90929bp-12, -0x1.f0231a7598c838d5d4p-64, 0x6.f2e96c6b9e24p-12, 0x1.84205ebdd18672b42fp-64, -0x3.a0e4cfeb3781ep-12, -0x2.766c996af34a7268ap-68, 0x1.f2fd58e07f381p-12, -0x1.11fd949cf46adp-12, 0x9.9188ad87842b8p-16, -0x5.6c4a863dc25b4p-16, 0x8.9p-4 }, /* i=68 121.9 */ - { 0x1.797962f87b74bp+0, -0x5.f1b3abc49ba293cbe4p-56, -0x2.5f932905eabecp-4, 0xf.da270b58f6e6872ee4p-60, 0xa.bf6e7c0d30dp-8, 0x3.99eaf80561839acc2cp-60, -0x4.143dd3f8913ap-8, 0x1.5346632151165938018p-60, 0x1.c7e56dbb9cc71p-8, -0x2.cd53fa51407a678bd2p-64, -0xd.80e204af622e8p-12, 0x1.74639a0af3599edae7p-64, 0x6.c0f4706ff1b6p-12, -0x1.21953f343f8aa9cccdp-64, -0x3.824ce1d1667c8p-12, 0x9.304b5c9d2f066b019p-68, 0x1.e0236fd39f661p-12, -0x1.0650f4f8310ap-12, 0x9.1d5f757900b9p-16, -0x5.23ccb6122895p-16, 0x8.bp-4 }, /* i=69 122.0 */ - { 0x1.792d9b708f1c5p+0, 0x7.368c5a300dbb09ee88p-56, -0x2.5ce65909aecd8p-4, 0x7.85070e8eda187b16c4p-60, 0xa.a71f8377f8abp-8, 0x7.5cdc8f8b1302438fp-64, -0x4.062027b0336f4p-8, -0x1.1c55d229efa5e0e3da8p-60, 0x1.bf8df7275cb1cp-8, 0x6.d5a861bda4f6a026a4p-64, -0xd.30fa10662875p-12, 0x2.765a119c5cfe7a1064p-64, 0x6.90a3a26a95db8p-12, 0x1.19a6d296ebd71d7888p-64, -0x3.64dc1c0bc4c24p-12, -0x8.71d81e519084923484p-68, 0x1.ce16a63c62266p-12, -0xf.b31b6a3a631e8p-16, 0x8.af433cca830ep-16, -0x4.df6df81631d94p-16, 0x8.dp-4 }, /* i=70 122.1 */ - { 0x1.78e22921d6d1bp+0, 0x7.8e6707b366f34a06fap-56, -0x2.5a3f9245ed0ccp-4, 0x6.b5075ddc8fcc8995e4p-60, 0xa.8f2476460ca88p-8, 0x1.5ccf72638d360c734dp-60, -0x3.f8447137be66ap-8, 0x8.f95dc2f12b17ec09p-64, 0x1.b767be5b16aebp-8, 0x7.9bd44b2d9672d37cfp-64, -0xc.e34c5c03ebcb8p-12, 0xa.f64332967c51d7f96p-68, 0x6.61e736767bee4p-12, 0x4.9a6fd78a7ed4c5f96p-68, -0x3.4885fac3ea45p-12, -0xa.f7479cc774ddfd43a4p-68, 0x1.bccd4e065276p-12, -0xf.09880e722796p-16, 0x8.46dc292438568p-16, -0x4.9eed774574e6cp-16, 0x8.fp-4 }, /* i=71 122.2 */ - { 0x1.78970b4c79267p+0, 0x3.265a87154419ef8974p-56, -0x2.579ebff0e33acp-4, -0xf.1d26bc2099be836d2cp-60, 0xa.777bcd474c58p-8, -0x2.90c91c3b5066763c8p-64, -0x3.eaa92c22ec8bap-8, 0xe.57bf669839ea0046cp-68, 0x1.af7164c82cd01p-8, -0x3.341c734ee706b78d18p-64, -0xc.97c64e5be459p-12, -0x3.83ac59015abb25ae11p-64, 0x6.34b00bbb27bfp-12, 0x1.885a7789a8097565d5p-64, -0x3.2d3e90f713438p-12, 0xe.b0f7f9cfe24e50a23cp-68, 0x1.ac3e399227916p-12, -0xe.67e657330371p-16, 0x7.e3d7c267e9574p-16, -0x4.620ea5fd69d1p-16, 0x9.1p-4 }, /* i=72 122.3 */ - { 0x1.784c41332fd3cp+0, 0x7.5fc971d200f945be8ap-56, -0x2.5503cda17a846p-4, 0x8.da9d6e582337274758p-60, 0xa.60240a459fa8p-8, -0x1.ac4fe19f084caae082p-60, -0x3.dd4cdecc03f4ep-8, 0xe.1380019445efd3ca38p-64, 0x1.a7a99747d031p-8, 0x2.4772395aa1097fea6cp-64, -0xc.4e55fff18512p-12, 0x3.474b75352a1abd40bbp-64, 0x6.08efa4643ce6cp-12, 0x5.6c9455b86155b04c3p-68, -0x3.12fa80a96ac24p-12, 0x8.d6b52520ff788e6f64p-68, 0x1.9c60b475a23f5p-12, -0xd.cdcd9df3ad39p-16, 0x7.85e89a1754f74p-16, -0x4.2898f105399d4p-16, 0x9.3p-4 }, /* i=73 122.3 */ - { 0x1.7801ca1b3bc8bp+0, -0x4.38ddc40444b8f850eep-56, -0x2.526ea74d11006p-4, -0x7.9016643506f6a118bp-60, 0xa.491bb7c55dedp-8, -0xe.c6a534566df9cf124p-64, -0x3.d02e19fa4dd8ap-8, 0xa.7d133899199c30a59cp-64, 0x1.a00f0dae4c7a6p-8, 0x3.a6ac83b282ee4165ecp-64, -0xc.06ea3382676a8p-12, -0x2.29ded2716725d44382p-64, 0x5.de981e0322bf4p-12, 0x1.60e3dc65d1da98d7cp-64, -0x2.f9aef389c303cp-12, -0xe.fa31eb07c67e5a2ad4p-68, 0x1.8d2c7caca7a99p-12, -0xd.3adb19520591p-16, 0x7.2cc5f39341a9cp-16, -0x3.f25777adee846p-16, 0x9.5p-4 }, /* i=74 122.4 */ - { 0x1.77b7a54c597ddp+0, -0x4.37614ae12d5a8124f4p-56, -0x2.4fdf394552d0cp-4, 0x9.1b9e33d907eabef02p-60, 0xa.326168c7c40f8p-8, -0x1.e04b36084aea51bp-60, -0x3.c34b788be14aap-8, -0x2.e26c5b3ec96325e9ccp-64, 0x1.98a08a62e120ep-8, -0x4.b8b5332fc43c419ca8p-64, -0xb.c1724ee944d38p-12, -0x3.ee65c53a209a5f4fc3p-64, 0x5.b59c2a54c9744p-12, -0x1.15a783cbd91efd8f108p-64, -0x2.e15193fee44a2p-12, -0x5.d6f7abbbaba01948cp-68, 0x1.7e99bc342c7bep-12, -0xc.aeb1822814ba8p-16, 0x6.d82b767eac1ap-16, -0x3.bf18c99f41a16p-16, 0x9.7p-4 }, /* i=75 122.5 */ - { 0x1.776dd210b58d7p+0, -0x7.1bfc77b3b477370c14p-56, -0x2.4d55703622646p-4, 0x1.d9c8db80b76bd2740cp-60, 0xa.1bf3b88f6658p-8, -0x3.83d592fce66f4a78fep-60, -0x3.b6a39f229dae2p-8, -0xe.0ac94eee640f3b8d1cp-64, 0x1.915cd9fbf224dp-8, 0x5.df8c8875f3b780f148p-64, -0xb.7dde54556e568p-12, 0x3.84121393476fe3d862p-64, 0x5.8def0865f7358p-12, 0x3.19136064b09ad2587p-68, -0x2.c9d886980cb1cp-12, -0xf.615d6eaa8df51bb4e8p-68, 0x1.70a1030809ff6p-12, -0xc.28f8be8b3974p-16, 0x6.87d8e8fc790cp-16, -0x3.8eaeaa7c767eap-16, 0x9.9p-4 }, /* i=76 122.6 */ - { 0x1.77244fb4e18d5p+0, -0x7.1eb4ca51ef90e020bap-56, -0x2.4ad139238f60ap-4, -0x9.263bc285ff2c243a3cp-60, 0xa.05d14a668b23p-8, 0x1.f937ecb8cabbc73925p-60, -0x3.aa353bd432f06p-8, -0xb.db3b507becdfb405bcp-64, 0x1.8a42d2df5ce0fp-8, 0x4.4a0aa91a2255ceecaap-64, -0xb.3c1edbd273d9p-12, -0x2.e9cea79b820eba105p-64, 0x5.67847e10db328p-12, -0x1.e26cda7d342854a02ap-64, -0x2.b33a63daa67a4p-12, 0x2.b576ae53124f6acc04p-68, 0x1.633b417d535d3p-12, -0xb.a95d924c513b8p-16, 0x6.3b91e7985bd48p-16, -0x3.60edd84199d94p-16, 0x9.bp-4 }, /* i=77 122.7 */ - { 0x1.76db1d87c928ep+0, 0x2.cfe7d3eb3ad9b6749cp-56, -0x2.48528167dbb8p-4, 0x2.b41955bcc59288dc8p-60, 0x9.eff8c9675c8d8p-8, -0x2.69ea4b89092fb0c7bp-64, -0x3.9dff05dd173p-8, -0x8.68144c3a1c394677fp-64, 0x1.835154e6c011cp-8, 0x3.2815a9b9782f1892c8p-64, -0xa.fc250d1be9bdp-12, -0x3.9bbc400c092ab8c461p-64, 0x5.4250d1cef4f3cp-12, 0x1.08bf20dd1d279960fb8p-64, -0x2.9d6e32679d2b8p-12, 0xf.6de3f790e2357a6acp-72, 0x1.5661c2f32f3fep-12, -0xb.2f915497591a8p-16, 0x5.f31da7767c774p-16, -0x3.35add71cfda42p-16, 0x9.dp-4 }, /* i=78 122.7 */ - { 0x1.76923adaa77a1p+0, -0x3.ad86440ee90b38e5f8p-56, -0x2.45d936b18e7b4p-4, -0x3.7956442f87501a90e4p-60, 0x9.da68e845dfep-8, 0xc.d007fb4215a735bedp-64, -0x3.91ffbd564af2cp-8, -0xf.f71fd0eb07d0820ce4p-64, 0x1.7c87490788ba2p-8, -0x7.dcd73f5472d61189ep-64, -0xa.bde299b97507p-12, -0x1.c3008be90c8fcc5554p-64, 0x5.1e48c4daaa6fcp-12, 0x1.0bf482ceaef1d30a2ap-64, -0x2.886b6173164b8p-12, -0x1.e9db741df7c66f6008p-68, 0x1.4a0e28d4a7008p-12, -0xa.bb49aa583f0a8p-16, 0x5.ae46bbb98f774p-16, -0x3.0cc8c0d6ccb0ap-16, 0x9.fp-4 }, /* i=79 122.8 */ - { 0x1.7649a700fc9e7p+0, 0x6.e76c8a8217af57eb7p-56, -0x2.4365470193f68p-4, 0x8.5531344ece0f8e7f4cp-60, 0x9.c520611ba244p-8, 0x1.ef17ad8cbe5d76541ap-60, -0x3.86362aedce744p-8, -0x4.2642efa23067b8fb44p-64, 0x1.75e3a0fe97dd4p-8, -0xb.ec152cd6b4a924eacp-68, -0xa.8149b75f7c648p-12, 0x3.52a2e5d806aefce17ep-64, 0x4.fb618d9c2e09p-12, -0xb.dc9b52f8ef1d1cc3d8p-68, -0x2.7429c389a83c2p-12, 0xf.382b60eb012d1ed564p-68, 0x1.3e3a65e63cd52p-12, -0xa.4c4045113368p-16, 0x5.6cdadffbf577p-16, -0x2.e61b17ccbe7fcp-16, 0xa.1p-4 }, /* i=80 122.9 */ - { 0x1.7601615083886p+0, -0x5.76787f5f94abd2f7e4p-56, -0x2.40f6a0a96aadp-4, -0xa.c41d85522e445be758p-60, 0x9.b01df5350ae98p-8, 0x3.7dd9f401af7d3bf51cp-60, -0x3.7aa11fa1abef2p-8, -0x4.36d4e13bf40ec85e6cp-64, 0x1.6f6556ff573d2p-8, 0x3.a09c6a9eb3e1411bp-64, -0xa.464d1a910f368p-12, 0x1.7c9d0b1fb1bf219a6dp-64, 0x4.d990d25d9804p-12, 0xb.9486d3899eec790c3p-68, -0x2.60a1899e79dfp-12, 0x6.959febd39aed34e298p-68, 0x1.32e0b9da767e4p-12, -0x9.e232a5d4e571p-16, 0x5.2eaac1cc10f64p-16, -0x2.c1839cb42cebp-16, 0xa.3p-4 }, /* i=81 123.0 */ - { 0x1.75b969212808cp+0, -0x7.d077f3826218b69862p-56, -0x2.3e8d32495cceap-4, -0x2.9f4c46011788fc8124p-60, 0x9.9b606ce04375p-8, -0x2.652b4d21d7c895c2f2p-60, -0x3.6f3f747d7c0a2p-8, 0xe.7690591e67c0ef4554p-64, 0x1.690b6d661560cp-8, 0x7.b441a4b288ca802af4p-64, -0xa.0cdff17fc3aep-12, 0x8.ed2421c1e8f52b4f4p-68, 0x4.b8cca4425518cp-12, 0x1.a1e81167a6aac95e368p-64, -0x2.4dcb3e5e002cap-12, 0x2.383c994bcd8f422824p-68, 0x1.27fbad28db261p-12, -0x9.7ce1e41cb211p-16, 0x4.f389d3e38729cp-16, -0x2.9ee3281e83faep-16, 0xa.5p-4 }, /* i=82 123.1 */ - { 0x1.7571bdccfd11bp+0, -0x4.9b83cc71f549f0b6d8p-56, -0x2.3c28eacec5c08p-4, 0x4.348988e2f26540b5ep-60, 0x9.86e6973da822p-8, 0x3.b5d85adbeb9c0a1f72p-60, -0x3.64100a5a4ac56p-8, 0x9.9d48271e3a2b3cb8p-68, 0x1.62d4ee6d83208p-8, 0x3.bdc61dc186e314e36p-64, -0x9.d4f5df267a088p-12, 0x8.f233cbbc529be0463p-68, 0x4.990b7a7e45eep-12, 0x1.d378189d119b1dcc958p-64, -0x2.3b9fc1c154682p-12, -0xe.622373479646382144p-68, 0x1.1d860d2334bf4p-12, -0x9.1c12783804868p-16, 0x4.bb4e20c6386dp-16, -0x2.7e1c866cc141p-16, 0xa.7p-4 }, /* i=83 123.1 */ - { 0x1.752a5eb0332f5p+0, -0x1.8f4de18b34f96a732ep-56, -0x2.39c9b972635b4p-4, -0x1.5121cde8f98c73d0b4p-60, 0x9.72af4a11b1aa8p-8, -0x1.b18007eeaf3e7c3ccap-60, -0x3.5911c9a0c46eap-8, -0x8.889cc9c65fe6db9828p-64, 0x1.5cc0ebe72ed35p-8, 0x2.344ec92b00756b6bbcp-64, -0x9.9e82f69c1d6ep-12, 0x3.eb23decc10506761a6p-64, 0x4.7a442dc921d1p-12, 0xf.0707c32d5956556d8p-72, -0x2.2a1844de5e696p-12, -0xd.e34774df2482cf10cp-68, 0x1.137ae8452b69ap-12, -0x8.bf8c0916f27cp-16, 0x4.85d01efdff1acp-16, -0x2.5f1455d80c258p-16, 0xa.9p-4 }, /* i=84 123.2 */ - { 0x1.74e34b290f35cp+0, 0x5.964e8d013a9900312p-60, -0x2.376f8db6b280ap-4, 0x5.02db14e778b012d1f8p-60, 0x9.5eb961984b7ap-8, -0x3.f39dd31bf0cb83fe9ep-60, -0x3.4e43a20d9336cp-8, -0x9.a5b6f020460fce318cp-64, 0x1.56ce7ef6dafc9p-8, -0x6.0fbb3527c41ab3feb4p-64, -0x9.697bb69ba2d7p-12, 0x8.ea89f5ad709927dbdp-68, 0x4.5c6df40ae20b8p-12, 0xe.c6a4611206310d2568p-68, -0x2.192e45f14ae4ap-12, 0x7.6fdbc8861dd1a87074p-68, 0x1.09d58aba93558p-12, -0x8.67193d3685d1p-16, 0x4.52ea906ca862cp-16, -0x2.41b0e8666c57ap-16, 0xa.bp-4 }, /* i=85 123.3 */ - { 0x1.749c8297e122ep+0, 0x7.6051f418afdb27ce28p-56, -0x2.351a576656afp-4, 0x4.37fae376c3762123dp-60, 0x9.4b03c059895d8p-8, -0x1.e5cd45d51b94de18f4p-60, -0x3.43a48a77d7112p-8, -0x5.fcdb542be076989218p-64, 0x1.50fcc7d090054p-8, 0x4.874da5515c947c3252p-64, -0x9.35d5053eac068p-12, 0x3.7a81b4dc38a0a7083dp-64, 0x4.3f805c3e2b1f8p-12, 0x1.ae9c9d9647d067baf68p-64, -0x2.08db8c9bfdfdcp-12, 0xe.330d31b7775b705514p-68, 0x1.00917b190956p-12, -0x8.12878e794f1ap-16, 0x4.227a571f5a118p-16, -0x2.25da25f468b8ep-16, 0xa.dp-4 }, /* i=86 123.4 */ - { 0x1.7456045efb329p+0, 0x5.a85f01650a0c59a7cap-56, -0x2.32ca06928c3d6p-4, -0x1.7d4ad3799e31897e5cp-60, 0x9.378d4effb0478p-8, -0x2.c7a0e3668cbbb6127ep-60, -0x3.39338099a2806p-8, 0x1.e2f4f32d8601327e58p-64, 0x1.4b4aed794a21cp-8, -0x4.7b5b345f330d61c364p-64, -0x9.03842be858078p-12, 0x3.57ee03d038450a2df5p-64, 0x4.23734a85d612cp-12, 0x1.791b1236329b1ecf4a8p-64, -0x1.f91a26586716ep-12, 0x3.4e6fb89613f92ffaf2p-68, 0xf.7aa7749ac75c8p-16, -0x7.c1a720ba90fap-16, 0x3.f45e579a5ff4cp-16, -0x2.0b7971f710cfcp-16, 0xa.fp-4 }, /* i=87 123.4 */ - { 0x1.740fcfe2a923cp+0, 0x3.d8938b59feccc93fp-60, -0x2.307e8b91a4ebcp-4, 0x1.b76b28ca17bdd78ddp-60, 0x9.2454fc2e864a8p-8, 0x1.df741e981adecf6606p-60, -0x3.2eef88da67e5ap-8, 0xd.63f456c462bb9f7854p-64, 0x1.45b81d8a26027p-8, 0x1.fc6938e6773411ced4p-64, -0x8.d27ed35dec16p-12, -0x1.63a83da6bad31a7e77p-64, 0x4.083ef472e617cp-12, -0x1.755b5240041d9816dbp-64, -0x1.e9e4631acbedbp-12, -0x7.0e0bbda869c355f60ap-68, 0xe.f1c719fff9848p-16, -0x7.744a9aede6588p-16, 0x3.c87758aee23a2p-16, -0x1.f27992741d949p-16, 0xb.1p-4 }, /* i=88 123.5 */ - { 0x1.73c9e48927ad8p+0, 0x2.f862a7522d2c91ea66p-56, -0x2.2e37d6fd8e77ap-4, -0xd.aeac0f3f434764f224p-60, 0x9.1159bc5bde67p-8, -0x1.77330b5e73a8fbf971p-60, -0x3.24d7ae1b43ccap-8, 0xc.62c30cc4e02869c7d4p-64, 0x1.40438bf5f05c4p-8, 0x5.62798e96844114fdfp-64, -0x8.a2bb000b1f48p-12, -0x3.12d39fdb9dedbd298dp-64, 0x3.eddbdd785e646p-12, -0xd.ccc573cdf57ed0d7c4p-68, -0x1.db34d2214f011p-12, 0x2.6726941687b6a0a1acp-68, 0xe.6e38e1b2c97ep-16, -0x7.2a4702a07ac38p-16, 0x3.9ea7e636fa49ap-16, -0x1.dac698d2c915p-16, 0xb.3p-4 }, /* i=89 123.6 */ - { 0x1.738441ba9c22bp+0, 0x5.942d2e2f8ce10954c4p-56, -0x2.2bf5d9b262e7ep-4, -0x2.0f834eed89d14e33dcp-60, 0x8.fe9a89a9552e8p-8, -0x3.f13712c833b9a547cfp-60, -0x3.1aeb01851189ap-8, 0x7.d28c9f9316df050758p-64, 0x1.3aec72d0fdaabp-8, -0x6.e8a19ec9fe56c0e522p-64, -0x8.742f0e6ff1038p-12, -0x8.65c7adbac45edf91ap-68, 0x3.d442d38a9122ep-12, 0xd.09e3b2c96e65f8e9bp-68, -0x1.cd063eee20191p-12, 0x4.41afa65775782f5768p-68, 0xd.efc1fcf124c3p-16, -0x6.e37399b3ef76cp-16, 0x3.76d433db595cp-16, -0x1.c44dcc0d95615p-16, 0xb.5p-4 }, /* i=90 123.7 */ - { 0x1.733ee6e10c42ep+0, -0x2.a441245403ac9589cp-60, -0x2.29b884cd02436p-4, -0x7.6251a2331425418cd8p-60, 0x8.ec1663bf33bdp-8, 0x1.15ca1b4065582ae689p-60, -0x3.11289a58384cep-8, 0x5.d59f11763ee7f3aa9cp-64, 0x1.35b2121b30d57p-8, 0x2.1b280dc35515366362p-64, -0x8.46d1afb60e518p-12, -0x1.7793b2692f029d119ep-64, 0x3.bb6cebe7a339p-12, -0x6.9987efd3fc3d0d23ccp-68, -0x1.bf53ae69edde5p-12, 0x3.e3dfdaa639e860e9b6p-68, 0xd.762a672b0a06p-16, -0x6.9fa9be2dcb898p-16, 0x3.50e206193302p-16, -0x1.aefd94f8a1336p-16, 0xb.7p-4 }, /* i=91 123.7 */ - { 0x1.72f9d36856376p+0, 0x3.d41b9e85b2e8b21d5cp-56, -0x2.277fc9a9b56c6p-4, -0xc.a6864301a590ee6578p-60, 0x8.d9cc4fa86ee5p-8, 0x2.6734f2f22de5b1d94ep-60, -0x3.078f95be1f964p-8, -0x8.bb1761fab9f35455p-64, 0x1.3093af8c1898cp-8, -0x6.e82933430d6a6c3a16p-64, -0x8.1a99e66be4898p-12, -0x1.6a0085b64cc6eae686p-64, 0x3.a3538007215b4p-12, 0xd.65f7ae4f80d2f9e9b8p-68, -0x1.b2185c2c54e1fp-12, 0x8.6fd1260fb789ec57p-72, 0xd.013cc11b12ebp-16, -0x6.5ec4cbf8ef0b4p-16, 0x3.2cb8964d984d2p-16, -0x1.9ac56aef5f783p-16, 0xb.9p-4 }, /* i=92 123.8 */ - { 0x1.72b506be28bbcp+0, -0x1.aa226731ca9f314574p-56, -0x2.254b99e2d9d8cp-4, -0xa.c0413d33f90214adp-64, 0x8.c7bb57afb8d1p-8, -0x1.48d1cd2af52db7706ap-60, -0x2.fe1f169c3abp-8, 0xf.8a0fb836ca202b0c58p-64, 0x1.2b9096610cb27p-8, -0x2.1ab98df2bd4ce2513ep-64, -0x7.ef7f036398bccp-12, -0x6.7348980d74ca667b48p-68, 0x3.8bf02aaea19dep-12, -0xc.cd3f40d94a5283eb54p-68, -0x1.a54fb7e82b808p-12, 0x7.ca9b99d888f26c95dp-68, 0xc.90c62deebcafp-16, -0x6.20a20078d807cp-16, 0x3.0a40810a4c554p-16, -0x1.8795c34d7c071p-16, 0xb.bp-4 }, /* i=93 123.9 */ - { 0x1.72708051fb6fcp+0, 0x5.c9e2fc1548c73359dep-56, -0x2.231be74f95e4ap-4, 0xe.8a6d89342cbab44284p-60, 0x8.b5e28b3d9bc4p-8, -0x1.b9deb19773bd138c4p-64, -0x2.f4d645689b894p-8, 0x6.1694779a19a2ec374p-64, 0x1.26a8172d34ef2p-8, 0x7.545d1ceb6979ab9192p-64, -0x7.c578a2b432dacp-12, 0x1.5d4e04f92d5a29e6048p-64, 0x3.753cc529898eep-12, -0xd.eb29cc915cb9daae38p-68, -0x1.98f562f9aacd8p-12, -0x5.3dfdae7a9d1e7f891ap-68, 0xc.2496325eec4cp-16, -0x5.e5205fd0cd948p-16, 0x2.e963ae4c84f4p-16, -0x1.7560008c51bccp-16, 0xb.dp-4 }, /* i=94 123.9 */ - { 0x1.722c3f950752ep+0, -0x7.54529dfdb2775a694p-56, -0x2.20f0a402957e4p-4, -0x8.9f13b6d73d32501534p-60, 0x8.a440feb794fap-8, 0x1.a0bad18fb6cd12db59p-60, -0x2.ebb44ffffdf82p-8, -0xb.17f5d03dbf2469fb8p-64, 0x1.21d987ab65376p-8, -0x2.e43e3722384971a714p-64, -0x7.9c7ea8db61bdcp-12, 0x3.ccbb07051eb29fe9ep-68, 0x3.5f3364a22c12p-12, -0x1.766571489c6087518p-68, -0x1.8d052e14935f8p-12, 0x6.703d498e6b1ac8c0dap-68, 0xb.bc7e959af0cap-16, -0x5.ac209bc3035acp-16, 0x2.ca0d3b52237a4p-16, -0x1.641662f3828fp-16, 0xb.fp-4 }, /* i=95 124.0 */ - { 0x1.71e843fa3f66fp+0, 0x4.2467dd5d3ac3a32262p-56, -0x2.1ec9c248ceecap-4, 0xc.218a5a3d779ac10aap-60, 0x8.92d5cb6026fd8p-8, -0x3.4e4efd83f413aab30ep-60, -0x2.e2b8697d3d08ep-8, 0x2.3ff213250d3f1066ap-64, 0x1.1d244291bab86p-8, -0x4.2ee7f107e142883cap-64, -0x7.74893ffe525p-12, -0x5.87c7923b22913984p-68, 0x3.49ce579a8bb4cp-12, -0xb.d777eec7b02e8ec784p-68, -0x1.817b171089849p-12, 0x7.de70287b9c4cdd8c8ap-68, 0xb.585343ea2aeap-16, -0x5.7584fc0db28a4p-16, 0x2.ac296df9957d2p-16, -0x1.53abfb767ad52p-16, 0xc.1p-4 }, /* i=96 124.1 */ - { 0x1.71a48cf6497abp+0, 0x3.75cd762c6a2e5813c4p-56, -0x2.1ca734a84f71cp-4, -0x7.df0c9d8f40dfdfaeb4p-60, 0x8.81a00f37db208p-8, 0x1.85647c0834444b29e1p-60, -0x2.d9e1ca12249ecp-8, -0x4.0513a3f978db2e8c34p-64, 0x1.1887a766e731ap-8, 0x3.65df6f536100ae6c22p-64, -0x7.4d90d54827cccp-12, -0x1.585650e0496f35e5ef8p-64, 0x3.3508238326352p-12, -0xf.2dd0882cd123cb9088p-68, -0x1.765346d1ff48cp-12, 0x5.7b918ccb120c48eb9ap-68, 0xa.f7ea32ea8e81p-16, -0x5.4131482df315p-16, 0x2.8fa59f03c97cep-16, -0x1.44149d884721fp-16, 0xc.3p-4 }, /* i=97 124.1 */ - { 0x1.716119ff77194p+0, 0x3.56bc3e4590c80c446p-60, -0x2.1a88eddf0f91ep-4, 0x9.bbbc459bf5f06ed5b4p-60, 0x8.709eecdf2a1dp-8, -0x8.0c1987fe03753924ap-64, -0x2.d12faee1923f8p-8, -0x2.6daea2545967dc452p-64, 0x1.14031a591850bp-8, 0x3.b8af5210674150e914p-64, -0x7.278e1664b5e34p-12, -0x9.2f15b47761d6578f5p-68, 0x3.20db826e448ap-12, -0xa.a1b4781d4d571b4ebcp-68, -0x1.6b8a0f4e1bde2p-12, 0x1.2ee1b7a1858a47e8d4p-68, 0xa.9b1b47537c7p-16, -0x5.0f0ab271b0b1cp-16, 0x2.74702998edd8cp-16, -0x1.3544d33dde181p-16, 0xc.5p-4 }, /* i=98 124.3 */ - { 0x1.711dea8dbe9f4p+0, 0x2.9806250e4940f52f5ep-56, -0x2.186ee0e1cec2p-4, -0x6.7096addbcb93200728p-60, 0x8.5fd18b79441b8p-8, 0x2.bfa16b048be72b38fep-60, -0x2.c8a159dad86c8p-8, 0x9.0db6c2f864340f351p-64, 0x1.0f96041669db4p-8, -0x6.26e4e992308504b6bap-64, -0x7.0279ef162f35p-12, 0x1.cbbd207a83f9062b338p-64, 0x3.0d4360de5ff94p-12, -0xe.fee3d0bdd7eb9ccd34p-68, -0x1.611be9a8278adp-12, 0x2.add039dd1839656ef4p-68, 0xa.41c03c26243b8p-16, -0x4.def7c443aa674p-16, 0x2.5a78603dda726p-16, -0x1.2731d22287146p-16, 0xc.7p-4 }, /* i=99 124.3 */ - { 0x1.70dafe1ab473fp+0, -0x7.f78554098a0424efp-56, -0x2.165900daf64b8p-4, -0x4.94a6376e3a8b674834p-60, 0x8.4f37168fb0c3p-8, 0x2.c8177e5e3311d2faa1p-60, -0x2.c03611965876ep-8, 0xe.63210cfe8aecf5e7f8p-64, 0x1.0b3fd1a6d232cp-8, -0x4.fa039ca8b53d71862p-64, -0x6.de4d86e48b6bcp-12, 0x1.c7a363d1950a3b0612p-64, 0x2.fa3adbae40c8ep-12, -0x4.dd1db766732851955p-68, -0x1.5705746719575p-12, 0x7.010c05377d2e4dbbp-68, 0x9.ebb48b363018p-16, -0x4.b0e04b9dd167p-16, 0x2.41ae79eb948fep-16, -0x1.19d1701d5d446p-16, 0xc.9p-4 }, /* i=100 124.4 */ - { 0x1.7098542184652p+0, -0x2.fa326dd1132bfe77a2p-56, -0x2.14474129832bap-4, -0xc.5225bad10fc42e494p-60, 0x8.3ecebdf6c0228p-8, 0x3.9a236b62a384e6fcf7p-60, -0x2.b7ed2133473acp-8, 0x3.5ba9261d3d47a2e78p-68, 0x1.06fff447797ddp-8, 0x6.3de479fcc9b9f00412p-64, -0x6.bb023ee577fa4p-12, -0x1.394f308b79378dcf25p-64, 0x2.e7bd3e118ded4p-12, -0xd.a1335e1cd9eef1d998p-68, -0x1.4d4371c1f86c5p-12, 0x7.0f9ca7458c10eec676p-68, 0x9.98d556f682598p-16, -0x4.84ad498fa7034p-16, 0x2.2a0387cef1338p-16, -0x1.0d1a19ac3a2a7p-16, 0xc.bp-4 }, /* i=101 124.5 */ - { 0x1.7055ec1eeb262p+0, -0x2.34dd6883b16beecbp-56, -0x2.1239955ff6becp-4, 0xb.57aca64f6a5459bf98p-60, 0x8.2e97b5b2c59c8p-8, 0x3.0d74a421f4e265f812p-60, -0x2.afc5d83691a8ep-8, -0x6.ae31fae8712c51b2b8p-64, 0x1.02d5e1476c7a9p-8, -0x4.bfd7c08a4e512d39p-68, -0x6.9891af9bb595cp-12, 0x5.55477ec7b08c1fa8e8p-68, 0x2.d5c5ffac96cfep-12, 0x5.c760cad9232f4d2a58p-68, -0x1.43d2c601d678ep-12, 0x6.b6e988ccd170c9c65cp-68, 0x9.490155775b9a8p-16, -0x4.5a48e1c7770c8p-16, 0x2.136966ceecee8p-16, -0x1.0102c88bd54fap-16, 0xc.dp-4 }, /* i=102 124.5 */ - { 0x1.7013c5912fef8p+0, 0x7.948d424df5a55f3704p-56, -0x2.102ff1434e032p-4, 0xd.5c38e69e07d72fc2p-60, 0x8.1e9135de1631p-8, -0xb.f183eaf8f7790f08dp-64, -0x2.a7bf8a6ad67a8p-8, -0xf.3fc27e800f20bdafd4p-64, 0xf.ec111e59cab58p-12, -0x5.55e60914a1851de66p-68, -0x6.76f5a6ecd2a2cp-12, -0x1.5bec5e4a195838c819p-64, 0x2.c450c2c23102p-12, 0x4.15d6e5cde25727dbap-68, -0x1.3ab075f83aaefp-12, 0x5.0f169e32bfee65ff54p-68, 0x8.fc18bc8430c28p-16, -0x4.319e4b0e6b3d4p-16, 0x1.fdd2b52c1089cp-16, -0xf.582fb08f7f1p-20, 0xc.fp-4 }, /* i=103 124.6 */ - { 0x1.6fd1dff81e402p+0, -0x5.9134ceae9d9839d7aap-56, -0x2.0e2a48c9ff458p-4, -0x8.196a1aa4d72712b648p-60, 0x8.0eba7a8fc3c7p-8, 0x3.43567fe2d44d815373p-60, -0x2.9fd98fc16adccp-8, 0x3.eba80699219863d164p-64, 0xf.ac1033020362p-12, -0x2.95e1e5d3c7e12937c6p-64, -0x6.5628262c4041p-12, -0x3.80575e19b6f0f65d98p-68, 0x2.b359527693672p-12, 0xd.c28b1bd03b6a061eecp-68, -0x1.31d9a588e5f94p-12, -0x1.aba66f9083de43aa7p-68, 0x8.b1fd2ed0b6388p-16, -0x4.0a99c0a882d74p-16, 0x1.e932c63b954d2p-16, -0xe.a92abcfe31d58p-20, 0xd.1p-4 }, /* i=104 124.7 */ - { 0x1.6f903ad4ffbd6p+0, 0x1.6822c081fed6975d4cp-56, -0x2.0c28901afe076p-4, -0x4.341eb435abad97c2f4p-60, 0x7.ff12c3c30f55p-8, -0x1.b145651c160e3fdc37p-60, -0x2.9813443460492p-8, -0xc.04def8aee284c50ef4p-64, 0xf.6d535e4a46a38p-12, -0x2.a237b81c8ce3625945p-64, -0x6.3623603acc4a8p-12, -0x1.8803944c4563a0ebbp-68, 0x2.a2dba126273e6p-12, -0x4.6696161d09de36cb98p-68, -0x1.294b9645e9153p-12, -0x1.1a28cec99e389ad0b4p-68, 0x8.6a91aa258bc18p-16, -0x3.e528748a73f36p-16, 0x1.d57d9922e564ap-16, -0xe.02a4a5bfb8548p-20, 0xd.3p-4 }, /* i=105 124.8 */ - { 0x1.6f4ed5aa96338p+0, -0x3.505c1d46315ef6dfb4p-56, -0x2.0a2abb8cc4f2p-4, 0x2.91bb355644d0d4bd0cp-60, 0x7.ef99553f8bf44p-8, -0x1.f5f1d08149dc76c2e58p-60, -0x2.906c07a9822a4p-8, -0xa.4bbfbad856d06c346cp-64, 0xf.2fd2e52067798p-12, -0x1.e4c0c8e3b16e60121dp-64, -0x6.16e1b7b996ac4p-12, 0x1.7bd7529dbb36717a0b8p-64, 0x2.92d3c6cf5568cp-12, 0x9.6e5b45ce5e015e409p-68, -0x1.2103a61d14467p-12, 0x6.2e7b309fa8e53de0b2p-68, 0x8.25ba767dfc558p-16, -0x3.c13882586581ap-16, 0x1.c2a7d013f3dd2p-16, -0xd.642b418d4c2d8p-20, 0xd.5p-4 }, /* i=106 124.7 */ - { 0x1.6f0daffd15b35p+0, -0x1.484aa516d8e6e46c6p-56, -0x2.0830bfa465abep-4, -0x4.cd7484a9799c1b89cp-64, 0x7.e04d7681ed38p-8, -0x1.020d1fe76efafc9fea8p-60, -0x2.88e33dd642488p-8, 0x5.c375728bb0f0eb1a7p-64, 0xe.f38743b06706p-12, -0x3.d775cc3d5ea66a0b88p-64, -0x5.f85dbd4fa3d9p-12, 0x1.a1399633b9817b7c55p-64, 0x2.833dff8e637fap-12, 0xf.45db62273952e054f4p-68, -0x1.18ff4e15d67bap-12, -0x4.8cf8408d638ede608p-68, 0x7.e35d1609319fp-16, -0x3.9eb8e3214dbdcp-16, 0x1.b0a6a23a0317ap-16, -0xc.cd52d16de84a8p-20, 0xd.7p-4 }, /* i=107 124.9 */ - { 0x1.6eccc9521ece5p+0, 0x2.cae6e35841f902e62cp-56, -0x2.063a91149e65ap-4, 0xb.947496e03731759f6p-60, 0x7.d12e72a57b3f4p-8, 0x1.68db92522924907712p-60, -0x2.81784e248b5c4p-8, -0x2.bfc8085413e18daf9cp-64, 0xe.b8692ba0935p-12, 0x2.aa303ebd116cf90cbp-64, -0x5.da922e0138e74p-12, -0x1.4bdcd9b43e6d3fe089p-64, 0x2.7416aa2a80b9ep-12, -0x3.5f655e1bca9dbdcp-80, -0x1.113c211eaeff9p-12, 0x2.38f84e1a9c68c6b66ep-68, 0x7.a3603601cd21p-16, -0x3.7d9961cb81aa2p-16, 0x1.9f6fdab62bceep-16, -0xc.3db5aafcad9bp-20, 0xd.9p-4 }, /* i=108 124.9 */ - { 0x1.6e8c2130b8ef7p+0, -0x7.4fe72109176175708ap-56, -0x2.044824bcf4f54p-4, 0xd.543789a246f9e71428p-60, 0x7.c23b984e273b4p-8, 0x1.7fcdbd44ef2b12046ap-60, -0x2.7a2aa3987179ep-8, 0xd.adf3d55c30f80be908p-64, 0xe.7e71825de6cbp-12, -0x2.f0e9902e713c13995cp-64, -0x5.bd79f1983820cp-12, 0x1.d188beec6253a67226p-64, 0x2.655a46b32e5ecp-12, -0xa.92c17e4af8b5b3202p-68, -0x1.09b7cae961483p-12, 0x6.079dc26706af93eed6p-68, 0x7.65aba0501d20cp-16, -0x3.5dca9027cd994p-16, 0x1.8ef9c983ad9e9p-16, -0xb.b4f3cf5dee878p-20, 0xd.bp-4 }, /* i=109 125.0 */ - { 0x1.6e4bb7214ccfep+0, 0x5.fec2690f3b325f8b3p-56, -0x2.02596fa8d7596p-4, 0xb.d70c342f67068897dp-60, 0x7.b37439933b4dp-8, -0x1.94516f3b25040baf268p-60, -0x2.72f9acb6b85f6p-8, 0x5.7acbe6a9f32d81be9cp-64, 0xe.45995f780259p-12, 0x3.5f6f01e7d67890fb0ep-64, -0x5.a110191cbe78p-12, -0xa.f014b293e88d2f264p-68, 0x2.5705752d3a96ep-12, 0x6.1432b6ca7a400c7d14p-68, -0x1.02700ed5262d5p-12, 0x7.a8bee6652cd332e128p-68, 0x7.2a282deb4b25cp-16, -0x3.3f3dbca10e6aep-16, 0x1.7f3b405c94ef3p-16, -0xb.32b29bc541fp-20, 0xd.dp-4 }, /* i=110 125.0 */ - { 0x1.6e0b8aad9f084p+0, 0x2.9efd2b776c82e73738p-56, -0x2.006e670ec17d2p-4, -0x2.72f9076bb7e832c4a4p-60, 0x7.a4d7abeaa0ce8p-8, 0x6.8ab3eebe66dddeeb6p-64, -0x2.6be4db6c2801p-8, -0xa.60ebfe3c4e1e471a48p-64, 0xe.0dda0b0c22e7p-12, 0x3.1c9c98a503b362f03ap-64, -0x5.854fdd5d4b91p-12, -0xb.b7c82dc145fbc1ddp-72, 0x2.4914f44e8eep-12, 0x6.2163f31748597249d4p-68, -0xf.b62c6e620d0d8p-16, 0x1.a7352f03725a5b73e3p-68, 0x6.f0bfb9ef0aba4p-16, -0x3.21e4e87ef3bfp-16, 0x1.702b892264734p-16, -0xa.b69c73549a9d8p-20, 0xd.fp-4 }, /* i=111 125.2 */ - { 0x1.6dcb9b60cabbcp+0, -0x5.5b8613fcf2e4159972p-56, -0x1.fe87004f68188p-4, -0x6.f61b59b07aa9a3428ap-60, 0x7.96654814b84a4p-8, 0x1.b426d2f674cf7cd868p-60, -0x2.64eba4f5a7fb2p-8, -0x7.69bc9f0a01d21455a4p-64, 0xd.d72cfc3e7a92p-12, 0xe.e4d8b4cc600dd92dp-72, -0x5.6a349d85c6af4p-12, 0xa.e147c52a1efb7ff9f8p-68, 0x2.3b85a0481d464p-12, -0xe.d8cfb7be78188085ccp-68, -0xf.48de2c967dd88p-16, -0x1.b4551fb89ddc11c3bp-72, 0x6.b95d155b9cep-16, -0x3.05b2beb322b84p-16, 0x1.61c26257ffebfp-16, -0xa.4060794bdecbp-20, 0xe.1p-4 }, /* i=112 125.2 */ - { 0x1.6d8be8c73c5e4p+0, 0x4.4100f0cc3c0cc83f5p-56, -0x1.fca330f4e888ap-4, -0x1.d995259992e599f1e4p-60, 0x7.881c6a08be888p-8, 0xb.b72128aac182d5577p-64, -0x2.5e0d81c91add2p-8, 0x6.e848ab17dead60313p-64, 0xd.a18bd7c15c04p-12, -0x3.00ee4eb32dd083d668p-64, -0x5.4fb9ddc4bb2d8p-12, 0xd.35c55cd74533fb703p-68, 0x2.2e54719d40d98p-12, 0x2.ef7b95368f5f47f068p-68, -0xe.def66e4fd7c08p-16, -0x2.c2a86d1eb75857833fp-68, 0x6.83ebfb76ddb7cp-16, -0x2.ea9a8b2887feep-16, 0x1.53f7f3ee5cabp-16, -0x9.cfb23ea1f3a2p-20, 0xe.3p-4 }, /* i=113 125.2 */ - { 0x1.6d4c726eac944p+0, -0x3.0c005fdd4e5d5ed16p-56, -0x1.fac2eeb1fd7ddp-4, -0x6.cd9a4308f7c0c1df2p-64, 0x7.79fc70e1ba4b4p-8, 0x1.8042474f55f24cf0918p-60, -0x2.5749ed7ef2876p-8, 0xc.948eff7789900b7a7p-64, 0xd.6cf06e69acf08p-12, 0x2.1b3cc4976780e768fep-64, -0x5.35db45fe2eed8p-12, 0xb.a96403914814a6d4p-72, 0x2.217e7c07eea3p-12, 0x9.d534dae411c7b5064cp-68, -0xe.7856b731986d8p-16, -0x2.9211255b30e7daa5cdp-68, 0x6.505906c54cd6cp-16, -0x2.d090328d213bap-16, 0x1.46c4cd3dd31e2p-16, -0x9.644987d4c7fc8p-20, 0xe.5p-4 }, /* i=114 125.2 */ - { 0x1.6d0d37e61b2b3p+0, 0x5.622cea774714dc2984p-56, -0x1.f8e62f61385dap-4, -0xe.01b50ad49cb3d7ed4p-64, 0x7.6c04becbee76p-8, 0x1.96244448ff9deb8a418p-60, -0x2.50a066bc771a2p-8, 0xd.ba5dd91a799e4a4e9cp-64, 0xd.3954bbd01aa58p-12, -0x4.b2f185a15955c1c32p-68, -0x5.1c94a08b7ca18p-12, -0x1.c674faa437d5fe44f2p-64, 0x2.1500ed691cae8p-12, -0x3.9ba2314dd9fd708c5cp-68, -0xe.14e1ba832223p-16, -0x2.d86d7fef87a3d00db5p-68, 0x6.1e91a692dcc6p-16, -0x2.b7882a8f0df38p-16, 0x1.3a21ddc3c840cp-16, -0x8.fde20aad9148p-20, 0xe.7p-4 }, /* i=115 125.4 */ - { 0x1.6cce38bdca2b4p+0, 0x7.63bedd9ef8f1de529ep-56, -0x1.f70ce9043f382p-4, 0x3.19ea6c6a61389f622cp-60, 0x7.5e34b8f2cc82cp-8, -0x1.69841536fde98309db8p-60, -0x2.4a106f1eba33ep-8, -0xd.56071d5b8c95cc715p-64, 0xd.06b2e4fe91548p-12, -0x1.74c58d693d9e767ap-64, -0x5.03e1d907a2ddcp-12, 0x1.61ace928d4f4cb6b66p-64, 0x2.08d90cc4cc9aap-12, 0xf.9590b435d3d8104p-80, -0xd.b47b4e336f918p-16, -0x2.af7ed1802c0d781739p-68, 0x5.ee841503954ep-16, -0x2.9f77728622e0ap-16, 0x1.2e0870fae4c64p-16, -0x8.9c3b34d5c9e88p-20, 0xe.9p-4 }, /* i=116 125.5 */ - { 0x1.6c8f748739006p+0, 0x5.da3781e570bdd788acp-56, -0x1.f53711c30f30dp-4, -0x7.5ca626a9c385c7046ap-60, 0x7.508bc76f634d8p-8, -0x7.e23d3cd6b51b481578p-64, -0x2.43998b26307dap-8, 0x8.d9d97300eca00a3fe8p-64, 0xc.d50537297c3dp-12, -0x2.123b2409ac957a72fap-64, -0x4.ebbefb277f8f8p-12, -0xd.bf7caa869eedc1b3ap-68, 0x1.fd0439492e90cp-12, 0x7.797cdcb60c711abffap-68, -0xd.57085e77b027p-16, 0x1.412de9c41dceb983bfp-68, 0x5.c01f4da4ad91cp-16, -0x2.88538c83aaf58p-16, 0x1.227228b21b496p-16, -0x8.3f17f3a7ba18p-20, 0xe.bp-4 }, /* i=117 125.5 */ - { 0x1.6c50ead51fbb2p+0, -0x6.3e63d5db2040214862p-56, -0x1.f3649feb433d2p-4, -0x2.94f737b2a19a36dd88p-60, 0x7.430955374664p-8, -0xb.c5cc2ea76057df299p-64, -0x2.3d3b4222ebbbcp-8, 0x5.912f204ec5dd36a8bp-64, 0xc.a44626745a038p-12, 0x3.6866c5703cafa77a1dp-64, -0x4.d428319d75d98p-12, 0x7.d496378f6016448a8p-68, 0x1.f17fe960588aap-12, -0x6.0f7c4384cc8a89cb08p-68, -0xc.fc6ee1fcfe09p-16, 0x1.b14dfe63db3f55fe5p-68, 0x5.9353047720428p-16, -0x2.721276c26497ep-16, 0x1.1758f787b308ep-16, -0x7.e63e7e57267bcp-20, 0xe.dp-4 }, /* i=118 125.5 */ - { 0x1.6c129b3b6a682p+0, 0x3.b51399eee26774b35ap-56, -0x1.f19589ef5f19cp-4, -0x5.a44b5db43db2ac66fcp-60, 0x7.35acd00bea23p-8, -0x1.967634028b474853b6p-60, -0x2.36f51e216fd9p-8, 0xa.beb543f532ebe1aap-68, 0xc.74704cc13584p-12, -0x3.de9c90904a2a411495p-64, -0x4.bd19c50802518p-12, -0x3.d10b2eeb3dafa2dedp-68, 0x1.e649a9cc14727p-12, 0x3.4d433fa89cdd54f5ecp-68, -0xc.a495cea5cb318p-16, 0x6.48942fb7c66adcc08p-72, 0x5.680f9d6d21a68p-16, -0x2.5caaa57126ee8p-16, 0x1.0cb71df9bc2afp-16, -0x7.91782847aa228p-20, 0xe.fp-4 }, /* i=119 125.7 */ - { 0x1.6bd4854f347e8p+0, -0x3.3a8337f26c9bfedf48p-56, -0x1.efc9c6661e5b7p-4, 0x5.e7294602d56a7a16ep-64, 0x7.2875a86a7113p-8, 0x1.0a5c5f3ffaaffe5286p-60, -0x2.30c6abd81d90ep-8, -0xc.8181e928677c6b398p-64, 0xc.457e688a981bp-12, -0x9.d4f076fb7ba433766p-68, -0x4.a6901aeac7658p-12, -0xf.50a7a2b6c0b2c8dbep-68, 0x1.db5f1ccb4df3dp-12, 0x2.346e4b0436d095ff52p-68, -0xc.4f650ecc0928p-16, -0x3.cd65404e295f92fae3p-68, 0x5.3e462454524a4p-16, -0x2.4812fcd2f58eap-16, 0x1.028725fa13a56p-16, -0x7.4091330bb3ca4p-20, 0xf.1p-4 }, /* i=120 125.8 */ - { 0x1.6b96a8a6c4633p+0, 0x5.0a970e7f2cd9ed9aaep-56, -0x1.ee014c09c77e1p-4, 0x7.d464d03b871440292cp-60, 0x7.1b63517be711cp-8, 0xb.07d499fba45384ca48p-64, -0x2.2aaf7a952d98cp-8, 0xc.e58d68a00a4968bc44p-64, 0xc.176b5bc78efbp-12, 0x3.29de1408c4a433783cp-64, -0x4.9087b4b1a1144p-12, 0x1.7682e4495ab33a6ff7p-64, 0x1.d0bdf948aec3cp-12, 0x1.38dcd162dd945a8008p-68, -0xb.fcc577016efa8p-16, 0x1.0eecb072f72eb815dp-68, 0x5.15e84526d5918p-16, -0x2.3442cbaf99448p-16, 0xf.8c3de5be7607p-20, -0x6.f358a21549f88p-20, 0xf.3p-4 }, /* i=121 125.8 */ - { 0x1.6b5904d98702bp+0, 0x1.c5c8c14396e8dd3a82p-56, -0x1.ec3c11b782d7dp-4, -0x5.57671e0774fad60926p-60, 0x7.0e754105e6f18p-8, 0x1.beb33416803cdb5a548p-60, -0x2.24af1c2d37552p-8, 0x4.bcc5f03c718719c83cp-64, 0xb.ea322ad961538p-12, 0x3.a1681b4c8092bc376ep-64, -0x4.7afd2ebd5458p-12, 0x1.09e5222f9f04fd7515p-64, 0x1.c6640a11fdc9fp-12, 0x4.37d9d39795ce05ccbp-68, -0xb.aca0bc479bae8p-16, 0x3.e21afb0a9b0ef2d2fap-68, 0x4.eee844bdc93b8p-16, -0x2.2131c61021a2ep-16, 0xe.f68575d780188p-20, -0x6.a9a011e3f68dp-20, 0xf.5p-4 }, /* i=122 125.7 */ - { 0x1.6b1b99800b7edp+0, 0x4.164447102409afcd2p-60, -0x1.ea7a0e6eb5564p-4, -0x7.ebf320a56064bfb1cp-64, 0x7.01aaef5ba75bcp-8, 0xf.ed6b1f4610752b63d8p-64, -0x2.1ec524ea3e5cep-8, 0xc.6f1ed7ccef62ba1fdp-64, 0xb.bdcdfb829944p-12, -0xb.00a642dc338f5c8abp-68, -0x4.65ed3f79738dcp-12, 0x1.5f84ad02da05e8a896p-64, 0x1.bc4f2d17dae72p-12, -0x5.a8c62428723945p-72, -0xb.5ee16aba28dbp-16, -0x2.1874803ca4519ceff7p-68, 0x4.c938f9dff1eacp-16, -0x2.0ed80042faeb4p-16, 0xe.66fdf2d360d18p-20, -0x6.633b93f3caef8p-20, 0xf.7p-4 }, /* i=123 125.9 */ - { 0x1.6ade6633fef17p+0, 0x5.d16674c9af0b94fd42p-56, -0x1.e8bb39505eeadp-4, 0x2.5f231a2b6f186bd012p-60, 0x6.f503d74f6bd8p-8, 0x1.9f5d6daa73b0630315p-60, -0x2.18f12b7b42348p-8, 0xf.7ae8c36cd99d65c018p-64, 0xb.923a13e705738p-12, 0x3.8bfca2b60d5b8068f2p-64, -0x4.5154b67b15cap-12, 0x1.83a44bb07f7e10930ep-64, 0x1.b27d52b576204p-12, 0x5.4bf61b3d7052a4fb14p-68, -0xb.1372dca5119e8p-16, 0x5.24547e2ffc5ab358p-72, 0x4.a4cdc6a7b610cp-16, -0x1.fd2dea23882d9p-16, 0xd.dd5ff8838a598p-20, -0x6.20018b8113e8cp-20, 0xf.9p-4 }, /* i=124 125.9 */ - { 0x1.6aa16a9028432p+0, -0x7.8414a0f94ed0af18fp-56, -0x1.e6ff899e7c8fap-4, 0x3.9e11e6af39b1b69c4cp-60, 0x6.e87f762456fa4p-8, -0x1.6d3e0c710666c64dc28p-60, -0x2.1332c8e44bdd8p-8, -0x9.c3bf9e9af144375d7cp-64, 0xb.6771d9945ceb8p-12, -0x2.cc5bc54a4c4735ede4p-64, -0x4.3d307ba80384cp-12, -0x3.d6fca78bdba7f15bcp-68, 0x1.a8ec7cffe5bd7p-12, 0x5.e000fcde0c04a6d8ap-72, -0xa.ca4132021e1e8p-16, -0x3.ee15f9c5ad67cb6b49p-68, 0x4.819a923bd50b8p-16, -0x1.ec2c4aa17005dp-16, 0xd.59678aeefe5bp-20, -0x5.dfca887f5932p-20, 0xf.bp-4 }, /* i=125 126.1 */ - { 0x1.6a64a6306414dp+0, -0x1.2728c849ad57b51148p-56, -0x1.e546f6bb6dcb8p-4, -0x6.78bcc9b64aceab1d7cp-60, 0x6.dc1d4b809acfp-8, 0xb.e063d6aca19e3be5f8p-64, -0x2.0d89986ef4fcap-8, -0xf.20e58a3606b2c2e1a4p-64, 0xb.3d70d09332588p-12, -0x3.61cb62faa1391338e1p-64, -0x4.297d8e65ff3c4p-12, -0xb.5cad6b584356f728dp-68, 0x1.9f9abf1cc3708p-12, 0x7.5b7c7241a81002a1e6p-68, -0xa.833948584b7cp-16, -0x2.6e6ff17b906b3b0fd1p-68, 0x4.5f93c2d66b9fcp-16, -0x1.dbcc3b84025fdp-16, 0xc.dad414bd0d0c8p-20, -0x5.a2712f93001cp-20, 0xf.dp-4 }, /* i=126 126.2 */ - { 0x1.6a2818c0bd494p+0, -0x4.56db480b4368ceeaf6p-56, -0x1.e39178965b6c5p-4, -0x4.20bb3f4eeda06f112ap-60, 0x6.cfdcdc6bf4918p-8, 0x1.854e6a9a87f2c589998p-60, -0x2.07f538fdead68p-8, 0xf.6663706c5be74c573p-64, 0xb.1432a4b775e7p-12, 0x3.37638caafde049b51p-64, -0x4.16390995676c4p-12, -0x1.951a08db4b9fb024f88p-64, 0x1.96863edd5ccb1p-12, 0x4.c97a59d57ef626d41ep-68, -0xa.3e48c3f324a28p-16, -0x2.f34dd5d39f24ddaa2ep-68, 0x4.3eae402c67548p-16, -0x1.cc072944ca63dp-16, 0xc.61682c3d319p-20, -0x5.67d221e8a35b4p-20, 0xf.effff8p-4 }, /* i=127 126.2 */ -}; +static double __attribute__((noinline)) as_acos_refine(double, double); -typedef union { double x; uint32_t i[2]; } union_t; +double cr_acos (double x){ + // coefficients of a polynomial approximation of asin(x): + // asin(x) = x*(cc[j][0] + cc[j][1] + t*P(t, cc[j] + 2)) + // where t = x^2 - j/128 + static const double cc[][8] = { + { 1, 0, 0x1.5555555555555p-3, 0x1.33333333333e4p-4, + 0x1.6db6db6d31f82p-5, 0x1.f1c71f6889397p-6, 0x1.6e874b7045b46p-6, 0x1.1f753132271e2p-6}, + {0x1.0055a27e0d033p+0, -0x1.d9ba10494c062p-54, 0x1.57c00cb5d6c4dp-3, 0x1.37881f5649a75p-4, + 0x1.759af49d494ddp-5, 0x1.002e1864dda2ep-5, 0x1.7c2d5d468cdd9p-6, 0x1.292834c025357p-6}, + {0x1.00abe0c129e1ep+0, 0x1.7ceb0ee49d42ap-57, 0x1.5a3385d5c7ba5p-3, 0x1.3bf51056f6637p-4, + 0x1.7dba76b124b37p-5, 0x1.07be4b02e94c4p-5, 0x1.8a6bb92513f01p-6, 0x1.36afd4c615aecp-6}, + {0x1.0102bcffd6acdp+0, -0x1.c2294c65d2e86p-55, 0x1.5caff17351901p-3, 0x1.407abbc04feb3p-4, + 0x1.86179b8005949p-5, 0x1.0f97520bd4e72p-5, 0x1.9950c5c89f3dfp-6, 0x1.44f2344e7b664p-6}, + {0x1.015a397cf0f1cp+0, -0x1.eebd6ccfe3ee3p-55, 0x1.5f3581be7b08bp-3, 0x1.4519ddf1ae531p-4, + 0x1.8eb4b6ee35e92p-5, 0x1.17bc85414cd46p-5, 0x1.a8e5895e3fcf9p-6, 0x1.53fafdc629400p-6}, + {0x1.01b2588811eebp+0, 0x1.7193e5d0a915fp-59, 0x1.61c46a67205d2p-3, 0x1.49d33a6eeae0bp-4, + 0x1.979438563c014p-5, 0x1.20316ae977f05p-5, 0x1.b9339afb53aa4p-6, 0x1.63d6b02c42d0ap-6}, + {0x1.020b1c7df0575p+0, -0x1.dd547e329c1e5p-55, 0x1.645ce0ab901bbp-3, 0x1.4ea79c34fc7a6p-4, + 0x1.a0b8ac08940ecp-5, 0x1.28f9babd0629bp-5, 0x1.ca452cf90a55ep-6, 0x1.7492b016730efp-6}, + {0x1.026487c8c5d71p+0, -0x1.5fd9b68dc3b6ep-54, 0x1.66ff1b67d5d70p-3, 0x1.5397d613373ebp-4, + 0x1.aa24bce3aeb4ap-5, 0x1.3219610b150acp-5, 0x1.dc251825103f1p-6, 0x1.863d5a3932532p-6}, + {0x1.02be9ce0b87cdp+0, 0x1.e5d09da2e0f04p-56, 0x1.69ab5325bc359p-3, 0x1.58a4c3097aab3p-4, + 0x1.b3db3605f46f2p-5, 0x1.3b94821742cabp-5, 0x1.eedee7da72a15p-6, 0x1.98e6179a3e9a0p-6}, + {0x1.03195e4c483f1p+0, -0x1.5db10ad66eacbp-54, 0x1.6c61c22d908f0p-3, 0x1.5dcf46ab9f2cbp-4, + 0x1.bddf049bb1f4dp-5, 0x1.456f7db6ac768p-5, 0x1.013f738bd7bb3p-5, 0x1.ac9d739783d21p-6}, + {0x1.0374cea0c0c9fp+0, -0x1.917bff5241c76p-54, 0x1.6f22a497b2ec0p-3, 0x1.63184d8a79db5p-4, + 0x1.c83339caf946ep-5, 0x1.4faef331019d4p-5, 0x1.0b8917547d678p-5, 0x1.c17533f147e1cp-6}, + {0x1.03d0f082afcc8p+0, -0x1.018bbcddb49ebp-54, 0x1.71ee385efdf06p-3, 0x1.6880cda2d3885p-4, + 0x1.d2db0cbfae54dp-5, 0x1.5a57c56b50c5ep-5, 0x1.16535a40098b2p-5, 0x1.d780730b8ebb8p-6}, + {0x1.042dc6a65ffbfp+0, -0x1.c7ea28dce95d1p-55, 0x1.74c4bd7412f9ep-3, 0x1.6e09c6d2b72bcp-4, + 0x1.ddd9dcda253dep-5, 0x1.656f1f62b5001p-5, 0x1.21a5ae2ac77eep-5, 0x1.eed3bca067f0ep-6}, + {0x1.048b53d05907bp+0, 0x1.634fffed6e2a6p-54, 0x1.77a675d1978bep-3, 0x1.73b4435583415p-4, + 0x1.e9333402ebbf3p-5, 0x1.70fa78fd9f73fp-5, 0x1.2d8804d934fe1p-5, 0x1.03c29691a281cp-5}, + {0x1.04e99ad5e4bcdp+0, -0x1.e97a72fe827e0p-54, 0x1.7a93a5917200cp-3, 0x1.7981584731c05p-4, + 0x1.f4eac9268fae2p-5, 0x1.7cff9c3b19721p-5, 0x1.3a02d9c1e0145p-5, 0x1.10d64a0e56953p-5}, + {0x1.05489e9d99995p+0, 0x1.d177637ec6a2bp-55, 0x1.7d8c930314681p-3, 0x1.7f72262f532e4p-4, + 0x1.0082416e39013p-4, 0x1.8984aac80ddf4p-5, 0x1.471f3caf18eb8p-5, 0x1.1eb1cce6dd570p-5}, + {0x1.05a8621feb16bp+0, -0x1.e5b33b1407c5fp-56, 0x1.809186c2e57ddp-3, 0x1.8587d99442dc8p-4, + 0x1.06c23d1dfcb7fp-4, 0x1.969024036dd22p-5, 0x1.54e6dd4d2af33p-5, 0x1.2d62f439f2a31p-5}, + {0x1.0608e867bff30p+0, 0x1.cbef5d8580027p-55, 0x1.83a2cbd2d8ba2p-3, 0x1.8bc3ab9724c6ep-4, + 0x1.0d377ef1e0c39p-4, 0x1.a428eb7addf84p-5, 0x1.636417bc01ff2p-5, 0x1.3cf8acc7eb2a0p-5}, + {0x1.066a34930ec8dp+0, -0x1.480f445fedad1p-54, 0x1.86c0afb447a74p-3, 0x1.9226e29948d9cp-4, + 0x1.13e44a9b5a3a6p-4, 0x1.b2564fea8b3fep-5, 0x1.72a2023d92458p-5, 0x1.4d8313cec3485p-5}, + {0x1.06cc49d38146cp+0, -0x1.b55394f4fc07bp-55, 0x1.89eb82831feedp-3, 0x1.98b2d2eb9bb23p-4, + 0x1.1acb01e9ab414p-4, 0x1.c12012cbd00c6p-5, 0x1.82ac7c1d15c38p-5, 0x1.5f13925c6edcap-5}, + {0x1.072f2b6f1e601p+0, -0x1.2dcbb05419970p-54, 0x1.8d2397127aebbp-3, 0x1.9f68df88da51dp-4, + 0x1.21ee26a4f62a1p-4, 0x1.d08e707f7ae6fp-5, 0x1.93903dee3feb0p-5, 0x1.71bcfb5c57b59p-5}, + {0x1.0792dcc0fbd20p+0, -0x1.5bf23ee4f9d54p-56, 0x1.9069430ab508ap-3, 0x1.a64a7adb4cd85p-4, + 0x1.29505c8b48349p-4, 0x1.e0aa2921cfa60p-5, 0x1.a55aeb46f4322p-5, 0x1.8593acad3becep-5}, + {0x1.07f76139f761dp+0, 0x1.fa1046481bb82p-54, 0x1.93bcdf091cca6p-3, 0x1.ad59278edc42fp-4, + 0x1.30f46b7261652p-4, 0x1.f17c8a17c843ep-5, 0x1.b81b2619e15b5p-5, 0x1.9aadb395f5ae4p-5}, + {0x1.085cbc61783c1p+0, 0x1.0a6e9efa20176p-54, 0x1.971ec6c1531e4p-3, 0x1.b496797068912p-4, + 0x1.38dd419140184p-4, 0x1.0187bc3357bbbp-4, 0x1.cbe0a3dcafe26p-5, 0x1.b122f4fa499d0p-5}, + {0x1.08c2f1d638e4cp+0, 0x1.b47c159534a3dp-56, 0x1.9a8f592078624p-3, 0x1.bc04165b57ab2p-4, + 0x1.410df5f4bed1dp-4, 0x1.0ab6bdf478c71p-4, 0x1.e0bc44a945c64p-5, 0x1.c90d59bcd5701p-5}, + {0x1.092a054f1a2fcp+0, -0x1.2f657224e9830p-54, 0x1.9e0ef87243a2cp-3, 0x1.c3a3b7366a278p-4, + 0x1.4989cb22e2175p-4, 0x1.1450e5ba7ad39p-4, 0x1.f6c02c8f0ef93p-5, 0x1.e288ffc8d182cp-5}, + {0x1.0991fa9bffbf4p+0, -0x1.ca1140a1abbf4p-58, 0x1.a19e0a8823b80p-3, 0x1.cb772900f9c24p-4, + 0x1.525431f0cbb2ep-4, 0x1.1e5c2d06804e1p-4, 0x1.06ffefa7aa6b8p-4, 0x1.fdb4704dca347p-5}, + {0x1.09fad5a6b68f9p+0, 0x1.aa1f06e92964ep-56, 0x1.a53cf8e28c50ep-3, 0x1.d3804df1de350p-4, + 0x1.5b70cc8fa98dcp-4, 0x1.28def298c979bp-4, 0x1.13482f6347eebp-4, 0x1.0d586de48358cp-4}, + {0x1.0a649a73e61f2p+0, 0x1.74ac0d817e9c7p-55, 0x1.a8ec30dc93891p-3, 0x1.dbc11ea950625p-4, + 0x1.64e371d5616d3p-4, 0x1.33e0023936249p-4, 0x1.204426263066ap-4, 0x1.1cd12e4629723p-4}, + {0x1.0acf4d240ccc4p+0, 0x1.da890f3b40bd3p-54, 0x1.acac23da07797p-3, 0x1.e43bab7741a98p-4, + 0x1.6eb030c631819p-4, 0x1.3f669d2eb516ep-4, 0x1.2e0006ae505aep-4, 0x1.2d58204457c82p-4}, + {0x1.0b3af1f4880bbp+0, 0x1.f450fb78d32bap-56, 0x1.b07d4778263afp-3, 0x1.ecf21db7be0efp-4, + 0x1.78db5465013e4p-4, 0x1.4b7a8376f0996p-4, 0x1.3c88f9f2ef221p-4, 0x1.3f02ad9eb9753p-4}, + {0x1.0ba78d40a9260p+0, -0x1.57b07a441e242p-54, 0x1.b46015c126262p-3, 0x1.f5e6b94713f3dp-4, + 0x1.836967d0afecfp-4, 0x1.5823fdd1707b9p-4, 0x1.4bed355269dc2p-4, 0x1.51e83065121cfp-4}, + {0x1.0c152382d7366p+0, -0x1.ee6913347c2a6p-54, 0x1.b8550d62bfb6ep-3, 0x1.ff1bde0fa3cadp-4, + 0x1.8e5f3ab550989p-4, 0x1.656be8b38ebafp-4, 0x1.5c3c13008a099p-4, 0x1.662225a1b4f77p-4}, + }; -/* slow path, assumes |x| < 1 */ -static double -slow_path (double x) -{ - double absx, y, h, l, u, v; - union_t w; - const double *p; - absx = x > 0 ? x : -x; - w.x = 1.0 + absx; /* 1 <= w.x <= 2 */ - /* Warning: w.x might be 2 for rounding up or nearest. */ - int i = (w.x == 2.0) ? 127 : (w.i[1] >> 13) & 127; - if (i < 64) /* |x| < 0.5 */ - { - p = T2[i]; - y = absx - p[DEGREE+LARGE+1]; /* exact */ - h = p[DEGREE+LARGE]; - l = 0; - for (int j = DEGREE - 1; j >= 0; j--) - { - if (j >= LARGE) /* use double only */ - h = p[LARGE+j] + h * y, l = 0; - else /* use double-double */ - { - /* multiply by y */ - mul2_1 (&u, &v, h, l, y); - /* add coefficient of degree j */ - /* Warning: for i=0, the coefficients p[2*j] are tiny for j even, - and fast_two_sum(h,l,a,b) requires |a| >= |b|, or at least - exp(a) >= exp(b). */ - if (__builtin_fabs (p[2*j]) >= __builtin_fabs (u)) - fast_two_sum (&h, &l, p[2*j], u); - else - fast_two_sum (&h, &l, u, p[2*j]); - l += p[2*j+1] + v; - } - } - /* acos(x) ~ pi/2 + (h + l) for x > 0, pi/2 - (h + l) for x < 0 */ - if (x < 0) - h = -h, l = -l; - fast_two_sum (&u, &v, pi_hi / 2, h); - v += pi_lo / 2 + l; - static const double err = 0x1.01p-106; - double left = u + (v - err), right = u + (v + err); - if (left == right) - return left; - if (__builtin_fabs (x) <= 0x1.1a62633145c07p-54) - { - u = pi_hi / 2; - if (x == 0x1.1a62633145c07p-54) - /* in that case pi_lo / 2 - x is zero, thus we need to consider some - extra bits of pi/2 */ - v = -0x1.f1976b7ed8fbcp-110; - /* For |x| <= 0x1.1a62633145c06p-54, acos(x) is between the two - binary64 numbers surrounding pi/2. - for x <= -0x1.cb3b399d747f3p-55, we get nextabove(pi_hi/2) for RNDN */ - else if (x <= -0x1.cb3b399d747f3p-55) - v = 0x1.1p-53; /* 0x1.1p-53 is slightly larger than 1/2*ulp(pi_hi/2) */ - else - v = 0x1p-100; - } - else if (x == 0x1.53ea6c7255e88p-4) - u = 0x1.7cdacb6bbe707p+0, v = 0x1.fffffffffffffp-54; - else if (x == 0x1.390e6939cd1a6p-5) - u = 0x1.8856a5d3296a4p+0, v = -0x1.d694b07476007p-110; - else if (x == 0x1.1cdcd1ea2ad3bp-9) - u = 0x1.919146d3f492fp+0, v = -0x1.ab8423060c0e9p-111; - else if (x == 0x1.fd737be914578p-11) - u = 0x1.91e006d41d8d9p+0, v = -0x1.b51c7c3f78631p-116; - else if (x == -0x1.efdc1acd5970dp-6) - u = 0x1.99df733b7b385p+0, v = -0x1.fffffffffffffp-54; - else if (x == -0x1.124411a0ec32ep-5) - u = 0x1.9ab23ecdd436bp+0, v = -0x1.fffffffffffffp-54; - else if (x == -0x1.52f06359672cdp-2) - u = 0x1.e87ccc94ba419p+0, v = -0x1.fffffffffffffp-54; - else if (x == 0x1.0c953e71a6263p-26) - u = 0x1.921fb5011d81fp+0, v = -0x1.fffffffffffffp-54; - else if (x == 0x1.0c953e91a6263p-26) - u = 0x1.921fb5011d81ep+0, v = -0x1.4e183a0a0b796p-110; - else if (x == 0x1.04239f1c69896p-24) - u = 0x1.921fb4401f327p+0, v = -0x1.fffffffffffffp-54; - else if (x == 0x1.7151512be14bep-19) - u = 0x1.921f871a18ac1p+0, v = -0x1.fffffffffffffp-54; - else if (x == 0x1.faf8ee125cf02p-18) - u = 0x1.921f3686074cfp+0, v = -0x1.fffffffffffffp-54; - else if (x == 0x1.2c759e3848cc8p-13) - u = 0x1.9216519750855p+0, v = -0x1.fffffffffffffp-54; - return u + v; - } - else /* 0.5 <= |x| < 1 */ - { - double h1, l1; - h1 = 1.0 - absx; /* exact since |x| >= 0.5 */ - h1 = sqrt_dbl_dbl (h1, &l1); - p = T2[i]; - y = absx - p[DEGREE+LARGE+1]; /* exact */ - h = p[DEGREE+LARGE]; - l = 0; - for (int j = DEGREE - 1; j >= 0; j--) - { - if (j >= LARGE) /* use double only */ - h = p[LARGE+j] + h * y, l = 0; - else /* use double-double */ - { - /* multiply by y */ - mul2_1 (&u, &v, h, l, y); - /* add coefficient of degree j */ - fast_two_sum (&h, &l, p[2*j], u); - l += p[2*j+1] + v; - } + b64u64_u ix = {.f = x}; + u64 ax = ix.u<<1; + double t,z,zl,jd,f0h,f0l; + if(ax>0x7fc0000000000000ul){ // |x|>0.5 + static const double off[][2] = {{0,0}, {0x1.921fb54442d18p+1, 0x1.1a62633145c07p-53}}; + i64 k = ix.u>>63; + f0h = off[k][0]; + f0l = off[k][1]; + if(__builtin_expect(ax>=0x7fe0000000000000ul, 0)){ // |x| >= 1 + if(ax==0x7fe0000000000000ul) return f0h + f0l; // |x| = 1 + if(ax>0xffe0000000000000ul) return x; // nan + errno = EDOM; + return 0./0.; // |x|>1 } - /* acos(x) ~ (h1 + l1) * (h + l) */ - dekker (&u, &v, h1, h); - v += l1 * h + h1 * l; - if (x < 0) - { - fast_two_sum (&u, &l, pi_hi, -u); - v = l + pi_lo - v; - } - static const double err = 0x1p-104; - double left = u + (v - err), right = u + (v + err); - if (left == right) - return left; - if (x == 0x1.11b3c109f983bp-1) - u = 0x1.01bd20609b7b3p+0, v = -0x1.fffffffffffffp-54; - else if (x == 0x1.78daf01036d0dp-1) - u = 0x1.7cb7648526f99p-1, v = -0x1.3198d5f8c3cf4p-106; - else if (x == -0x1.f7dd87f7cd608p-1) - u = 0x1.7b46c8ef81685p1, v = 0x1.95019608680bep-105; - return u + v; + // for x>0.5 we use range reduction for double angle formula + // acos(x) = 2*asin((1-x)/2) and for x<-0.5 acos(x) = pi - + // 2*asin((1-x)/2) + t = 2 - 2*__builtin_fabs(x); + jd = __builtin_roundeven(t*0x1p5); + z = __builtin_copysign(__builtin_sqrt(t), x); + zl = __builtin_fma(z,z,-t)*((-0.5/t)*z); + t = 0.25*t - jd*0x1p-7; + } else { // |x|<=0.5 + // for |x|<=0.5 we use acos(x) = pi/2 - asin(x) so the argument + // range for asin is the same for both branches to reuse the lookup + // tables. + t = x*x; + jd = __builtin_roundeven(t*0x1p7); + t = __builtin_fma(x,x,-0x1p-7*jd); + z = -x; + zl = 0; + f0h = 0x1.921fb54442d18p+0; + f0l = 0x1.1a62633145c07p-54; } + // asin(xh+xl) = (xh + xl)*(cc[j][0] + (cc[j][1] + t*Poly(t, cc[j]+2))) + // where t = xh^2 - j/128 and j = round(128*xh^2) + long j = jd; + const double *c = cc[j]; + double t2 = t*t, d = t*((c[2] + t*c[3]) + t2*((c[4] + t*c[5]) + t2*(c[6] + t*c[7]))); + double fh = c[0], fl = c[1] + d; + fh = muldd(z,zl, fh,fl, &fl); + fh = fastsum(f0h,f0l, fh,fl, &fl); + double eps = __builtin_fabs(z*t)*0x1.38p-52 + 0x1p-105; + double lb = fh + (fl - eps), ub = fh + (fl + eps); + if(__builtin_expect(lb!=ub, 0)) return as_acos_refine(x, lb); + return lb; } -double -cr_acos (double x) -{ - union_t u,v; - int32_t k; - u.x = x; - u.i[1] &= 0x7fffffff; /* set sign bit to 0 */ - double absx = u.x; - k = u.i[1]; - if (k < 0x3fe80000) { /* |x| < 0.75 */ - /* approximate acos(x) by pi/2 +/- p(x-xmid), where [0,0.75) is split - into 192 sub-intervals */ - v.x = 1.0 + absx; /* 1 <= v.x = 1.75 */ - /* v.i[1] contains 20 significant bits in its low bits, we shift by 12 to - get the upper 8 (ignoring the implicit leading bit) */ - int i = (v.i[1] >> 12) & 255; - /* for x=0x1.7ffffffffffffp-1 and rounding to nearest or up, we have - v.x = 1.75, thus i=192 which is too large for this case */ - if (__builtin_expect (i == 192, 0)) - i = 191; - const double *p = T[i]; - double y = absx - p[7]; /* p[7] = xmid */ - double zh, zl; - double yy = y * y; - /* evaluate in parallel p[1] + p[2] * y and p[3] + p[4] * y, and - p[5] + p[6] * y using Estrin's scheme */ - double p56 = p[5] + p[6] * y; - double p34 = p[3] + p[4] * y; - zh = p34 + yy * p56; - zh = p[2] + y * zh; - fast_two_sum (&zh, &zl, p[1], y * zh); - double u, v; - fast_two_sum (&u, &v, p[0], zh * y); - v += zl * y; - /* Special case for i=0, since we are obliged to use xmid=0 (so that - x-xmid is exact) thus we can't use Gal's trick. This costs about - 0.5 cycle in the average time (for both branches). */ - if (i == 0) - v += 0x4.6989e4b05fa3p-56; - /* acos(x) ~ u + v for x > 0, pi - (u + v) for x < 0 */ - if (x < 0) /* acos(-x) = pi-acos(x) */ - { - fast_two_sum (&u, &zl, pi_hi, -u); - v = pi_lo + zl - v; - } - /* The value 0x1.5fp-61 is optimal among 9-bit values: with a smaller - 9-bit value and RNDD it fails for x=-0x1.77e6d2adf19c3p-1 (i=187). */ - static const double err = 0x1.5fp-61; - double left = u + (v - err), right = u + (v + err); - if (left != right) - return slow_path (x); /* hard to round case */ - return left; - } - /*--------------------------- 0.75 <= |x| < 1 ---------------------*/ - else - if (k < 0x3ff00000) { /* |x| < 1 */ - /* approximate acos(x) by sqrt(1-x)*p(x-xmid) where p is a polynomial, - and [0.75,1) is split into 64 sub-intervals */ - v.x = 1.0 + absx; /* 1 <= v.x <= 2 */ - /* The low 20 bits of v.i[1] are the upper bits (except the - implicit leading bit) of the significand of 1+|x|. - Warning: v.x might be 2 for rounding up or nearest. */ - int i = (v.x == 2.0) ? 255 : (v.i[1] & 0xff000) >> 12; - const double *p = T[i]; - double y = absx - p[6]; /* exact (p[6] = xmid) */ - double h1, l1; - h1 = 1.0 - absx; /* exact since |x| >= 0.5 */ - h1 = sqrt_dbl_dbl (h1, &l1); - double zh, zl; - /* use Estrin's scheme to evaluate p2 + p3*y + p4*y^2 + p5*y^3 */ - double yy = y * y; - double p45 = p[4] + p[5] * y; - double p23 = p[2] + p[3] * y; - zh = p23 + p45 * yy; - zh = p[1] + zh * y; - fast_two_sum (&zh, &zl, p[0], zh * y); - double l1zh = l1 * zh; /* compute earlier */ - double h1zl = h1 * zl; - /* acos(x) ~ (h1 + l1) * (zh + zl) */ - double u, v; - dekker (&u, &v, h1, zh); - v += l1zh + h1zl; - if (x < 0) /* acos(x) = pi - (u+v) */ - { - fast_two_sum (&u, &zl, pi_hi, -u); - /* acos(x) = u + zl + pi_lo - v */ - v = zl + pi_lo - v; - } - /* The value of 'err' is optimal among 9-bit values, for RNDZ and - x=-0x1.95f84d64fce97p-1 (i=202) it fails with a smaller 9-bit value. */ - static const double err = 0x1.afp-65; - double left = u + (v - err), right = u + (v + err); - if (left != right) - return slow_path (x); /* hard to round case */ - return left; - } /* else if (k < 0x3ff00000) */ +double as_acos_refine(double x, double phi){ + // Consider x as sin(phi) then cos(phi) is ch + cl = sqrt(1-x^2) + // Using angle rotation formula bring the argument close to zero + // where the asin Taylor expansion works well. + double s2 = x*x, dx2 = __builtin_fma(x,x,-s2); + double c2l, c2h = fasttwosub(1.0,s2,&c2l); + c2l -= dx2; + c2h = fasttwosum(c2h,c2l,&c2l); + + double c2f = __builtin_fma(x,-x,1); + double ch = __builtin_sqrt(c2f); + double cl = (c2l - __builtin_fma(ch,ch,-c2f))*((0.5/c2f)*ch); + + long jf = __builtin_roundeven(__builtin_fabs(phi - 0x1.921fb54442d18p+0) * 0x1.45f306dc9c883p+4); + // sin(pi/64*j) in the double-double format + static const double s[33][2] = { + {0x0p+0, 0x0p+0}, {-0x1.912bd0d569a9p-61, 0x1.91f65f10dd814p-5}, + {-0x1.e2718d26ed688p-60, 0x1.917a6bc29b42cp-4}, {0x1.13000a89a11ep-58, 0x1.2c8106e8e613ap-3}, + {-0x1.26d19b9ff8d82p-57, 0x1.8f8b83c69a60bp-3}, {-0x1.42deef11da2c4p-57, 0x1.f19f97b215f1bp-3}, + {-0x1.5d28da2c4612dp-56, 0x1.294062ed59f06p-2}, {-0x1.efdc0d58cf62p-62, 0x1.58f9a75ab1fddp-2}, + {-0x1.72cedd3d5a61p-57, 0x1.87de2a6aea963p-2}, {0x1.5b362cb974183p-57, 0x1.b5d1009e15ccp-2}, + {0x1.e0d891d3c6841p-58, 0x1.e2b5d3806f63bp-2}, {-0x1.a5a014347406cp-55, 0x1.073879922ffeep-1}, + {0x1.b25dd267f66p-55, 0x1.1c73b39ae68c8p-1}, {-0x1.efcc626f74a6fp-57, 0x1.30ff7fce17035p-1}, + {0x1.8076a2cfdc6b3p-57, 0x1.44cf325091dd6p-1}, {-0x1.75720992bfbb2p-55, 0x1.57d69348cecap-1}, + {-0x1.bdd3413b26456p-55, 0x1.6a09e667f3bcdp-1}, {-0x1.0f537acdf0ad7p-56, 0x1.7b5df226aafafp-1}, + {-0x1.2c5e12ed1336dp-55, 0x1.8bc806b151741p-1}, {-0x1.30ee286712474p-55, 0x1.9b3e047f38741p-1}, + {0x1.9f630e8b6dac8p-60, 0x1.a9b66290ea1a3p-1}, {-0x1.bc69f324e6d61p-55, 0x1.b728345196e3ep-1}, + {-0x1.6e0b1757c8d07p-56, 0x1.c38b2f180bdb1p-1}, {-0x1.e7b6bb5ab58aep-58, 0x1.ced7af43cc773p-1}, + {0x1.457e610231ac2p-56, 0x1.d906bcf328d46p-1}, {-0x1.014c76c126527p-55, 0x1.e212104f686e5p-1}, + {0x1.760b1e2e3f81ep-55, 0x1.e9f4156c62ddap-1}, {0x1.52c7adc6b4989p-56, 0x1.f0a7efb9230d7p-1}, + {0x1.562172a361fd3p-56, 0x1.f6297cff75cbp-1}, {-0x1.7a0a8ca13571fp-55, 0x1.fa7557f08a517p-1}, + {-0x1.87df6378811c7p-55, 0x1.fd88da3d12526p-1}, {-0x1.c57bc2e24aa15p-57, 0x1.ff621e3796d7ep-1}, + {0x0p+0, 0x1p+0} + }; + + double Ch = s[32-jf][1], Cl = s[32-jf][0], Sh = s[jf][1], Sl = s[jf][0]; + + double ax = __builtin_fabs(x); + double dsh = ax - Sh, dsl = -Sl; + double dch = ch - Ch, dcl = cl - Cl; + + double Sc = __builtin_fma(Sh, dch, 0x1.8p-4) - 0x1.8p-4; + double dSc = __builtin_fma(Sh, dch, -Sc); + + double Cs = __builtin_fma(Ch, dsh, 0x1.8p-4) - 0x1.8p-4; + double dCs = __builtin_fma(Ch, dsh, -Cs); + + double v = Cs - Sc; + double dv = (Ch*dsl + Cl*dsh) - (Sh*dcl + Sl*dch) - (dSc - dCs); + v = fasttwosum(v,dv,&dv); + double sgn = __builtin_copysign(1.0, x), jt = 32 - jf*sgn; + static const double c[][2] = { + {0x1p+0, -0x1.fc2c76456515bp-108}, {0x1.5555555555555p-3, 0x1.5555555623513p-57}, + {0x1.3333333333333p-4, 0x1.9997e3427441bp-59}, {0x1.6db6db6db6db7p-5, -0x1.cb95ff08658e6p-62}, + {0x1.f1c71c71c6d5bp-6, 0x1.b125bccdcc89ep-60}}; + static const double ct[] = {0x1.6e8ba2ec8cb69p-6, 0x1.1c4ea7a15c997p-6, 0x1.ca8355d39bb67p-7}; + double dv2, v2 = muldd(v,dv, v,dv, &dv2); + v *= -sgn; + dv *= -sgn; + double fl = v2*(ct[0] + v2*(ct[1] + v2*ct[2])), fh = polydd(v2,dv2, 5,c, &fl); + fh = muldd(v,dv, fh,fl, &fl); - /*---------------------------- |x|>=1 -----------------------*/ - else - if (k==0x3ff00000 && u.i[0]==0) return (x>0)?0:pi_hi+pi_lo; - else - if (k>0x7ff00000 || (k == 0x7ff00000 && u.i[0] != 0)) return x + x; - else { - u.i[1]=0x7ff00000; - v.i[1]=0x7ff00000; - u.i[0]=0; - v.i[0]=0; - return u.x/v.x; + double ph = jt * 0x1.921fb54442dp-5, pl = 0x1.8469898cc518p-53*jt, ps = -0x1.fc8f8cbb5bf6cp-102*jt; + pl = sum(fh,fl, pl,ps, &ps); + ph = fasttwosum(ph,pl, &pl); + pl = fasttwosum(pl,ps, &ps); + ph = fasttwosum(ph,pl, &pl); + pl = fasttwosum(pl,ps, &ps); + b64u64_u t = {.f = pl}; + i64 e = ((t.u>>52)&0x7ff) - 1023; + e = 52-(107+e); + e = e<0?0:e; + e = e>52?52:e; + u64 m = (1ul<<52)-(1ul<>63) + t.u--; + else + t.u++; + pl = t.f; } + return ph + pl; } diff --git a/src/binary64/acos/acos.wc b/src/binary64/acos/acos.wc index 16eeb412..7b3f604e 100644 --- a/src/binary64/acos/acos.wc +++ b/src/binary64/acos/acos.wc @@ -1,3 +1,4 @@ +0x1.ffffffffffdcp-1 0x1.dffff776c7505p-1 0x1p+0 # worst cases from the GLIBC test suite diff --git a/src/binary64/atan/check_special.c b/src/binary64/atan/check_special.c index ae3b3eb0..32a6764c 100644 --- a/src/binary64/atan/check_special.c +++ b/src/binary64/atan/check_special.c @@ -62,7 +62,6 @@ static double get_random () { b64u64_u v; - long l; v.u = rand (); v.u |= (uint64_t) rand () << 31; v.u |= (uint64_t) rand () << 62; diff --git a/src/binary64/cbrt/cbrt.c b/src/binary64/cbrt/cbrt.c index 6af6cb61..dab85c8e 100644 --- a/src/binary64/cbrt/cbrt.c +++ b/src/binary64/cbrt/cbrt.c @@ -88,7 +88,9 @@ cr_cbrt (double x) unsigned e = (hx>>52)&0x7ff; if(__builtin_expect(((e+1)&0x7ff)<2, 0)){ uint64_t ix = hx&((~0ul)>>1); - if(e==0x7ff||ix==0) return x + x; /* 0, inf, nan */ + if(e==0x7ff||ix==0) return x + x; /* 0, inf, nan: we return x + x instead of simply x, + to that for x a signaling NaN, it correctly triggers + the invalid exception. */ int nz = __builtin_clzl(ix) - 11; /* subnormal */ mant <<= nz; mant &= (~(0ul))>>12; diff --git a/src/binary64/cos/check_special.c b/src/binary64/cos/check_special.c index 7a669e61..4443ec4f 100644 --- a/src/binary64/cos/check_special.c +++ b/src/binary64/cos/check_special.c @@ -61,7 +61,6 @@ static double get_random () { b64u64_u v; - long l; v.u = rand (); v.u |= (uint64_t) rand () << 31; v.u |= (uint64_t) rand () << 62; diff --git a/src/binary64/cosh/check_special.c b/src/binary64/cosh/check_special.c index 1ae39b3b..bdf2e859 100644 --- a/src/binary64/cosh/check_special.c +++ b/src/binary64/cosh/check_special.c @@ -62,7 +62,6 @@ static double get_random () { b64u64_u v; - long l; v.u = rand (); v.u |= (uint64_t) rand () << 31; v.u |= (uint64_t) rand () << 62; diff --git a/src/binary64/erf/check_special.c b/src/binary64/erf/check_special.c index 9bf40d22..aa7591c2 100644 --- a/src/binary64/erf/check_special.c +++ b/src/binary64/erf/check_special.c @@ -61,7 +61,6 @@ static double get_random () { b64u64_u v; - long l; v.u = rand (); v.u |= (uint64_t) rand () << 31; v.u |= (uint64_t) rand () << 62; diff --git a/src/binary64/erfc/check_special.c b/src/binary64/erfc/check_special.c index b9e15957..7b32b0bc 100644 --- a/src/binary64/erfc/check_special.c +++ b/src/binary64/erfc/check_special.c @@ -74,7 +74,6 @@ static double get_random () { b64u64_u v; - long l; v.u = rand (); v.u |= (uint64_t) rand () << 31; v.u |= (uint64_t) rand () << 62; diff --git a/src/binary64/exp/check_special.c b/src/binary64/exp/check_special.c index 21d21796..96f3c0bd 100644 --- a/src/binary64/exp/check_special.c +++ b/src/binary64/exp/check_special.c @@ -93,7 +93,6 @@ static double get_random () { b64u64_u v; - long l; v.u = rand (); v.u |= (uint64_t) rand () << 31; v.u |= (uint64_t) rand () << 62; diff --git a/src/binary64/exp10/check_special.c b/src/binary64/exp10/check_special.c index a9450622..67699c32 100644 --- a/src/binary64/exp10/check_special.c +++ b/src/binary64/exp10/check_special.c @@ -81,7 +81,6 @@ static double get_random () { b64u64_u v; - long l; v.u = rand (); v.u |= (uint64_t) rand () << 31; v.u |= (uint64_t) rand () << 62; diff --git a/src/binary64/exp10m1/check_special.c b/src/binary64/exp10m1/check_special.c index b175af90..b39fc469 100644 --- a/src/binary64/exp10m1/check_special.c +++ b/src/binary64/exp10m1/check_special.c @@ -62,7 +62,6 @@ static double get_random () { b64u64_u v; - long l; v.u = rand (); v.u |= (uint64_t) rand () << 31; v.u |= (uint64_t) rand () << 62; diff --git a/src/binary64/exp2/check_special.c b/src/binary64/exp2/check_special.c index 427abf79..72e7a2a4 100644 --- a/src/binary64/exp2/check_special.c +++ b/src/binary64/exp2/check_special.c @@ -93,7 +93,6 @@ static double get_random () { b64u64_u v; - long l; v.u = rand (); v.u |= (uint64_t) rand () << 31; v.u |= (uint64_t) rand () << 62; diff --git a/src/binary64/exp2m1/check_special.c b/src/binary64/exp2m1/check_special.c index 96330258..b14dd41d 100644 --- a/src/binary64/exp2m1/check_special.c +++ b/src/binary64/exp2m1/check_special.c @@ -62,7 +62,6 @@ static double get_random () { b64u64_u v; - long l; v.u = rand (); v.u |= (uint64_t) rand () << 31; v.u |= (uint64_t) rand () << 62; diff --git a/src/binary64/expm1/check_special.c b/src/binary64/expm1/check_special.c index 18f67203..f6e3072a 100644 --- a/src/binary64/expm1/check_special.c +++ b/src/binary64/expm1/check_special.c @@ -61,7 +61,6 @@ static double get_random () { b64u64_u v; - long l; v.u = rand (); v.u |= (uint64_t) rand () << 31; v.u |= (uint64_t) rand () << 62; diff --git a/src/binary64/expm1/expm1.c b/src/binary64/expm1/expm1.c index 3a059065..624b2b8f 100644 --- a/src/binary64/expm1/expm1.c +++ b/src/binary64/expm1/expm1.c @@ -1,6 +1,6 @@ -/* Correctly-rounded expm1 function for binary64 value. +/* Correctly rounded e^x-1 function for binary64 values. -Copyright (c) 2022-2023 Paul Zimmermann, Tom Hubrecht and Claude-Pierre Jeannerod +Copyright (c) 2024 Alexei Sibidanov. This file is part of the CORE-MATH project (https://core-math.gitlabpages.inria.fr/). @@ -25,7 +25,9 @@ SOFTWARE. */ #include -#include +#if defined(__x86_64__) +#include +#endif // Warning: clang also defines __GNUC__ #if defined(__GNUC__) && !defined(__clang__) @@ -34,824 +36,353 @@ SOFTWARE. #pragma STDC FENV_ACCESS ON -/****************** code copied from pow.[ch] ********************************/ - -typedef union { - double f; - uint64_t u; -} f64_u; +typedef int64_t i64; +typedef uint64_t u64; +typedef union {double f; u64 u;} b64u64_u; -// Multiply exactly a and b, such that *hi + *lo = a * b. -static inline void a_mul(double *hi, double *lo, double a, double b) { - *hi = a * b; - *lo = __builtin_fma (a, b, -*hi); +static inline double fasttwosum(double x, double y, double *e){ + double s = x + y, z = s - x; + *e = y - z; + return s; } -// Multiply a double with a double double : a * (bh + bl) -static inline void s_mul (double *hi, double *lo, double a, double bh, - double bl) { - a_mul (hi, lo, a, bh); /* exact */ - *lo = __builtin_fma (a, bl, *lo); +static inline double fastsum(double xh, double xl, double yh, double yl, double *e){ + double sl, sh = fasttwosum(xh, yh, &sl); + *e = (xl + yl) + sl; + return sh; } -// Returns (ah + al) * (bh + bl) - (al * bl) -static inline void d_mul(double *hi, double *lo, double ah, double al, - double bh, double bl) { - a_mul (hi, lo, ah, bh); - *lo = __builtin_fma (ah, bl, *lo); - *lo = __builtin_fma (al, bh, *lo); +static inline double muldd(double xh, double xl, double ch, double cl, double *l){ + double ahhh = ch*xh; + *l = (ch*xl + cl*xh) + __builtin_fma(ch, xh, -ahhh); + return ahhh; } -// Add a + b, assuming |a| >= |b| -static inline void -fast_two_sum(double *hi, double *lo, double a, double b) -{ - double e; - - *hi = a + b; - e = *hi - a; /* exact */ - *lo = b - e; /* exact */ +static inline double mulddd(double xh, double xl, double c, double *l){ + double h = c*xh; + *l = c*xl + __builtin_fma(c, xh, -h); + return h; } -// Add a + (bh + bl), assuming |a| >= |bh| -static inline void fast_sum(double *hi, double *lo, double a, double bh, - double bl) { - fast_two_sum(hi, lo, a, bh); - /* |(a+bh)-(hi+lo)| <= 2^-105 |hi| and |lo| < ulp(hi) */ - *lo += bl; - /* |(a+bh+bl)-(hi+lo)| <= 2^-105 |hi| + ulp(lo), - where |lo| <= ulp(hi) + |bl|. */ +static inline double opolydd(double xh, double xl, int n, const double c[][2], double *l){ + int i = n-1; + double ch = c[i][0], cl = c[i][1]; + while(--i>=0){ + ch = muldd(xh,xl, ch,cl, &cl); + ch = fastsum(c[i][0],c[i][1], ch,cl, &cl); + } + *l = cl; + return ch; } -/* For 0 <= i < 64, T1[i] = (h,l) such that h+l is the best double-double - approximation of 2^(i/64). The approximation error is bounded as follows: - |h + l - 2^(i/64)| < 2^-107. */ -static const double T1[][2] = { - { 0x1p+0, 0x0p+0}, - {0x1.02c9a3e778061p+0, -0x1.19083535b085dp-56}, - {0x1.059b0d3158574p+0, 0x1.d73e2a475b465p-55}, - {0x1.0874518759bc8p+0, 0x1.186be4bb284ffp-57}, - {0x1.0b5586cf9890fp+0, 0x1.8a62e4adc610bp-54}, - {0x1.0e3ec32d3d1a2p+0, 0x1.03a1727c57b53p-59}, - {0x1.11301d0125b51p+0, -0x1.6c51039449b3ap-54}, - { 0x1.1429aaea92dep+0, -0x1.32fbf9af1369ep-54}, - {0x1.172b83c7d517bp+0, -0x1.19041b9d78a76p-55}, - {0x1.1a35beb6fcb75p+0, 0x1.e5b4c7b4968e4p-55}, - {0x1.1d4873168b9aap+0, 0x1.e016e00a2643cp-54}, - {0x1.2063b88628cd6p+0, 0x1.dc775814a8495p-55}, - {0x1.2387a6e756238p+0, 0x1.9b07eb6c70573p-54}, - {0x1.26b4565e27cddp+0, 0x1.2bd339940e9d9p-55}, - {0x1.29e9df51fdee1p+0, 0x1.612e8afad1255p-55}, - {0x1.2d285a6e4030bp+0, 0x1.0024754db41d5p-54}, - {0x1.306fe0a31b715p+0, 0x1.6f46ad23182e4p-55}, - {0x1.33c08b26416ffp+0, 0x1.32721843659a6p-54}, - {0x1.371a7373aa9cbp+0, -0x1.63aeabf42eae2p-54}, - {0x1.3a7db34e59ff7p+0, -0x1.5e436d661f5e3p-56}, - {0x1.3dea64c123422p+0, 0x1.ada0911f09ebcp-55}, - {0x1.4160a21f72e2ap+0, -0x1.ef3691c309278p-58}, - {0x1.44e086061892dp+0, 0x1.89b7a04ef80dp-59}, - { 0x1.486a2b5c13cdp+0, 0x1.3c1a3b69062fp-56}, - {0x1.4bfdad5362a27p+0, 0x1.d4397afec42e2p-56}, - {0x1.4f9b2769d2ca7p+0, -0x1.4b309d25957e3p-54}, - {0x1.5342b569d4f82p+0, -0x1.07abe1db13cadp-55}, - {0x1.56f4736b527dap+0, 0x1.9bb2c011d93adp-54}, - {0x1.5ab07dd485429p+0, 0x1.6324c054647adp-54}, - {0x1.5e76f15ad2148p+0, 0x1.ba6f93080e65ep-54}, - {0x1.6247eb03a5585p+0, -0x1.383c17e40b497p-54}, - {0x1.6623882552225p+0, -0x1.bb60987591c34p-54}, - {0x1.6a09e667f3bcdp+0, -0x1.bdd3413b26456p-54}, - {0x1.6dfb23c651a2fp+0, -0x1.bbe3a683c88abp-57}, - {0x1.71f75e8ec5f74p+0, -0x1.16e4786887a99p-55}, - {0x1.75feb564267c9p+0, -0x1.0245957316dd3p-54}, - {0x1.7a11473eb0187p+0, -0x1.41577ee04992fp-55}, - {0x1.7e2f336cf4e62p+0, 0x1.05d02ba15797ep-56}, - {0x1.82589994cce13p+0, -0x1.d4c1dd41532d8p-54}, - {0x1.868d99b4492edp+0, -0x1.fc6f89bd4f6bap-54}, - {0x1.8ace5422aa0dbp+0, 0x1.6e9f156864b27p-54}, - {0x1.8f1ae99157736p+0, 0x1.5cc13a2e3976cp-55}, - {0x1.93737b0cdc5e5p+0, -0x1.75fc781b57ebcp-57}, - { 0x1.97d829fde4e5p+0, -0x1.d185b7c1b85d1p-54}, - { 0x1.9c49182a3f09p+0, 0x1.c7c46b071f2bep-56}, - {0x1.a0c667b5de565p+0, -0x1.359495d1cd533p-54}, - {0x1.a5503b23e255dp+0, -0x1.d2f6edb8d41e1p-54}, - {0x1.a9e6b5579fdbfp+0, 0x1.0fac90ef7fd31p-54}, - {0x1.ae89f995ad3adp+0, 0x1.7a1cd345dcc81p-54}, - {0x1.b33a2b84f15fbp+0, -0x1.2805e3084d708p-57}, - {0x1.b7f76f2fb5e47p+0, -0x1.5584f7e54ac3bp-56}, - {0x1.bcc1e904bc1d2p+0, 0x1.23dd07a2d9e84p-55}, - {0x1.c199bdd85529cp+0, 0x1.11065895048ddp-55}, - {0x1.c67f12e57d14bp+0, 0x1.2884dff483cadp-54}, - {0x1.cb720dcef9069p+0, 0x1.503cbd1e949dbp-56}, - {0x1.d072d4a07897cp+0, -0x1.cbc3743797a9cp-54}, - {0x1.d5818dcfba487p+0, 0x1.2ed02d75b3707p-55}, - {0x1.da9e603db3285p+0, 0x1.c2300696db532p-54}, - {0x1.dfc97337b9b5fp+0, -0x1.1a5cd4f184b5cp-54}, - {0x1.e502ee78b3ff6p+0, 0x1.39e8980a9cc8fp-55}, - {0x1.ea4afa2a490dap+0, -0x1.e9c23179c2893p-54}, - {0x1.efa1bee615a27p+0, 0x1.dc7f486a4b6bp-54}, - { 0x1.f50765b6e454p+0, 0x1.9d3e12dd8a18bp-54}, - {0x1.fa7c1819e90d8p+0, 0x1.74853f3a5931ep-55}, -}; - -/* For 0 <= i < 64, T2[i] = (h,l) such that h+l is the best double-double - approximation of 2^(i/2^12). The approximation error is bounded as follows: - |h + l - 2^(i/2^12)| < 2^-107. */ -static const double T2[][2] = { - { 0x1p+0, 0x0p+0}, - {0x1.000b175effdc7p+0, 0x1.ae8e38c59c72ap-54}, - {0x1.00162f3904052p+0, -0x1.7b5d0d58ea8f4p-58}, - {0x1.0021478e11ce6p+0, 0x1.4115cb6b16a8ep-54}, - {0x1.002c605e2e8cfp+0, -0x1.d7c96f201bb2fp-55}, - {0x1.003779a95f959p+0, 0x1.84711d4c35e9fp-54}, - {0x1.0042936faa3d8p+0, -0x1.0484245243777p-55}, - { 0x1.004dadb113dap+0, -0x1.4b237da2025f9p-54}, - {0x1.0058c86da1c0ap+0, -0x1.5e00e62d6b30dp-56}, - {0x1.0063e3a559473p+0, 0x1.a1d6cedbb9481p-54}, - {0x1.006eff583fc3dp+0, -0x1.4acf197a00142p-54}, - {0x1.007a1b865a8cap+0, -0x1.eaf2ea42391a5p-57}, - {0x1.0085382faef83p+0, 0x1.da93f90835f75p-56}, - {0x1.00905554425d4p+0, -0x1.6a79084ab093cp-55}, - {0x1.009b72f41a12bp+0, 0x1.86364f8fbe8f8p-54}, - {0x1.00a6910f3b6fdp+0, -0x1.82e8e14e3110ep-55}, - {0x1.00b1afa5abcbfp+0, -0x1.4f6b2a7609f71p-55}, - {0x1.00bcceb7707ecp+0, -0x1.e1a258ea8f71bp-56}, - {0x1.00c7ee448ee02p+0, 0x1.4362ca5bc26f1p-56}, - {0x1.00d30e4d0c483p+0, 0x1.095a56c919d02p-54}, - {0x1.00de2ed0ee0f5p+0, -0x1.406ac4e81a645p-57}, - { 0x1.00e94fd0398ep+0, 0x1.b5a6902767e09p-54}, - {0x1.00f4714af41d3p+0, -0x1.91b2060859321p-54}, - {0x1.00ff93412315cp+0, 0x1.427068ab22306p-55}, - {0x1.010ab5b2cbd11p+0, 0x1.c1d0660524e08p-54}, - {0x1.0115d89ff3a8bp+0, -0x1.e7bdfb3204be8p-54}, - {0x1.0120fc089ff63p+0, 0x1.843aa8b9cbbc6p-55}, - {0x1.012c1fecd613bp+0, -0x1.34104ee7edae9p-56}, - {0x1.0137444c9b5b5p+0, -0x1.2b6aeb6176892p-56}, - {0x1.01426927f5278p+0, 0x1.a8cd33b8a1bb3p-56}, - {0x1.014d8e7ee8d2fp+0, 0x1.2edc08e5da99ap-56}, - {0x1.0158b4517bb88p+0, 0x1.57ba2dc7e0c73p-55}, - {0x1.0163da9fb3335p+0, 0x1.b61299ab8cdb7p-54}, - {0x1.016f0169949edp+0, -0x1.90565902c5f44p-54}, - {0x1.017a28af25567p+0, 0x1.70fc41c5c2d53p-55}, - {0x1.018550706ab62p+0, 0x1.4b9a6e145d76cp-54}, - {0x1.019078ad6a19fp+0, -0x1.008eff5142bf9p-56}, - {0x1.019ba16628de2p+0, -0x1.77669f033c7dep-54}, - {0x1.01a6ca9aac5f3p+0, -0x1.09bb78eeead0ap-54}, - {0x1.01b1f44af9f9ep+0, 0x1.371231477ece5p-54}, - {0x1.01bd1e77170b4p+0, 0x1.5e7626621eb5bp-56}, - {0x1.01c8491f08f08p+0, -0x1.bc72b100828a5p-54}, - { 0x1.01d37442d507p+0, -0x1.ce39cbbab8bbep-57}, - {0x1.01de9fe280ac8p+0, 0x1.16996709da2e2p-55}, - {0x1.01e9cbfe113efp+0, -0x1.c11f5239bf535p-55}, - {0x1.01f4f8958c1c6p+0, 0x1.e1d4eb5edc6b3p-55}, - {0x1.020025a8f6a35p+0, -0x1.afb99946ee3fp-54}, - {0x1.020b533856324p+0, -0x1.8f06d8a148a32p-54}, - {0x1.02168143b0281p+0, -0x1.2bf310fc54eb6p-55}, - {0x1.0221afcb09e3ep+0, -0x1.c95a035eb4175p-54}, - {0x1.022cdece68c4fp+0, -0x1.491793e46834dp-54}, - {0x1.02380e4dd22adp+0, -0x1.3e8d0d9c49091p-56}, - {0x1.02433e494b755p+0, -0x1.314aa16278aa3p-54}, - {0x1.024e6ec0da046p+0, 0x1.48daf888e9651p-55}, - {0x1.02599fb483385p+0, 0x1.56dc8046821f4p-55}, - {0x1.0264d1244c719p+0, 0x1.45b42356b9d47p-54}, - {0x1.027003103b10ep+0, -0x1.082ef51b61d7ep-56}, - {0x1.027b357854772p+0, 0x1.2106ed0920a34p-56}, - {0x1.0286685c9e059p+0, -0x1.fd4cf26ea5d0fp-54}, - {0x1.02919bbd1d1d8p+0, -0x1.09f8775e78084p-54}, - {0x1.029ccf99d720ap+0, 0x1.64cbba902ca27p-58}, - {0x1.02a803f2d170dp+0, 0x1.4383ef231d207p-54}, - {0x1.02b338c811703p+0, 0x1.4a47a505b3a47p-54}, - {0x1.02be6e199c811p+0, 0x1.e47120223467fp-54}, -}; - -/* The following is a degree-4 polynomial generated by Sollya for exp(x) - over [-0.000130273,0.000130273] with absolute error < 2^-74.346. */ -static const double Q_1[] = {0x1p0, /* degree 0 */ - 0x1p0, /* degree 1 */ - 0x1p-1, /* degree 2 */ - 0x1.5555555995d37p-3, /* degree 3 */ - 0x1.55555558489dcp-5 /* degree 4 */ -}; - -// Approximation for the fast path of exp(z) for z=zh+zl, -// with |z| < 0.000130273 < 2^-12.88 and |zl| < 2^-42.6 -// (assuming x^y does not overflow or underflow) -static inline void q_1 (double *hi, double *lo, double zh, double zl) { - double z = zh + zl; - double q = __builtin_fma (Q_1[4], zh, Q_1[3]); - - q = __builtin_fma (q, z, Q_1[2]); - - fast_two_sum (hi, lo, Q_1[1], q * z); - - d_mul (hi, lo, zh, zl, *hi, *lo); - - fast_sum (hi, lo, Q_1[0], *hi, *lo); +static inline double opolyddd(double x, int n, const double c[][2], double *l){ + int i = n-1; + double ch = fasttwosum(c[i][0], *l, l), cl = c[i][1] + *l; + while(--i>=0){ + ch = mulddd(ch,cl, x, &cl); + ch = fastsum(c[i][0],c[i][1], ch,cl, &cl); + } + *l = cl; + return ch; } -/* __builtin_roundeven was introduced in gcc 10: - https://gcc.gnu.org/gcc-10/changes.html, - and in clang 17 */ -#if (defined(__GNUC__) && __GNUC__ >= 10) || (defined(__clang__) && __clang_major__ >= 17) -#define HAS_BUILTIN_ROUNDEVEN +static inline double as_ldexp(double x, i64 i){ +#ifdef __x86_64__ + __m128i sb; sb[0] = i<<52; +#if defined(__clang__) + __m128d r = _mm_set_sd(x); +#else + __m128d r; asm("":"=x"(r):"0"(x)); #endif - -#if !defined(HAS_BUILTIN_ROUNDEVEN) && (defined(__GNUC__) || defined(__clang__)) && (defined(__AVX__) || defined(__SSE4_1__)) -inline double __builtin_roundeven(double x){ - double ix; -#if defined __AVX__ - __asm__("vroundsd $0x8,%1,%1,%0":"=x"(ix):"x"(x)); -#else /* __SSE4_1__ */ - __asm__("roundsd $0x8,%1,%0":"=x"(ix):"x"(x)); -#endif - return ix; -} -#define HAS_BUILTIN_ROUNDEVEN + r = (__m128d)_mm_add_epi64(sb, (__m128i)r); + return r[0]; +#else + b64u64_u ix = {.f = x}; + ix.u += i<<52; + return ix.f; #endif - -#ifndef HAS_BUILTIN_ROUNDEVEN -#include -/* round x to nearest integer, breaking ties to even */ -static double -__builtin_roundeven (double x) -{ - double y = round (x); /* nearest, away from 0 */ - if (fabs (y - x) == 0.5) - { - /* if y is odd, we should return y-1 if x>0, and y+1 if x<0 */ - union { double f; uint64_t n; } u, v; - u.f = y; - v.f = (x > 0) ? y - 1.0 : y + 1.0; - if (__builtin_ctz (v.n) > __builtin_ctz (u.n)) - y = v.f; - } - return y; } -#endif - -/* - Approximation of exp(x) for -0x1.2b708872320e2p+5 < x < 0x1.62e42fefa39fp+9 - (the code in pow.c has x = xh + xl as input, we simplified it since here - we have xl=0, we kept the corresponding line in comment for reference). - - exp(x) is approximated by hi + lo. - - For the error analysis, we only consider the case where x^y does not - overflow or underflow. We get: - - (hi + lo) / exp(x) = 1 + eps with |eps| < 2^-74.139 - - At output, we also have 0.99985 < hi+lo < 1.99995 and |lo/hi| < 2^-41.4. -*/ - -// static inline void exp_1 (double *hi, double *lo, double xh double xl) { -static inline void exp_1 (double *hi, double *lo, double x) { - -#define INVLOG2 0x1.71547652b82fep+12 /* |INVLOG2-2^12/log(2)| < 2^-43.4 */ - // double k = __builtin_roundeven (xh * INVLOG2); - double k = __builtin_roundeven (x * INVLOG2); // k <= 4194304 - double kh, kl; -#define LOG2H 0x1.62e42fefa39efp-13 -#define LOG2L 0x1.abc9e3b39803fp-68 - s_mul (&kh, &kl, k, LOG2H, LOG2L); - - double yh, yl; - // fast_two_sum (&yh, &yl, xh - kh, xl); - yh = x - kh; - // yl -= kl; - yl = -kl; - - int64_t K = k; /* Note: k is an integer, this is just a conversion. */ - int64_t M = (K >> 12) + 0x3ff; - int64_t i2 = (K >> 6) & 0x3f; - int64_t i1 = K & 0x3f; - - double t1h = T1[i2][0], t1l = T1[i2][1], t2h = T2[i1][0], t2l = T2[i1][1]; - d_mul (hi, lo, t2h, t2l, t1h, t1l); - - double qh, ql; - q_1 (&qh, &ql, yh, yl); - - d_mul (hi, lo, *hi, *lo, qh, ql); - f64_u _d; - - /* special case for M = 2047 since _d.f would be 2^1024 which is not - representable */ - if (__builtin_expect (M == 2047, 0)) - { - M --; - *hi = 2 * *hi; - *lo = 2 * *lo; +static const double db[] = + {0x1.e923c188ea79bp-4, 0x1.1a0408712e00ap-2, 0x1.1c38132777b26p-2, 0x1.27f4980d511ffp-2, + 0x1.8172a0e02f90ep-2, 0x1.8bbe2fb45c151p-2, 0x1.bcab27d05abdep-2, 0x1.005ae04256babp-1, + 0x1.accfbe46b4efp-1, 0x1.d086543694c5ap-1, 0x1.273c188aa7b14p+2, 0x1.83d4bcdebb3f4p+2, + 0x1.08f51434652c3p+4, 0x1.1d5c2daebe367p+4, 0x1.c44ce0d716a1ap+4, 0x1.2ee70220fb1c5p+5, + 0x1.89d56a0c38e6fp+5, 0x1.7a60ee15e3e9dp+6, 0x1.1f0da93354198p+7, 0x1.54cd1fea7663ap+7, + 0x1.556c678d5e976p+7, 0x1.2da9e5e6af0bp+8, 0x1.9e7b643238a14p+8, 0x1.d6479eba7c971p+8, + 0x1.0bc04af1b09f5p+9, -0x1.ab86cb1743b75p-4, -0x1.119aae6072d39p-2, -0x1.175693a03b59p-2, + -0x1.474d4de7c14bbp-2, -0x1.789d025948efap-2, -0x1.82b5dfaf59b4cp-2, -0x1.9d871e078ebcep-2, + -0x1.1397add4538acp-1, -0x1.22e24fa3d5cf9p-1, -0x1.dc2b5df1f7d3dp-1, -0x1.0a54d87783d6fp+0, + -0x1.2a9cad9998262p+0, -0x1.e42a2abb1bf0fp+0, }; + +static double __attribute__((noinline)) as_expm1_database(double x, double f){ + b64u64_u ix = {.f = x}; + int a = 0, b = sizeof(db)/sizeof(db[0]) - 1, m = (a + b)/2; + const b64u64_u *c = (const b64u64_u*)db; + while (a <= b) { + if (c[m].u < ix.u){ + a = m + 1; + } else if (__builtin_expect(c[m].u == ix.u, 0)) { + static const u64 s2[2] = {0x76f58b0d65bd5553ul, 0xc06ul}; + const u64 s = 0x300e81651cul; + b64u64_u jf = {.f = f}, dr = {.u = ((s>>m)<<63)| (((jf.u>>52)&0x7ff) - 54)<<52}; + u64 t = (s2[m>>5]>>((m<<1)&63))&3; + for(i64 k = -1; k<=1; k++){ + b64u64_u r = {.u = jf.u + k}; + if((r.u&3) == t) return r.f + dr.f; + } + break; + } else { + b = m - 1; + } + m = (a + b)>>1; } - _d.u = M << 52; - *hi *= _d.f; - *lo *= _d.f; + return f; } -/****************** end of code copied from pow.[ch] *************************/ - -/* The following is a degree-7 polynomial generated by Sollya for exp(z) - over [-0.000130273,0.000130273] with absolute error < 2^-113.218 - (see file exp_accurate.sollya). Since we use this code only for - |x| > 0.125 in expm1(x), the corresponding relative error for expm1 - is about 2^-113.218/|expm1(-0.125)| which is about 2^-110. */ -static const double Q_2[] = { - 0x1p0, // degree 0, Q_2[0] - 0x1p0, // degree 1, Q_2[1] - 0x1p-1, // degree 2, Q_2[2] - 0x1.5555555555555p-3, 0x1.55555555c4d26p-57, // degree 3, Q_2[3], Q_2[4] - 0x1.5555555555555p-5, // degree 4, Q_2[5] - 0x1.1111111111111p-7, // degree 5, Q_2[6] - 0x1.6c16c3fbb4213p-10, // degree 6, Q_2[7] - 0x1.a01a023ede0d7p-13, // degree 7, Q_2[8] +static const double t0[][2] = { + {0x0p+0, 0x1p+0}, {-0x1.19083535b085ep-56, 0x1.02c9a3e778061p+0}, + {0x1.d73e2a475b466p-55, 0x1.059b0d3158574p+0}, {0x1.186be4bb285p-57, 0x1.0874518759bc8p+0}, + {0x1.8a62e4adc610ap-54, 0x1.0b5586cf9890fp+0}, {0x1.03a1727c57b52p-59, 0x1.0e3ec32d3d1a2p+0}, + {-0x1.6c51039449b3ap-54, 0x1.11301d0125b51p+0}, {-0x1.32fbf9af1369ep-54, 0x1.1429aaea92dep+0}, + {-0x1.19041b9d78a76p-55, 0x1.172b83c7d517bp+0}, {0x1.e5b4c7b4968e4p-55, 0x1.1a35beb6fcb75p+0}, + {0x1.e016e00a2643cp-54, 0x1.1d4873168b9aap+0}, {0x1.dc775814a8494p-55, 0x1.2063b88628cd6p+0}, + {0x1.9b07eb6c70572p-54, 0x1.2387a6e756238p+0}, {0x1.2bd339940e9dap-55, 0x1.26b4565e27cddp+0}, + {0x1.612e8afad1256p-55, 0x1.29e9df51fdee1p+0}, {0x1.0024754db41d4p-54, 0x1.2d285a6e4030bp+0}, + {0x1.6f46ad23182e4p-55, 0x1.306fe0a31b715p+0}, {0x1.32721843659a6p-54, 0x1.33c08b26416ffp+0}, + {-0x1.63aeabf42eae2p-54, 0x1.371a7373aa9cbp+0}, {-0x1.5e436d661f5e2p-56, 0x1.3a7db34e59ff7p+0}, + {0x1.ada0911f09ebcp-55, 0x1.3dea64c123422p+0}, {-0x1.ef3691c309278p-58, 0x1.4160a21f72e2ap+0}, + {0x1.89b7a04ef80dp-59, 0x1.44e086061892dp+0}, {0x1.3c1a3b69062fp-56, 0x1.486a2b5c13cdp+0}, + {0x1.d4397afec42e2p-56, 0x1.4bfdad5362a27p+0}, {-0x1.4b309d25957e4p-54, 0x1.4f9b2769d2ca7p+0}, + {-0x1.07abe1db13cacp-55, 0x1.5342b569d4f82p+0}, {0x1.9bb2c011d93acp-54, 0x1.56f4736b527dap+0}, + {0x1.6324c054647acp-54, 0x1.5ab07dd485429p+0}, {0x1.ba6f93080e65ep-54, 0x1.5e76f15ad2148p+0}, + {-0x1.383c17e40b496p-54, 0x1.6247eb03a5585p+0}, {-0x1.bb60987591c34p-54, 0x1.6623882552225p+0}, + {-0x1.bdd3413b26456p-54, 0x1.6a09e667f3bcdp+0}, {-0x1.bbe3a683c88aap-57, 0x1.6dfb23c651a2fp+0}, + {-0x1.16e4786887a9ap-55, 0x1.71f75e8ec5f74p+0}, {-0x1.0245957316dd4p-54, 0x1.75feb564267c9p+0}, + {-0x1.41577ee04993p-55, 0x1.7a11473eb0187p+0}, {0x1.05d02ba15797ep-56, 0x1.7e2f336cf4e62p+0}, + {-0x1.d4c1dd41532d8p-54, 0x1.82589994cce13p+0}, {-0x1.fc6f89bd4f6bap-54, 0x1.868d99b4492edp+0}, + {0x1.6e9f156864b26p-54, 0x1.8ace5422aa0dbp+0}, {0x1.5cc13a2e3976cp-55, 0x1.8f1ae99157736p+0}, + {-0x1.75fc781b57ebcp-57, 0x1.93737b0cdc5e5p+0}, {-0x1.d185b7c1b85dp-54, 0x1.97d829fde4e5p+0}, + {0x1.c7c46b071f2bep-56, 0x1.9c49182a3f09p+0}, {-0x1.359495d1cd532p-54, 0x1.a0c667b5de565p+0}, + {-0x1.d2f6edb8d41e2p-54, 0x1.a5503b23e255dp+0}, {0x1.0fac90ef7fd32p-54, 0x1.a9e6b5579fdbfp+0}, + {0x1.7a1cd345dcc82p-54, 0x1.ae89f995ad3adp+0}, {-0x1.2805e3084d708p-57, 0x1.b33a2b84f15fbp+0}, + {-0x1.5584f7e54ac3ap-56, 0x1.b7f76f2fb5e47p+0}, {0x1.23dd07a2d9e84p-55, 0x1.bcc1e904bc1d2p+0}, + {0x1.11065895048dep-55, 0x1.c199bdd85529cp+0}, {0x1.2884dff483cacp-54, 0x1.c67f12e57d14bp+0}, + {0x1.503cbd1e949dcp-56, 0x1.cb720dcef9069p+0}, {-0x1.cbc3743797a9cp-54, 0x1.d072d4a07897cp+0}, + {0x1.2ed02d75b3706p-55, 0x1.d5818dcfba487p+0}, {0x1.c2300696db532p-54, 0x1.da9e603db3285p+0}, + {-0x1.1a5cd4f184b5cp-54, 0x1.dfc97337b9b5fp+0}, {0x1.39e8980a9cc9p-55, 0x1.e502ee78b3ff6p+0}, + {-0x1.e9c23179c2894p-54, 0x1.ea4afa2a490dap+0}, {0x1.dc7f486a4b6bp-54, 0x1.efa1bee615a27p+0}, + {0x1.9d3e12dd8a18ap-54, 0x1.f50765b6e454p+0}, {0x1.74853f3a5931ep-55, 0x1.fa7c1819e90d8p+0} }; -// Approximation for the accurate path of exp(z) for z=zh+zl, -// with |z| < 0.000130273 < 2^-12.88 and |zl| < 2^-42.6 -// (assuming x^y does not overflow or underflow) -static inline void q_2 (double *hi, double *lo, double zh, double zl) { - /* Let q[0]..q[7] be the coefficients of degree 0..7 of Q_2. - The ulp of q[7]*z^7 is at most 2^-155, thus we can compute q[7]*z^7 - in double precision only. - The ulp of q[6]*z^6 is at most 2^-139, thus we can compute q[6]*z^6 - in double precision only. - The ulp of q[5]*z^5 is at most 2^-124, thus we can compute q[5]*z^5 - in double precision only. */ - double z = zh + zl; - double q = __builtin_fma (Q_2[8], zh, Q_2[7]); - - q = __builtin_fma (q, z, Q_2[6]); - - q = __builtin_fma (q, z, Q_2[5]); - - // multiply q by z and add Q_2[3] + Q_2[4] - a_mul (hi, lo, q, z); - double t; - fast_two_sum (hi, &t, Q_2[3], *hi); - *lo += t + Q_2[4]; - - // multiply hi+lo by zh+zl and add Q_2[2] - d_mul (hi, lo, *hi, *lo, zh, zl); - fast_two_sum (hi, &t, Q_2[2], *hi); - *lo += t; - - // multiply hi+lo by zh+zl and add Q_2[1] - d_mul (hi, lo, *hi, *lo, zh, zl); - fast_two_sum (hi, &t, Q_2[1], *hi); - *lo += t; - - // multiply hi+lo by zh+zl and add Q_2[0] - d_mul (hi, lo, *hi, *lo, zh, zl); - fast_two_sum (hi, &t, Q_2[0], *hi); - *lo += t; -} - -// same as exp_1, but with q_1 replaced by q_2 (more accurate) -static inline void exp_2 (double *hi, double *lo, double x) { - -#define INVLOG2 0x1.71547652b82fep+12 /* |INVLOG2-2^12/log(2)| < 2^-43.4 */ - double k = __builtin_roundeven (x * INVLOG2); - // since x <= 0x1.62e42fefa39fp+9 we have k <= 4194305 - - double yh, yl; - /* LOG2H and LOG2L are chosen such that k*LOGH and k*LOGL are exact, - with |LOG2Hacc+LOG2Macc+LOG2Lacc - log(2)/2^12)| < 2^-132.546 */ -#define LOG2Hacc 0x1.62e42ffp-13 -#define LOG2Macc -0x1.718432ap-47 -#define LOG2Lacc -0x1.b0e2633fe0685p-79 - yh = __builtin_fma (-k, LOG2Hacc, x); // exact - yl = -k * LOG2Macc; // exact - if (__builtin_fabs (yh) >= __builtin_fabs (yl)) - fast_two_sum (&yh, &yl, yh, yl); - else - fast_two_sum (&yh, &yl, yl, yh); - yl -= k * LOG2Lacc; - - int64_t K = k; - int64_t M = (K >> 12) + 0x3ff; - int64_t i2 = (K >> 6) & 0x3f; - int64_t i1 = K & 0x3f; - - double t1h = T1[i2][0], t1l = T1[i2][1], t2h = T2[i1][0], t2l = T2[i1][1]; - d_mul (hi, lo, t2h, t2l, t1h, t1l); - - double qh, ql; - q_2 (&qh, &ql, yh, yl); - - d_mul (hi, lo, *hi, *lo, qh, ql); - f64_u _d; - - /* special case for M = 2047 since _d.f would be 2^1024 which is not - representable */ - if (__builtin_expect (M == 2047, 0)) - { - M --; - *hi = 2 * *hi; - *lo = 2 * *lo; - } - _d.u = M << 52; - *hi *= _d.f; - *lo *= _d.f; -} - -typedef union {double f; uint64_t u;} b64u64_u; - -/* The following is a degree-11 polynomial generated by Sollya - (file expm1_fast.sollya), - which approximates expm1(x) with relative error bounded by 2^-67.183 - for |x| <= 0.125. */ -static const double P[] = { - 0x0, // degree 0 (unused) - 0x1p0, // degree 1 - 0x1p-1, // degree 2 - 0x1.5555555555555p-3, // degree 3 - 0x1.5555555555553p-5, // degree 4 - 0x1.1111111111bbcp-7, // degree 5 - 0x1.6c16c16c1f8a2p-10, // degree 6 - 0x1.a01a0183a908bp-13, // degree 7 - 0x1.a01a00383b80dp-16, // degree 8 - 0x1.71e02a5f3b87p-19, // degree 9 - 0x1.27fcd07571d4ep-22, // degree 10 - 0x1.969ce6c7ee119p-26, // degree 11 +static const double t1[][2] = { + {0x0p+0, 0x1p+0}, {0x1.ae8e38c59c72ap-54, 0x1.000b175effdc7p+0}, + {-0x1.7b5d0d58ea8f4p-58, 0x1.00162f3904052p+0}, {0x1.4115cb6b16a8ep-54, 0x1.0021478e11ce6p+0}, + {-0x1.d7c96f201bb2ep-55, 0x1.002c605e2e8cfp+0}, {0x1.84711d4c35eap-54, 0x1.003779a95f959p+0}, + {-0x1.0484245243778p-55, 0x1.0042936faa3d8p+0}, {-0x1.4b237da2025fap-54, 0x1.004dadb113dap+0}, + {-0x1.5e00e62d6b30ep-56, 0x1.0058c86da1c0ap+0}, {0x1.a1d6cedbb948p-54, 0x1.0063e3a559473p+0}, + {-0x1.4acf197a00142p-54, 0x1.006eff583fc3dp+0}, {-0x1.eaf2ea42391a6p-57, 0x1.007a1b865a8cap+0}, + {0x1.da93f90835f76p-56, 0x1.0085382faef83p+0}, {-0x1.6a79084ab093cp-55, 0x1.00905554425d4p+0}, + {0x1.86364f8fbe8f8p-54, 0x1.009b72f41a12bp+0}, {-0x1.82e8e14e3110ep-55, 0x1.00a6910f3b6fdp+0}, + {-0x1.4f6b2a7609f72p-55, 0x1.00b1afa5abcbfp+0}, {-0x1.e1a258ea8f71ap-56, 0x1.00bcceb7707ecp+0}, + {0x1.4362ca5bc26f2p-56, 0x1.00c7ee448ee02p+0}, {0x1.095a56c919d02p-54, 0x1.00d30e4d0c483p+0}, + {-0x1.406ac4e81a646p-57, 0x1.00de2ed0ee0f5p+0}, {0x1.b5a6902767e08p-54, 0x1.00e94fd0398ep+0}, + {-0x1.91b206085932p-54, 0x1.00f4714af41d3p+0}, {0x1.427068ab22306p-55, 0x1.00ff93412315cp+0}, + {0x1.c1d0660524e08p-54, 0x1.010ab5b2cbd11p+0}, {-0x1.e7bdfb3204be8p-54, 0x1.0115d89ff3a8bp+0}, + {0x1.843aa8b9cbbc6p-55, 0x1.0120fc089ff63p+0}, {-0x1.34104ee7edae8p-56, 0x1.012c1fecd613bp+0}, + {-0x1.2b6aeb6176892p-56, 0x1.0137444c9b5b5p+0}, {0x1.a8cd33b8a1bb2p-56, 0x1.01426927f5278p+0}, + {0x1.2edc08e5da99ap-56, 0x1.014d8e7ee8d2fp+0}, {0x1.57ba2dc7e0c72p-55, 0x1.0158b4517bb88p+0}, + {0x1.b61299ab8cdb8p-54, 0x1.0163da9fb3335p+0}, {-0x1.90565902c5f44p-54, 0x1.016f0169949edp+0}, + {0x1.70fc41c5c2d54p-55, 0x1.017a28af25567p+0}, {0x1.4b9a6e145d76cp-54, 0x1.018550706ab62p+0}, + {-0x1.008eff5142bfap-56, 0x1.019078ad6a19fp+0}, {-0x1.77669f033c7dep-54, 0x1.019ba16628de2p+0}, + {-0x1.09bb78eeead0ap-54, 0x1.01a6ca9aac5f3p+0}, {0x1.371231477ece6p-54, 0x1.01b1f44af9f9ep+0}, + {0x1.5e7626621eb5ap-56, 0x1.01bd1e77170b4p+0}, {-0x1.bc72b100828a4p-54, 0x1.01c8491f08f08p+0}, + {-0x1.ce39cbbab8bbep-57, 0x1.01d37442d507p+0}, {0x1.16996709da2e2p-55, 0x1.01de9fe280ac8p+0}, + {-0x1.c11f5239bf536p-55, 0x1.01e9cbfe113efp+0}, {0x1.e1d4eb5edc6b4p-55, 0x1.01f4f8958c1c6p+0}, + {-0x1.afb99946ee3fp-54, 0x1.020025a8f6a35p+0}, {-0x1.8f06d8a148a32p-54, 0x1.020b533856324p+0}, + {-0x1.2bf310fc54eb6p-55, 0x1.02168143b0281p+0}, {-0x1.c95a035eb4176p-54, 0x1.0221afcb09e3ep+0}, + {-0x1.491793e46834cp-54, 0x1.022cdece68c4fp+0}, {-0x1.3e8d0d9c4909p-56, 0x1.02380e4dd22adp+0}, + {-0x1.314aa16278aa4p-54, 0x1.02433e494b755p+0}, {0x1.48daf888e965p-55, 0x1.024e6ec0da046p+0}, + {0x1.56dc8046821f4p-55, 0x1.02599fb483385p+0}, {0x1.45b42356b9d46p-54, 0x1.0264d1244c719p+0}, + {-0x1.082ef51b61d7ep-56, 0x1.027003103b10ep+0}, {0x1.2106ed0920a34p-56, 0x1.027b357854772p+0}, + {-0x1.fd4cf26ea5d0ep-54, 0x1.0286685c9e059p+0}, {-0x1.09f8775e78084p-54, 0x1.02919bbd1d1d8p+0}, + {0x1.64cbba902ca28p-58, 0x1.029ccf99d720ap+0}, {0x1.4383ef231d206p-54, 0x1.02a803f2d170dp+0}, + {0x1.4a47a505b3a46p-54, 0x1.02b338c811703p+0}, {0x1.e47120223468p-54, 0x1.02be6e199c811p+0}, }; - -/* |x| <= 0.125, put in h + l a double-double approximation of expm1(x), - and return the maximal corresponding absolute error. - We also have |x| > 0x1.6a09e667f3bccp-53. - With xmin=RR("0x1.6a09e667f3bccp-53",16), the routine - expm1_fast_tiny_all(xmin,0.125,2^-64.29) in expm1.sage returns - 4.43378275371923e-20 < 2^-64.29, and - expm1_fast_tiny_all(-0.125,-xmin,2^-64.13) returns - 4.94311016020191e-20 < 2^-64.13, which proves the relative - error is bounded by 2^-64.13. */ -static double -expm1_fast_tiny (double *h, double *l, double x) -{ - /* The maximal value of |P[4]*x^4/expm1(x)| over [-0.125,0.125] - is less than 2^-13.495, thus we can compute the coefficients of degree - 4 or higher using double precision only. */ - double x2 = x * x, x4 = x2 * x2; - double c10 = __builtin_fma (P[11], x, P[10]); - double c8 = __builtin_fma (P[9], x, P[8]); - double c6 = __builtin_fma (P[7], x, P[6]); - double c4 = __builtin_fma (P[5], x, P[4]); - c8 = __builtin_fma (c10, x2, c8); - c4 = __builtin_fma (c6, x2, c4); - c4 = __builtin_fma (c8, x4, c4); - double t; - // multiply c4 by x and add P[3] - a_mul (h, l, c4, x); - fast_two_sum (h, &t, P[3], *h); - *l += t; - // multiply (h,l) by x and add P[2] - s_mul (h, l, x, *h, *l); - fast_two_sum (h, &t, P[2], *h); - *l += t; - // multiply (h,l) by x and add P[1] - s_mul (h, l, x, *h, *l); - fast_two_sum (h, &t, P[1], *h); - *l += t; - // multiply (h,l) by x - s_mul (h, l, x, *h, *l); - return 0x1.d4p-65 * *h; // 2^-64.13 < 0x1.d4p-65 -} - -/* Given -0x1.2b708872320e2p+5 < x < -0x1.6a09e667f3bccp-53 or - 0x1.6a09e667f3bccp-53 < x < 0x1.62e42fefa39fp+9, put in h + l a - double-double approximation of expm1(x), and return the maximal - corresponding absolute error. - The input tiny is true iff |x| <= 0.125. */ -static double -expm1_fast (double *h, double *l, double x, int tiny) -{ - if (tiny) // |x| <= 0.125 - return expm1_fast_tiny (h, l, x); - - /* now -0x1.2b708872320e2p+5 < x < 0.125 or - 0.125 < x < 0x1.62e42fefa39fp+9: we approximate exp(x) - and subtract 1 */ - - exp_1 (h, l, x); - /* h + l = exp(x) * (1 + eps) with |eps| < 2^-74.139 */ - double err1 = 0x1.d1p-75 * *h; // 2^-74.139 < 0x1.d1p-75 - double u; - if (x >= 0) // implies h >= 1 and the fast_two_sum pre-condition holds - fast_two_sum (h, &u, *h, -1.0); - else - fast_two_sum (h, &u, -1.0, *h); // x < 0 thus h <= 1 - *l += u; - /* the error in the above fast_two_sum is bounded by 2^-105*|h|, - with the new value of h */ - return err1 + 0x1p-105 * *h; // h >= 0 -} - -/* The following is a degree-16 polynomial generated by Sollya - (file expm1_accurate.sollya), - which approximates expm1(x) with relative error bounded by 2^-109.536 - for |x| <= 0.125. */ -static const double Q[] = { - 0x1p0, // degree 1: Q[0] - 0x1p-1, // degree 2: Q[1] - 0x1.5555555555555p-3, 0x1.55555555554abp-57, // degree 3: Q[2], Q[3] - 0x1.5555555555555p-5, 0x1.5555555529b52p-59, // degree 4: Q[4], Q[5] - 0x1.1111111111111p-7, 0x1.111110fd7800cp-63, // degree 5: Q[6], Q[7] - 0x1.6c16c16c16c17p-10, -0x1.f49f228e81422p-65, // degree 6: Q[8], Q[9] - 0x1.a01a01a01a01ap-13, 0x1.a1a3748b2ap-73, // degree 7: Q[10], Q[11] - 0x1.a01a01a01a01ap-16, // degree 8: Q[12] - 0x1.71de3a556c733p-19, // degree 9: Q[13] - 0x1.27e4fb7789f9fp-22, // degree 10: Q[14] - 0x1.ae64567f5755ep-26, // degree 11: Q[15] - 0x1.1eed8efedba9bp-29, // degree 12: Q[16] - 0x1.612460b437492p-33, // degree 13: Q[17] - 0x1.93976857d992ap-37, // degree 14: Q[18] - 0x1.ae966f43fe1c7p-41, // degree 15: Q[19] - 0x1.ac8bc1457bf6dp-45, // degree 16: Q[20] +static const double tz[][2] = { + {-0x1.797d4686c5393p-57, -0x1.c5041854df7d4p-3}, {-0x1.ea1cb9d163339p-55, -0x1.b881a23aebb48p-3}, + {0x1.f483a3e8cd60fp-55, -0x1.abe60e1f21838p-3}, {0x1.dffd920f493dbp-56, -0x1.9f3129931fabp-3}, + {-0x1.51bfdbb129094p-55, -0x1.9262c1c3430ap-3}, {0x1.cd3e5225e2206p-55, -0x1.857aa375db4e4p-3}, + {0x1.e3a6bdaece8f9p-58, -0x1.78789b0a5e0cp-3}, {-0x1.daf2ae0c2d3d4p-55, -0x1.6b5c7478983d8p-3}, + {-0x1.fd36226fadd44p-56, -0x1.5e25fb4fde21p-3}, {0x1.d887cd0341abp-56, -0x1.50d4fab639758p-3}, + {-0x1.676a52a1a618bp-55, -0x1.43693d679612cp-3}, {0x1.9776b420ad283p-56, -0x1.35e28db4ecd9cp-3}, + {0x1.3d5fd7d70a5edp-56, -0x1.2840b5836cf68p-3}, {0x1.a94ad2c8fa0bfp-58, -0x1.1a837e4ba376p-3}, + {0x1.6ad4c353465bp-61, -0x1.0caab118a1278p-3}, {-0x1.8bba170e59b65p-56, -0x1.fd6c2d0e3d91p-4}, + {-0x1.e1e0a76cb0685p-55, -0x1.e14aed893eefp-4}, {0x1.fe131f55e75f8p-55, -0x1.c4f1331d22d4p-4}, + {-0x1.b5beee8bcee31p-55, -0x1.a85e8c62d9c1p-4}, {-0x1.7fe9b02c25e9bp-56, -0x1.8b92870fa2b58p-4}, + {-0x1.32ae7bdaf1116p-55, -0x1.6e8caff341fe8p-4}, {0x1.a6cfe58cbd73bp-56, -0x1.514c92f634788p-4}, + {0x1.8798de3138a56p-57, -0x1.33d1bb17df2e8p-4}, {-0x1.589321a7ef10bp-60, -0x1.161bb26cbb59p-4}, + {-0x1.8d0e700fcfb65p-56, -0x1.f0540438fd5cp-5}, {0x1.473ef07d5dd3bp-55, -0x1.b3f864c08p-5}, + {-0x1.38e62149c16e2p-55, -0x1.77239501304p-5}, {-0x1.08bb6309bd394p-58, -0x1.39d4a1a77e05p-5}, + {-0x1.bad3fd501a227p-55, -0x1.f8152aee945p-6}, {0x1.3d27ac39ed253p-57, -0x1.7b88f290230ep-6}, + {-0x1.b60bbd08aac55p-55, -0x1.fc055004416cp-7}, {-0x1.a00d03b3359dep-59, -0x1.fe0154aaeed8p-8}, + {0x0p+0, 0x0p+0}, + {0x1.861931c15e39bp-55, 0x1.0100ab00222cp-7}, {0x1.7ab864b3e9045p-56, 0x1.0202ad5778e4p-6}, + {0x1.4e5659d75e95bp-56, 0x1.84890d904374p-6}, {0x1.8e0bd083aba81p-56, 0x1.040ac0224fd9p-5}, + {0x1.45cc1cf959b1bp-60, 0x1.465509d383ebp-5}, {-0x1.eb6980ce14da7p-55, 0x1.89246d053d18p-5}, + {0x1.7324137d6c342p-56, 0x1.cc79f4f5613ap-5}, {-0x1.5272ff30eed1bp-59, 0x1.082b577d34ed8p-4}, + {-0x1.1280f19dace1cp-55, 0x1.2a5dd543ccc5p-4}, {-0x1.d550af31c8ec3p-55, 0x1.4cd4fc989cd68p-4}, + {0x1.7923b72aa582dp-55, 0x1.6f9157587069p-4}, {-0x1.76c2e732457f1p-56, 0x1.92937074e0cd8p-4}, + {0x1.81f5c92a5200fp-55, 0x1.b5dbd3f68122p-4}, {0x1.e8ac7a4d3206cp-55, 0x1.d96b0eff0e79p-4}, + {-0x1.12db6f4bbe33bp-56, 0x1.fd41afcba45e8p-4}, {-0x1.8c4a5df1ec7e5p-58, 0x1.10b022db7ae68p-3}, + {-0x1.bd4b1c37ea8a2p-57, 0x1.22e3b09dc54d8p-3}, {0x1.5aeb9860044dp-55, 0x1.353bc9fb00b2p-3}, + {-0x1.4c26602c63fdap-57, 0x1.47b8b853aafecp-3}, {-0x1.7f644c1f9d314p-55, 0x1.5a5ac59b963ccp-3}, + {0x1.f5aa8ec61fc2dp-55, 0x1.6d223c5b10638p-3}, {0x1.7ab912c69ffebp-61, 0x1.800f67b00d7b8p-3}, + {-0x1.b3564bc0ec9cdp-58, 0x1.9322934f54148p-3}, {0x1.6a7062465be33p-55, 0x1.a65c0b85ac1a8p-3}, + {-0x1.85718d2ff1bf4p-55, 0x1.b9bc1d3910094p-3}, {-0x1.045cb0c685e08p-55, 0x1.cd4315e9e0834p-3}, + {-0x1.6e7fb859d5055p-62, 0x1.e0f143b41a554p-3}, {0x1.51bbdee020603p-55, 0x1.f4c6f5508ee5cp-3}, + {0x1.e17611afc42c5p-57, 0x1.04623d0b0f8c8p-2}, {-0x1.1c5b2e8735a43p-56, 0x1.0e7510fd7c564p-2}, + {-0x1.25fe139c4cffdp-55, 0x1.189c1ecaeb084p-2}, {-0x1.89843c4964554p-56, 0x1.22d78f0fa061ap-2}, }; -/* Accurate path for 0x1.6a09e667f3bccp-53 < |x| <= 0.125. */ -static double -expm1_accurate_tiny (double x) -{ - /* exceptions below have between 46 and 57 identical bits after the - round bit */ -#define EXCEPTIONS 47 - static const double exceptions[EXCEPTIONS][3] = { - {0x1.0b5d6cc46b3f8p-28, 0x1.0b5d6ccd251f9p-28, 0x1.fffffffffffffp-82}, - {-0x1.0f9b1c5ad2f3p-22, -0x1.0f9b1a1a7f6e3p-22, 0x1.fffffffffffffp-76}, - {-0x1.19e53fcd490dp-23, -0x1.19e53e96dffa9p-23, 0x1.fffffffffffffp-77}, - {0x1.1a4d6f93a29efp-24, 0x1.1a4d702f49f7dp-24, -0x1.fffffffffffffp-78}, - {-0x1.1a9dc8f6df10ap-47, -0x1.1a9dc8f6df0f7p-47, 0x1.fffffffffffffp-101}, - {0x1.2cf34db4807cdp-14, 0x1.2cf6114f2054bp-14, 0x1.fffffffffffffp-68}, - {-0x1.3988e1409212fp-51, -0x1.3988e1409212dp-51, -0x1.fffffffffffffp-105}, - {0x1.44c3d7c85bcf1p-14, 0x1.44c70fce6daabp-14, 0x1.fffffffffffffp-68}, - {-0x1.47b50a2a84ea8p-43, -0x1.47b50a2a84d05p-43, 0x1.fffffffffffffp-97}, - {0x1.51fce10251a48p-16, 0x1.51fdc02094ef7p-16, 0x1.fffffffffffffp-70}, - {-0x1.64808871369c2p-30, -0x1.6480886d55b0bp-30, 0x1.fffffffffffffp-84}, - {-0x1.6e9b2675a667ep-44, -0x1.6e9b2675a6577p-44, -0x1.fffffffffffffp-98}, - {-0x1.8154be277353ep-46, -0x1.8154be27734f5p-46, -0x1.fffffffffffffp-100}, - {0x1.8387d84827defp-38, 0x1.8387d8482c743p-38, 0x1.fffffffffffffp-92}, - {-0x1.8a8597b7c4b28p-23, -0x1.8a859557c5383p-23, -0x1.fffffffffffffp-77}, - {-0x1.92a19fd3ece36p-42, -0x1.92a19fd3ec943p-42, -0x1.fffffffffffffp-96}, - {-0x1.964a682912f4p-31, -0x1.964a68268e23fp-31, 0x1.fffffffffffffp-85}, - {-0x1.99ccc999fff07p-48, -0x1.99ccc999ffef3p-48, 0x1.fffffffffffffp-102}, - {0x1.a31972381bd0cp-23, 0x1.a31974e638221p-23, 0x1.fffffffffffffp-77}, - {-0x1.a8f783d749a8fp-4, -0x1.93aa1590d1e64p-4, -0x1.924af54b72c83p-108}, - {-0x1.ab86cb1743b75p-4, -0x1.95f8998ae5a65p-4, -0x1.84ea6e52b401ep-113}, - {-0x1.abb3b16c80ac4p-32, -0x1.abb3b16b1b63dp-32, 0x1.fffffffffffffp-86}, - {-0x1.b31e4dcde1e8ap-40, -0x1.b31e4dcde076dp-40, -0x1.fffffffffffffp-94}, - {-0x1.b935b38a6abadp-18, -0x1.b935547d3666dp-18, 0x1.fffffffffffffp-72}, - {0x1.bddfe561dbef3p-27, 0x1.bddfe5926531bp-27, -0x1.fffffffffffffp-81}, - {0x1.be2caeebfc83bp-4, 0x1.d761d8637563p-4, 0x1.a3cd02c39fb3ep-106}, - {-0x1.be9eacd95738dp-4, -0x1.a721c6d62e063p-4, 0x1.361e65cd9241p-107}, - {-0x1.c3263f6db7b48p-4, -0x1.ab30fc87097fap-4, 0x1.c47590934b57ap-106}, - {0x1.c58a7e3c93897p-4, 0x1.df9a92a4eb774p-4, -0x1.92f5f627f559fp-108}, - {-0x1.ca36132b4416p-4, -0x1.b182df1ecadb4p-4, 0x1.d689576ff9da1p-107}, - {-0x1.d097524a42e42p-4, -0x1.b7361f5082622p-4, -0x1.233581a73fd4ap-105}, - {-0x1.d4bb2250fc188p-19, -0x1.d4baecad344bfp-19, 0x1.fffffffffffffp-73}, - {-0x1.daf693d64fadap-4, -0x1.c075a87afb8a8p-4, -0x1.2aa7e4ef70195p-109}, - {-0x1.ddf3947c72332p-4, -0x1.c31ea77b4d57dp-4, -0x1.802e09c28d484p-106}, - {-0x1.dfeb80fca1157p-4, -0x1.c4def84730a0ep-4, 0x1.f5a1ebf9018f4p-107}, - {0x1.e0d50de7cdcecp-4, 0x1.fe31412377851p-4, 0x1.f881b1e44c357p-106}, - {-0x1.e6a0cc21f2c9fp-4, -0x1.cad5246110345p-4, -0x1.ffffffffffffep-58}, - {-0x1.e6b201f0d01f4p-4, -0x1.cae46c9e30824p-4, -0x1.182bebf9c627dp-104}, - {0x1.e923c188ea79bp-4, 0x1.03c5a420857cfp-3, 0x1.e63455fa8abf5p-113}, - {-0x1.e997e57006edcp-4, -0x1.cd76f688575e4p-4, -0x1.64015ad7add95p-107}, - {-0x1.ea5a8f57b2fc6p-4, -0x1.ce23adee8eaaap-4, -0x1.e4ae27bc3f8adp-105}, - {0x1.f359f8f048583p-13, 0x1.f369315ef3e8bp-13, -0x1.fffffffffffffp-67}, - {-0x1.f9c22c39aa1f4p-4, -0x1.dbc7c68016605p-4, 0x1.ffffffffffffdp-58}, - {-0x1.fab2bc8ad912p-4, -0x1.dc9c5f1ae8c7ap-4, -0x1.63b24a65b7a68p-105}, - {-0x1.ff504f1b8677cp-4, -0x1.e0afde3e0da82p-4, -0x1.197f08e0f1202p-107}, - {0x1p-52, 0x1.0000000000001p-52, -0x1.fffffffffffffp-106}, - {-0x1.bb67ae8584cabp-52, -0x1.bb67ae8584ca9p-52, -0x1.ffffffffffffep-106}, - }; - for (int i = 0; i < EXCEPTIONS; i++) - if (x == exceptions[i][0]) - return exceptions[i][1] + exceptions[i][2]; -#undef EXCEPTIONS - - double h, l, t; - double x2 = x * x, x4 = x2 * x2; - double c15 = __builtin_fma (Q[20], x, Q[19]); - double c13 = __builtin_fma (Q[18], x, Q[17]); - double c11 = __builtin_fma (Q[16], x, Q[15]); - c13 = __builtin_fma (c15, x2, c13); - // add Q[14]*x+c11*x2+c13*x4 to Q[13] - fast_two_sum (&h, &l, Q[13], Q[14] * x + c11 * x2 + c13 * x4); - // multiply h+l by x and add Q[12] - s_mul (&h, &l, x, h, l); - fast_two_sum (&h, &t, Q[12], h); - l += t; - // multiply h+l by x and add Q[10]+Q[11] - s_mul (&h, &l, x, h, l); - fast_two_sum (&h, &t, Q[10], h); - l += t + Q[11]; - // multiply h+l by x and add Q[8]+Q[9] - s_mul (&h, &l, x, h, l); - fast_two_sum (&h, &t, Q[8], h); - l += t + Q[9]; - // multiply h+l by x and add Q[6]+Q[7] - s_mul (&h, &l, x, h, l); - fast_two_sum (&h, &t, Q[6], h); - l += t + Q[7]; - // multiply h+l by x and add Q[4]+Q[5] - s_mul (&h, &l, x, h, l); - fast_two_sum (&h, &t, Q[4], h); - l += t + Q[5]; - // multiply h+l by x and add Q[2]+Q[3] - s_mul (&h, &l, x, h, l); - fast_two_sum (&h, &t, Q[2], h); - l += t + Q[3]; - // multiply h+l by x and add Q[1] - s_mul (&h, &l, x, h, l); - fast_two_sum (&h, &t, Q[1], h); - l += t; - // multiply h+l by x - s_mul (&h, &l, x, h, l); - // multiply h+l by x - s_mul (&h, &l, x, h, l); - // add Q[0]*x = x - fast_two_sum (&h, &t, x, h); - l += t; - return h + l; -} - -static double expm1_accurate (double x) -{ - b64u64_u t = {.f = x}; - uint64_t ux = t.u, ax = ux & 0x7ffffffffffffffflu; - - if (ax <= 0x3fc0000000000000lu) // |x| <= 0.125 - return expm1_accurate_tiny (x); - - /* exceptions below have between 47 and 57 identical bits after the - round bit */ -#define EXCEPTIONS 96 - static const double exceptions[EXCEPTIONS][3] = { - {-0x1.add1dce7cd5bcp-2, -0x1.5f0357a4cf6c6p-2, 0x1.398091600cd41p-105}, - {0x1.aca7ae8da5a7bp+0, 0x1.157d4acd7e557p+2, -0x1.fffffffffffffp-52}, - {0x1.d6336a88077aap+0, 0x1.51a8dff540ff7p+2, 0x1.78f1982b593afp-105}, - {-0x1.1397add4538acp-1, -0x1.aa3b02b31d93ep-2, 0x1.0f8991f2f9ffp-104}, - {0x1.00091a4a0dae5p+2, 0x1.ad0726fd1ccb3p+5, -0x1.ffffffffffffep-49}, - {0x1.273c188aa7b14p+2, 0x1.8f295a96ec6ebp+6, -0x1.fffffffffffffp-48}, - {0x1.0d73e6af47f36p+2, 0x1.097ad3a32b788p+6, -0x1.0f723a11eccf7p-98}, - {0x1.83d4bcdebb3f4p+2, 0x1.ab50b409c8aeep+8, 0x1.16719fcede453p-103}, - {0x1.a9da5c0e731eap+2, 0x1.836c253ffa44ep+9, -0x1.c092bc48c07c3p-96}, - {-0x1.02b72fbea16ep-2, -0x1.c93d7beeed889p-3, -0x1.5fedfe9ad705ap-107}, - {0x1.016e82ceda359p+1, 0x1.9e37fb31fd5fcp+2, 0x1.3709b5649e622p-102}, - {0x1.76e7e5d7b6eacp+3, 0x1.de7bd6751029ap+16, 0x1.d1765ed0dbee1p-89}, - {0x1.62f71c4656b61p-1, 0x1.0012ecb039c9cp+0, 0x1.01dc6b104a893p-105}, - {-0x1.ea16274b0109bp-3, -0x1.b3dbaf5230568p-3, -0x1.21f261d234775p-106}, - {-0x1.343d5853ab1bap-3, -0x1.1e2a26c6cbcffp-3, -0x1.43c9bfa598339p-109}, - {0x1.08f51434652c3p+4, 0x1.daac439b157e5p+23, 0x1.c6823badae774p-84}, - {0x1.1d5c2daebe367p+4, 0x1.a8c02e174c315p+25, -0x1.de0fc9395bbd4p-83}, - {0x1.634b2dd7eb0a3p+4, 0x1.0684c2e7b00fcp+32, 0x1.1e355e7edc3c3p-72}, - {-0x1.789d025948efap-2, -0x1.3b1ee1f952dcdp-2, 0x1.ffffffffffffdp-56}, - {-0x1.dc2b5df1f7d3dp-1, -0x1.35fe01788d71cp-1, 0x1.dc83c7a84cf5fp-108}, - {0x1.2ee70220fb1c5p+5, 0x1.8aa92bc84ff91p+54, 0x1.3c264141f8e99p-54}, - {0x1.1a0408712e00ap-2, 0x1.44acc499153ccp-2, 0x1.758d621c3b9dep-106}, - {0x1.8172a0e02f90ep-2, 0x1.d404e97601d65p-2, -0x1.ffffffffffffap-56}, - {-0x1.22e24fa3d5cf9p-1, -0x1.bbd1d708f42adp-2, 0x1.dd168cf650e6cp-107}, - {0x1.fde31a71ddba9p-3, 0x1.217c79b0566b5p-2, 0x1.066766014f376p-106}, - {0x1.067b7708b71b9p-3, 0x1.180b891078de3p-3, 0x1.0702eef85fd7fp-105}, - {-0x1.0ce0a43467d9fp-3, -0x1.f7f3398ad73bdp-4, 0x1.82fd5865e6c2p-106}, - {0x1.57ecb12f42f09p-3, 0x1.767d3ffbe9a82p-3, 0x1.699b9b978bb19p-104}, - {0x1.a20bbf6967c11p-3, 0x1.cfc51d8639b8fp-3, 0x1.0a73acd1aa664p-105}, - {-0x1.cddf723d3e52fp-3, -0x1.9d7ec7df33dbcp-3, -0x1.4c519851f4cf7p-106}, - {0x1.28d1885215445p-3, 0x1.3f67cb950a619p-3, 0x1.fffffffffffeep-57}, - {-0x1.bc21f0ba4ae83p-3, -0x1.8f4678512ce5ep-3, 0x1.e4d526363d49p-107}, - {-0x1.58db2327d4e2bp-3, -0x1.3d627e6f47f5ap-3, 0x1.629cd619c9258p-104}, - {-0x1.f31bfe026a32ep-2, -0x1.8b0b6b63cdd01p-2, 0x1.37751462f58edp-106}, - {0x1.6587e74ac8c65p+0, 0x1.854e6c6c05b13p+1, -0x1.2c5c28c210ab2p-103}, - {0x1.005ae04256babp-1, 0x1.4cbb1357e7a3dp-1, 0x1.10f83e22a66fcp-106}, - {0x1.a3a7add74f25ap-2, 0x1.0359f11a22a8dp-1, 0x1.1318aadf4a74fp-104}, - {0x1.04ac36c54a838p-3, 0x1.15fd2bf20273bp-3, 0x1.1bfee381a9d05p-104}, - {0x1.8eaa8cb0d0f38p-3, 0x1.b81d26b109c8p-3, 0x1.d8bfad7e2b897p-104}, - {0x1.bcab27d05abdep-2, 0x1.166ce703b05e9p-1, 0x1.dfe7b252154edp-106}, - {0x1.22a9d3042f3bcp-3, 0x1.384d130e4e667p-3, 0x1.ffffffffffff7p-57}, - {-0x1.74c12f94c4363p-3, -0x1.54cccbecda5e9p-3, 0x1.7a2c5613c769ep-104}, - {0x1.27f4980d511ffp-2, 0x1.5728eea2bbdddp-2, -0x1.45704d346de3ap-108}, - {0x1.8bbe2fb45c151p-2, 0x1.e3186ba9d4d49p-2, 0x1.fffffffffffffp-56}, - {-0x1.43f9e7a1919fep-3, -0x1.2ba68646726cfp-3, -0x1.ffffffffffff7p-57}, - {-0x1.938f3a33191ffp-2, -0x1.4d87fe71b1badp-2, 0x1.3df9b0557c98ap-104}, - {-0x1.474d4de7c14bbp-2, -0x1.182619ac31282p-2, 0x1.31d9b27789f7p-104}, - {0x1.81f63829c4e0ap-3, 0x1.a8ba20a181bb4p-3, 0x1.dcb7557eb5134p-105}, - {0x1.c195b6198a1d2p-3, 0x1.f6c011cfb84c9p-3, 0x1.d430b1fc276fdp-105}, - {0x1.cd3848dec31b2p-3, 0x1.02a4321c73106p-2, 0x1.7bef5eff06922p-105}, - {0x1.d707029bb59d9p-2, 0x1.2b092fef66a7ep-1, 0x1.e27333f64e0b9p-106}, - {0x1.f6e4c3ced7c72p-3, 0x1.1d0232e560f38p-2, 0x1.644b7f5399dfp-107}, - {0x1.fab8ff1fa05f1p-1, 0x1.b0be8b6d80446p+0, 0x1.68f6a55a21bcap-103}, - {0x1.accfbe46b4efp-1, 0x1.4f85c9783dce1p+0, -0x1.4f3d25cc4570bp-107}, - {-0x1.b8144d498cc5bp-3, -0x1.8c024d0aa27b3p-3, 0x1.0702d4719540dp-108}, - {0x1.4e88c5accfda5p-3, 0x1.6b68447b2f2fdp-3, -0x1.2cb8fff116072p-110}, - {0x1.7d7fc2e4f5fccp-3, 0x1.a3583db6ebf94p-3, 0x1.1d43ccdb25e74p-106}, - {0x1.1c38132777b26p-2, 0x1.4794729ba52adp-2, -0x1.5abd16c70b908p-106}, - {-0x1.119aae6072d39p-2, -0x1.e033b6b48a1fbp-3, -0x1.5924cbdac85bbp-107}, - {0x1.0727af5fee8f6p-1, 0x1.5806551a5d846p-1, 0x1.05a62956baf36p-104}, - {0x1.e9375280398bbp+0, 0x1.70a159662f223p+2, 0x1.b23b8a707f1cdp-103}, - {-0x1.7725e67d94824p-3, -0x1.56cb40d337d1dp-3, 0x1.382199a20e409p-104}, - {-0x1.3b89bb1b787cdp-3, -0x1.246e9c005c036p-3, -0x1.4c6ed3df37a13p-107}, - {-0x1.8aeb636f3ce35p-3, -0x1.672d45e082548p-3, 0x1.82b6b66e03876p-110}, - {-0x1.d3f3799439415p-3, -0x1.a256cd99e8292p-3, -0x1.07e9d5d1fbf62p-108}, - {0x1.704f3cd72bc67p-3, 0x1.93816aeb7ae9ep-3, 0x1.4036d6435d65p-104}, - {-0x1.bf6548c02eec9p-3, -0x1.91e66bbf6409fp-3, -0x1.0f5e23310d5e8p-104}, - {0x1.8a31fa78c68afp-3, 0x1.b2b0210d13ed3p-3, 0x1.a132d283b2aa6p-107}, - {-0x1.290ea09e36479p-3, -0x1.1484b3cd038fp-3, -0x1.09bec3f4113eep-111}, - {0x1.a065fefae814fp-3, 0x1.cdc010de032e4p-3, 0x1.ff41a6986a845p-106}, - {0x1.4032183482ed7p-3, 0x1.5a955756bd3e1p-3, 0x1.848861561a9bp-106}, - {0x1.223469ea438e4p-3, 0x1.37c5c66727519p-3, 0x1.08e9c703aa567p-104}, - {-0x1.f193dbe5f18bbp-3, -0x1.b9be811308062p-3, 0x1.8e3bbdc8e1fd7p-106}, - {-0x1.82b5dfaf59b4cp-2, -0x1.4213802eb28ffp-2, 0x1.ffffffffffffdp-56}, - {0x1.d086543694c5ap-1, 0x1.7a417a07cafafp+0, 0x1.62cf4b32655bdp-106}, - {0x1.37c9e03e6099dp+0, 0x1.30a9340959f93p+1, 0x1.bd43cb2443c73p-103}, - {-0x1.2a9cad9998262p+0, -0x1.60870b262bf1cp-1, -0x1.e757fe830d60ep-109}, - {-0x1.ac71ace4f979p-3, -0x1.8298cb774359bp-3, 0x1.b5ca0b5a8abeep-105}, - {0x1.677e81300d1f4p-3, 0x1.88f9dbf1b4e57p-3, 0x1.8a69b407735c4p-105}, - {0x1.4297ec53f6b7fp-1, 0x1.c16640ad39959p-1, 0x1.ffffffffffffdp-55}, - {-0x1.0a54d87783d6fp+0, -0x1.4b1887d4d477cp-1, 0x1.d81f352752164p-108}, - {0x1.1f0da93354198p+7, 0x1.0bd73b73fc74cp+207, 0x1.588526e93304cp+103}, - {0x1.7a60ee15e3e9dp+6, 0x1.62e4dc3bbf53fp+136, 0x1.ae7c8ed9b6bcbp+30}, - {0x1.0bc04af1b09f5p+9, 0x1.7b1d97c902985p+772, 0x1.551dfecc05bd4p+667}, - {0x1.9e7b643238a14p+8, 0x1.f5da7fe652978p+597, 0x1.0429700e71228p+494}, - {0x1.3f37fb551e418p+9, 0x1.0ccdc52c38712p+921, 0x1.376e0ad4f23b9p+818}, - {0x1.2da9e5e6af0bp+8, 0x1.27d6fe867d6f6p+435, 0x1.0a1d500c39996p+330}, - {0x1.556c678d5e976p+7, 0x1.37e7ac4e7f9b3p+246, 0x1.01a99afd82b06p+142}, - {0x1.519fd95037e31p+6, 0x1.b53c2f00bb322p+121, 0x1.fa70a379db2fbp+18}, - {0x1.54cd1fea7663ap+7, 0x1.c90810d354618p+245, 0x1.2925a9627fb2cp+136}, - {0x1.6474c604cc0d7p+6, 0x1.7a8f65ad009bdp+128, -0x1.0b611958ec877p+21}, - {0x1.d6479eba7c971p+8, 0x1.62a88613629b6p+678, -0x1.3f69a2085428cp+569}, - {0x1.7945e34b18a9ap+7, 0x1.1b0e4936a8c9bp+272, -0x1.f983e7e9b16f1p+167}, - {0x1.c44ce0d716a1ap+4, 0x1.b890ca8636ae2p+40, -0x1.bde9e7639f651p-68}, - {0x1.c7206c1b753e4p+8, 0x1.8670de0b68cadp+656, -0x1.7599cebd802f7p+549}, - {0x1.89d56a0c38e6fp+5, 0x1.0410c95b580b9p+71, -0x1.7d1a66d4c94f2p-40}, - }; - for (int i = 0; i < EXCEPTIONS; i++) - if (x == exceptions[i][0]) - return exceptions[i][1] + exceptions[i][2]; -#undef EXCEPTIONS - - /* now -0x1.2b708872320e2p+5 < x < 0.125 or - 0.125 < x < 0x1.62e42fefa39fp+9: we approximate exp(x) - and subtract 1 */ - - double h, l; - exp_2 (&h, &l, x); - double u; - if (x >= 0) // implies h >= 1 and the fast_two_sum pre-condition holds - fast_two_sum (&h, &u, h, -1.0); - else - fast_two_sum (&h, &u, -1.0, h); // x < 0 thus h <= 1 - l += u; - /* the error in the above fast_two_sum is bounded by 2^-105*|h|, - with the new value of h */ - return h + l; +static double __attribute__((noinline)) as_expm1_accurate(double x){ + b64u64_u ix = {.f = x}; + if(__builtin_expect(__builtin_fabs(x)<0.25, 0)){ + static const double cl[] = + {0x1.93974a8ca5354p-37, 0x1.ae7f3e71e4908p-41, 0x1.ae7f357341648p-45, 0x1.952c7f96664cbp-49, + 0x1.686f8ce633aaep-53, 0x1.2f49b2fbfb5b6p-57}; + static const double ch[][2] = { + {0x1.5555555555555p-3, 0x1.5555555555554p-57}, {0x1.5555555555555p-5, 0x1.5555555555123p-59}, + {0x1.1111111111111p-7, 0x1.1111111118167p-63}, {0x1.6c16c16c16c17p-10, -0x1.f49f49e220ceap-65}, + {0x1.a01a01a01a01ap-13, 0x1.a019eff6f919cp-73}, {0x1.a01a01a01a01ap-16, 0x1.9fcff48a75b41p-76}, + {0x1.71de3a556c734p-19, -0x1.c14f73758cd7fp-73}, {0x1.27e4fb7789f5cp-22, 0x1.dfce97931018fp-76}, + {0x1.ae64567f544e3p-26, 0x1.c513da9e4c9c5p-80}, {0x1.1eed8eff8d831p-29, 0x1.ca00af84f2b6p-83}, + {0x1.6124613a86e8fp-33, 0x1.f27ac6000898fp-87} + }; + + double fl = x*(cl[0] + x*(cl[1] + x*(cl[2] + x*(cl[3] + x*(cl[4] + x*(cl[5])))))); + double fh = opolyddd(x, 11,ch, &fl); + fh = mulddd(fh,fl, x, &fl); + fh = mulddd(fh,fl, x, &fl); + fh = mulddd(fh,fl, x, &fl); + double hx = 0.5*x, x2h = x*hx, x2l = __builtin_fma(x,hx,-x2h); + fh = fastsum(x2h,x2l, fh,fl, &fl); + double v2, v0 = fasttwosum(x, fh, &v2), v1 = fasttwosum(v2, fl, &v2); + v0 = fasttwosum(v0,v1, &v1); + v1 = fasttwosum(v1,v2, &v2); + ix.f = v1; + if((ix.u&(~0ul>>12))==0) { + if(!(ix.u<<1)) return as_expm1_database(x,v0); + b64u64_u v = {.f = v2}; + i64 d = ((((i64)ix.u>>63)^((i64)v.u>>63))<<1) + 1; + ix.u += d; + v1 = ix.f; + } + return v0 + v1; + } else { + static const double ch[][2] = + {{0x1p+0, 0}, {0x1p-1, 0x1.712f72ecec2cfp-99}, {0x1.5555555555555p-3, 0x1.5555555554d07p-57}, + {0x1.5555555555555p-5, 0x1.55194d28275dap-59}, {0x1.1111111111111p-7, 0x1.12faa0e1c0f7bp-63}, + {0x1.6c16c16da6973p-10, -0x1.4ba45ab25d2a3p-64}, {0x1.a01a019eb7f31p-13, -0x1.9091d845ecd36p-67}}; + const double s = 0x1.71547652b82fep+12; + double t = __builtin_roundeven(x*s); + i64 jt = t, i0 = (jt>>6)&0x3f, i1 = jt&0x3f, ie = jt>>12; + double t0h = t0[i0][1], t0l = t0[i0][0]; + double t1h = t1[i1][1], t1l = t1[i1][0]; + double tl, th = muldd(t0h,t0l, t1h,t1l, &tl); + + const double l2h = 0x1.62e42ffp-13, l2l = 0x1.718432a1b0e26p-47, l2ll = 0x1.9ff0342542fc3p-102; + double dx = x - l2h*t, dxl = l2l*t, dxll = l2ll*t + __builtin_fma(l2l,t,-dxl); + double dxh = dx + dxl; dxl = (dx - dxh) + dxl + dxll; + double fl, fh = opolydd(dxh,dxl, 7,ch, &fl); + fh = muldd(dxh,dxl, fh,fl, &fl); + fh = muldd(fh,fl, th,tl, &fl); + fh = fastsum(th,tl, fh,fl, &fl); + b64u64_u off = {.u = (2048+1023-ie)<<52}; + double e; + if(__builtin_expect(ie<53, 1)) + fh = fasttwosum(off.f, fh, &e); + else{ + if(ie<104) + fh = fasttwosum(fh, off.f, &e); + else + e = 0; + } + fl += e; + fh = fasttwosum(fh,fl, &fl); + ix.f = fl; + u64 d = (ix.u + 8)&(~0ul>>12); + if(__builtin_expect(d<=8, 0)) fh = as_expm1_database(x, fh); + fh = as_ldexp(fh, ie); + return fh; + } } -double -cr_expm1 (double x) -{ - b64u64_u t = {.f = x}; - uint64_t ux = t.u, ax = ux & 0x7ffffffffffffffflu; - - if (__builtin_expect (ux >= 0xc042b708872320e2, 0)) - { - // x = -NaN or x <= -0x1.2b708872320e2p+5 - if ((ux >> 52) == 0xfff) // -NaN or -Inf - return (ux > 0xfff0000000000000lu) ? x : -1.0; - // for x <= -0x1.2b708872320e2p+5, expm1(x) rounds to -1 to nearest - return -1.0 + 0x1p-54; - } - else if (__builtin_expect (ax >= 0x40862e42fefa39f0, 0)) - { - // x = +NaN or x >= 0x1.62e42fefa39fp+9 - if ((ux >> 52) == 0x7ff) // +NaN - return x; - // for x >= 0x1.62e42fefa39fp+9, expm1(x) rounds to +Inf to nearest - return 0x1.fffffffffffffp+1023 * x; +double cr_expm1(double x){ + b64u64_u ix = {.f = x}; + u64 aix = ix.u & (~0ul>>1); + if(__builtin_expect(aix < 0x3fd0000000000000ul, 1)){ + if( __builtin_expect(aix < 0x3ca0000000000000ul, 0)) { + if( !aix ) return x; + return __builtin_fma(0x1p-54, __builtin_fabs(x), x); + } + double sx = 0x1p7*x, fx = __builtin_roundeven(sx), z = sx - fx, z2 = z*z; + i64 i = fx; + double th = tz[i+32][1], tl = tz[i+32][0]; + static const double c[] = + {0x1p-7, 0x1p-15, 0x1.55555555551adp-24, 0x1.555555555599cp-33, 0x1.11111ad1ad69dp-42, 0x1.6c16c168b1fb5p-52}; + double fh = z*c[0], fl = z2*((c[1] + z*c[2]) + z2*(c[3] + z*(c[4] + z*c[5]))); + double e0 = 0x1.ap-65, eps = z2*e0 + 0x1p-104; + double rl, rh = fasttwosum(th,fh,&rl); rl += tl + fl; + fh = muldd(th,tl, fh,fl, &fl); + fh = fastsum(rh,rl, fh,fl, &fl); + double ub = fh + (fl + eps), lb = fh + (fl - eps); + if(__builtin_expect( ub != lb, 0)) return as_expm1_accurate(x); + return lb; + } else { + if(__builtin_expect(aix>=0x40862e42fefa39f0ul, 0)){ + if(aix>0x7ff0000000000000ul) return x; + if(aix==0x7ff0000000000000ul){ + if(ix.u>>63) + return -1.0; + else + return x; + } + if(!(ix.u>>63)){ + volatile double z = 0x1p1023; + return z*z; + } + } + if(__builtin_expect(ix.u>=0xc0425e4f7b2737faul, 0)){ + if(ix.u>=0xc042b708872320e2ul) return -1.0 + 0x1p-55; + return (0x1.25e4f7b2737fap+5 + x + 0x1.8486612173c69p-51)*0x1.71547652b82fep-54 - 0x1.fffffffffffffp-1; + } + + const double s = 0x1.71547652b82fep+12; + double t = __builtin_roundeven(x*s); + i64 jt = t, i0 = (jt>>6)&0x3f, i1 = jt&0x3f, ie = jt>>12; + double t0h = t0[i0][1], t0l = t0[i0][0]; + double t1h = t1[i1][1], t1l = t1[i1][0]; + double tl, th = muldd(t0h,t0l, t1h,t1l, &tl); + const double l2h = 0x1.62e42ffp-13, l2l = 0x1.718432a1b0e26p-47; + double dx = (x - l2h*t) + l2l*t, dx2 = dx*dx; + static const double ch[] = {0x1p+0, 0x1p-1, 0x1.55555557e54ffp-3, 0x1.55555553a12f4p-5}; + double p = (ch[0] + dx*ch[1]) + dx2*(ch[2] + dx*ch[3]); + double fh = th, tx = th*dx, fl = tl + tx*p; + double eps = 1.64e-19*th; + b64u64_u off = {.u = (2048+1023-ie)<<52}; + double e; + if(__builtin_expect(ie<53, 1)){ + fh = fasttwosum(off.f, fh, &e); + } else { + if(ie<75){ + fh = fasttwosum(fh, off.f, &e); + } else + e = 0; + } + fl += e; + double ub = fh + (fl + eps), lb = fh + (fl - eps); + if(__builtin_expect( ub != lb, 0)) return as_expm1_accurate(x); + return as_ldexp(lb, ie); } - else if (ax <= 0x3ca6a09e667f3bcc) // |x| <= 0x1.6a09e667f3bccp-53 - /* then expm1(x) rounds to x (to nearest), with Taylor expansion - x + x^2/2 + ... */ - { - if (ax <= 0x3c96a09e667f3bcc) - /* |x| <= 0x1.6a09e667f3bccp-54: x^2 < 1/2 ulp(x), we have to deal with - -0 apart since fma (-0, -0, -0) is (+0) + (-0) which evaluates to +0 - for some rounding modes */ - return (x == 0) ? x : __builtin_fma (x, x, x); - else - /* 0x1p-53 <= |x| <= 0x1.6a09e667f3bccp-53: x/4 is exactly - representable, and x^2/4 < 1/2 ulp(x) */ - return __builtin_fma (x, x * 0.25, x); - } - - /* -0x1.2b708872320e2p+5 < x < -0x1.6a09e667f3bccp-53 or - 0x1.6a09e667f3bccp-53 < x < 0x1.62e42fefa39fp+9 */ - - double err, h, l; - err = expm1_fast (&h, &l, x, ax <= 0x3fc0000000000000lu); - double left = h + (l - err); - double right = h + (l + err); - if (left == right) - return left; - - return expm1_accurate (x); } diff --git a/src/binary64/log/check_special.c b/src/binary64/log/check_special.c index 78597d44..2c054a00 100644 --- a/src/binary64/log/check_special.c +++ b/src/binary64/log/check_special.c @@ -93,7 +93,6 @@ static double get_random () { b64u64_u v; - long l; v.u = rand (); v.u |= (uint64_t) rand () << 31; v.u |= (uint64_t) rand () << 62; diff --git a/src/binary64/log10/check_special.c b/src/binary64/log10/check_special.c index 661687c2..c8b1e080 100644 --- a/src/binary64/log10/check_special.c +++ b/src/binary64/log10/check_special.c @@ -93,7 +93,6 @@ static double get_random () { b64u64_u v; - long l; v.u = rand (); v.u |= (uint64_t) rand () << 31; v.u |= (uint64_t) rand () << 62; diff --git a/src/binary64/log10p1/check_special.c b/src/binary64/log10p1/check_special.c index ff0c8e69..8deb3de2 100644 --- a/src/binary64/log10p1/check_special.c +++ b/src/binary64/log10p1/check_special.c @@ -62,7 +62,6 @@ static double get_random () { b64u64_u v; - long l; v.u = rand (); v.u |= (uint64_t) rand () << 31; v.u |= (uint64_t) rand () << 62; diff --git a/src/binary64/log1p/check_special.c b/src/binary64/log1p/check_special.c index c21ad433..6cd3eec7 100644 --- a/src/binary64/log1p/check_special.c +++ b/src/binary64/log1p/check_special.c @@ -62,7 +62,6 @@ static double get_random () { b64u64_u v; - long l; v.u = rand (); v.u |= (uint64_t) rand () << 31; v.u |= (uint64_t) rand () << 62; diff --git a/src/binary64/log1p/log1p.c b/src/binary64/log1p/log1p.c index eee547f0..7331cb0f 100644 --- a/src/binary64/log1p/log1p.c +++ b/src/binary64/log1p/log1p.c @@ -1,7 +1,6 @@ /* Correctly rounded log(1+x) for binary64 values. -Copyright (c) 2022-2023 INRIA and CERN. -Authors: Paul Zimmermann and Tom Hubrecht. +Copyright (c) 2024 Alexei Sibidanov. This file is part of the CORE-MATH project (https://core-math.gitlabpages.inria.fr/). @@ -26,7 +25,6 @@ SOFTWARE. */ #include -#include "dint.h" // Warning: clang also defines __GNUC__ #if defined(__GNUC__) && !defined(__clang__) @@ -35,928 +33,396 @@ SOFTWARE. #pragma STDC FENV_ACCESS ON -typedef union { double f; uint64_t u; } d64u64; +typedef uint64_t u64; +typedef int64_t i64; +typedef unsigned short ushort; +typedef union {double f; uint64_t u;} b64u64_u; -/* Add a + b, such that *hi + *lo approximates a + b. - Assumes |a| >= |b|. */ -static void -fast_two_sum (double *hi, double *lo, double a, double b) -{ - double e; - - *hi = a + b; - e = *hi - a; /* exact */ - *lo = b - e; /* exact */ - /* Now hi + lo = a + b exactly for rounding to nearest. - For directed rounding modes, this is not always true. - Take for example a = 1, b = 2^-200, and rounding up, - then hi = 1 + 2^-52, e = 2^-52 (it can be proven that - e is always exact), and lo = -2^52 + 2^-105, thus - hi + lo = 1 + 2^-105 <> a + b = 1 + 2^-200. - A bound on the error is given - in "Note on FastTwoSum with Directed Roundings" - by Paul Zimmermann, https://hal.inria.fr/hal-03798376, 2022. - Theorem 1 says that - the difference between a+b and hi+lo is bounded by 2u^2|a+b| - and also by 2u^2|hi|. Here u=2^-53, thus we get: - |(a+b)-(hi+lo)| <= 2^-105 min(|a+b|,|hi|) */ +static inline double fasttwosum(double x, double y, double *e){ + double s = x + y, z = s - x; + *e = y - z; + return s; } -/* For 362 <= i <= 724, r[i] = _INVERSE[i-362] is a 10-bit approximation of - 1/x[i], where i*2^-9 <= x[i] < (i+1)*2^-9. - More precisely r[i] is a 10-bit value such that r[i]*y-1 is representable - exactly on 53 bits for any y, i*2^-9 <= y < (i+1)*2^-9. - Moreover |r[i]*y-1| <= 0.00212097167968735. */ -static const double _INVERSE[363]= { - 0x1.698p+0, 0x1.688p+0, 0x1.678p+0, 0x1.668p+0, 0x1.658p+0, 0x1.648p+0, 0x1.638p+0, - 0x1.63p+0, 0x1.62p+0, 0x1.61p+0, 0x1.6p+0, 0x1.5fp+0, 0x1.5ep+0, 0x1.5dp+0, - 0x1.5cp+0, 0x1.5bp+0, 0x1.5a8p+0, 0x1.598p+0, 0x1.588p+0, 0x1.578p+0, 0x1.568p+0, - 0x1.56p+0, 0x1.55p+0, 0x1.54p+0, 0x1.53p+0, 0x1.52p+0, 0x1.518p+0, 0x1.508p+0, - 0x1.4f8p+0, 0x1.4fp+0, 0x1.4ep+0, 0x1.4dp+0, 0x1.4cp+0, 0x1.4b8p+0, 0x1.4a8p+0, - 0x1.4ap+0, 0x1.49p+0, 0x1.48p+0, 0x1.478p+0, 0x1.468p+0, 0x1.458p+0, 0x1.45p+0, - 0x1.44p+0, 0x1.43p+0, 0x1.428p+0, 0x1.418p+0, 0x1.41p+0, 0x1.4p+0, 0x1.3f8p+0, - 0x1.3e8p+0, 0x1.3ep+0, 0x1.3dp+0, 0x1.3cp+0, 0x1.3b8p+0, 0x1.3a8p+0, 0x1.3ap+0, - 0x1.39p+0, 0x1.388p+0, 0x1.378p+0, 0x1.37p+0, 0x1.36p+0, 0x1.358p+0, 0x1.35p+0, - 0x1.34p+0, 0x1.338p+0, 0x1.328p+0, 0x1.32p+0, 0x1.31p+0, 0x1.308p+0, 0x1.3p+0, - 0x1.2fp+0, 0x1.2e8p+0, 0x1.2d8p+0, 0x1.2dp+0, 0x1.2c8p+0, 0x1.2b8p+0, 0x1.2bp+0, - 0x1.2ap+0, 0x1.298p+0, 0x1.29p+0, 0x1.28p+0, 0x1.278p+0, 0x1.27p+0, 0x1.26p+0, - 0x1.258p+0, 0x1.25p+0, 0x1.24p+0, 0x1.238p+0, 0x1.23p+0, 0x1.228p+0, 0x1.218p+0, - 0x1.21p+0, 0x1.208p+0, 0x1.2p+0, 0x1.1fp+0, 0x1.1e8p+0, 0x1.1ep+0, 0x1.1dp+0, - 0x1.1c8p+0, 0x1.1cp+0, 0x1.1b8p+0, 0x1.1bp+0, 0x1.1ap+0, 0x1.198p+0, 0x1.19p+0, - 0x1.188p+0, 0x1.18p+0, 0x1.17p+0, 0x1.168p+0, 0x1.16p+0, 0x1.158p+0, 0x1.15p+0, - 0x1.14p+0, 0x1.138p+0, 0x1.13p+0, 0x1.128p+0, 0x1.12p+0, 0x1.118p+0, 0x1.11p+0, - 0x1.1p+0, 0x1.0f8p+0, 0x1.0fp+0, 0x1.0e8p+0, 0x1.0ep+0, 0x1.0d8p+0, 0x1.0dp+0, - 0x1.0c8p+0, 0x1.0cp+0, 0x1.0bp+0, 0x1.0a8p+0, 0x1.0ap+0, 0x1.098p+0, 0x1.09p+0, - 0x1.088p+0, 0x1.08p+0, 0x1.078p+0, 0x1.07p+0, 0x1.068p+0, 0x1.06p+0, 0x1.058p+0, - 0x1.05p+0, 0x1.048p+0, 0x1.04p+0, 0x1.038p+0, 0x1.03p+0, 0x1.028p+0, 0x1.02p+0, - 0x1.018p+0, 0x1.01p+0, 0x1.008p+0, 0x1.ff8p-1, 0x1.fe8p-1, 0x1.fd8p-1, 0x1.fc8p-1, - 0x1.fb8p-1, 0x1.fa8p-1, 0x1.f98p-1, 0x1.f88p-1, 0x1.f78p-1, 0x1.f68p-1, 0x1.f58p-1, - 0x1.f5p-1, 0x1.f4p-1, 0x1.f3p-1, 0x1.f2p-1, 0x1.f1p-1, 0x1.fp-1, 0x1.efp-1, - 0x1.eep-1, 0x1.edp-1, 0x1.ec8p-1, 0x1.eb8p-1, 0x1.ea8p-1, 0x1.e98p-1, 0x1.e88p-1, - 0x1.e78p-1, 0x1.e7p-1, 0x1.e6p-1, 0x1.e5p-1, 0x1.e4p-1, 0x1.e3p-1, 0x1.e28p-1, - 0x1.e18p-1, 0x1.e08p-1, 0x1.df8p-1, 0x1.dfp-1, 0x1.dep-1, 0x1.ddp-1, 0x1.dcp-1, - 0x1.db8p-1, 0x1.da8p-1, 0x1.d98p-1, 0x1.d9p-1, 0x1.d8p-1, 0x1.d7p-1, 0x1.d6p-1, - 0x1.d58p-1, 0x1.d48p-1, 0x1.d38p-1, 0x1.d3p-1, 0x1.d2p-1, 0x1.d1p-1, 0x1.d08p-1, - 0x1.cf8p-1, 0x1.ce8p-1, 0x1.cep-1, 0x1.cdp-1, 0x1.cc8p-1, 0x1.cb8p-1, 0x1.ca8p-1, - 0x1.cap-1, 0x1.c9p-1, 0x1.c88p-1, 0x1.c78p-1, 0x1.c68p-1, 0x1.c6p-1, 0x1.c5p-1, - 0x1.c48p-1, 0x1.c38p-1, 0x1.c3p-1, 0x1.c2p-1, 0x1.c18p-1, 0x1.c08p-1, 0x1.bf8p-1, - 0x1.bfp-1, 0x1.bep-1, 0x1.bd8p-1, 0x1.bc8p-1, 0x1.bcp-1, 0x1.bbp-1, 0x1.ba8p-1, - 0x1.b98p-1, 0x1.b9p-1, 0x1.b8p-1, 0x1.b78p-1, 0x1.b68p-1, 0x1.b6p-1, 0x1.b58p-1, - 0x1.b48p-1, 0x1.b4p-1, 0x1.b3p-1, 0x1.b28p-1, 0x1.b18p-1, 0x1.b1p-1, 0x1.bp-1, - 0x1.af8p-1, 0x1.afp-1, 0x1.aep-1, 0x1.ad8p-1, 0x1.ac8p-1, 0x1.acp-1, 0x1.ab8p-1, - 0x1.aa8p-1, 0x1.aap-1, 0x1.a9p-1, 0x1.a88p-1, 0x1.a8p-1, 0x1.a7p-1, 0x1.a68p-1, - 0x1.a6p-1, 0x1.a5p-1, 0x1.a48p-1, 0x1.a4p-1, 0x1.a3p-1, 0x1.a28p-1, 0x1.a2p-1, - 0x1.a1p-1, 0x1.a08p-1, 0x1.ap-1, 0x1.9fp-1, 0x1.9e8p-1, 0x1.9ep-1, 0x1.9dp-1, - 0x1.9c8p-1, 0x1.9cp-1, 0x1.9bp-1, 0x1.9a8p-1, 0x1.9ap-1, 0x1.998p-1, 0x1.988p-1, - 0x1.98p-1, 0x1.978p-1, 0x1.968p-1, 0x1.96p-1, 0x1.958p-1, 0x1.95p-1, 0x1.94p-1, - 0x1.938p-1, 0x1.93p-1, 0x1.928p-1, 0x1.92p-1, 0x1.91p-1, 0x1.908p-1, 0x1.9p-1, - 0x1.8f8p-1, 0x1.8e8p-1, 0x1.8ep-1, 0x1.8d8p-1, 0x1.8dp-1, 0x1.8c8p-1, 0x1.8b8p-1, - 0x1.8bp-1, 0x1.8a8p-1, 0x1.8ap-1, 0x1.898p-1, 0x1.888p-1, 0x1.88p-1, 0x1.878p-1, - 0x1.87p-1, 0x1.868p-1, 0x1.86p-1, 0x1.85p-1, 0x1.848p-1, 0x1.84p-1, 0x1.838p-1, - 0x1.83p-1, 0x1.828p-1, 0x1.82p-1, 0x1.81p-1, 0x1.808p-1, 0x1.8p-1, 0x1.7f8p-1, - 0x1.7fp-1, 0x1.7e8p-1, 0x1.7ep-1, 0x1.7d8p-1, 0x1.7c8p-1, 0x1.7cp-1, 0x1.7b8p-1, - 0x1.7bp-1, 0x1.7a8p-1, 0x1.7ap-1, 0x1.798p-1, 0x1.79p-1, 0x1.788p-1, 0x1.78p-1, - 0x1.778p-1, 0x1.77p-1, 0x1.76p-1, 0x1.758p-1, 0x1.75p-1, 0x1.748p-1, 0x1.74p-1, - 0x1.738p-1, 0x1.73p-1, 0x1.728p-1, 0x1.72p-1, 0x1.718p-1, 0x1.71p-1, 0x1.708p-1, - 0x1.7p-1, 0x1.6f8p-1, 0x1.6fp-1, 0x1.6e8p-1, 0x1.6ep-1, 0x1.6d8p-1, 0x1.6dp-1, - 0x1.6c8p-1, 0x1.6cp-1, 0x1.6b8p-1, 0x1.6bp-1, 0x1.6a8p-1, 0x1.6ap-1, -}; - -/* For 362 <= i <= 724, (h,l) = _LOG_INV[i-362] is a double-double - approximation of -log(r) with r=INVERSE[i-362]), with h an integer multiple - of 2^-42, and |l| < 2^-43. The maximal difference between -log(r) and h+l - is bounded by 1/2 ulp(l) < 2^-97. */ -static const double _LOG_INV[363][2] = { - {-0x1.615ddb4becp-2, -0x1.3c7ca90bc04b2p-46}, - {-0x1.5e87b20c29p-2, -0x1.527d18f7738fap-44}, - {-0x1.5baf846aa2p-2, 0x1.39ae8f873fa41p-44}, - {-0x1.58d54f86ep-2, -0x1.791f30a795215p-45}, - {-0x1.55f9107a44p-2, 0x1.1e64778df4a62p-46}, - {-0x1.531ac457eep-2, -0x1.df83b7d931501p-44}, - {-0x1.503a682cb2p-2, 0x1.a68c8f16f9b5dp-45}, - {-0x1.4ec97326p-2, -0x1.34d7aaf04d104p-45}, - {-0x1.4be5f95778p-2, 0x1.d7c92cd9ad824p-44}, - {-0x1.4900680401p-2, 0x1.8bccffe1a0f8cp-44}, - {-0x1.4618bc21c6p-2, 0x1.3d82f484c84ccp-46}, - {-0x1.432ef2a04fp-2, 0x1.fb129931715adp-44}, - {-0x1.404308686ap-2, -0x1.f8ef43049f7d3p-44}, - {-0x1.3d54fa5c1fp-2, -0x1.c3e1cd9a395e3p-44}, - {-0x1.3a64c55694p-2, -0x1.7a71cbcd735dp-44}, - {-0x1.3772662bfep-2, 0x1.e9436ac53b023p-44}, - {-0x1.35f865c933p-2, 0x1.b07de4ea1a54ap-44}, - {-0x1.3302c16586p-2, -0x1.6217dc2a3e08bp-44}, - {-0x1.300aead063p-2, -0x1.42f568b75fcacp-44}, - {-0x1.2d10dec508p-2, -0x1.60c61f7088353p-44}, - {-0x1.2a1499f763p-2, 0x1.0dbbf51f3aadcp-44}, - {-0x1.2895a13de8p-2, -0x1.a8d7ad24c13fp-44}, - {-0x1.2596010df7p-2, -0x1.8e7bc224ea3e3p-44}, - {-0x1.22941fbcf8p-2, 0x1.a6976f5eb0963p-44}, - {-0x1.1f8ff9e48ap-2, -0x1.7946c040cbe77p-45}, - {-0x1.1c898c169ap-2, 0x1.81410e5c62affp-44}, - {-0x1.1b05791f08p-2, 0x1.2dd466dc55e2dp-44}, - {-0x1.17fb98e151p-2, 0x1.a8a8ba74a2684p-44}, - {-0x1.14ef67f887p-2, 0x1.e97a65dfc9794p-44}, - {-0x1.136870293bp-2, 0x1.d3e8499d67123p-44}, - {-0x1.1058bf9ae5p-2, 0x1.4ab9d817d52cdp-44}, - {-0x1.0d46b579abp-2, -0x1.d2c81f640e1e6p-44}, - {-0x1.0a324e2739p-2, -0x1.c6bee7ef4030ep-47}, - {-0x1.08a73667c5p-2, -0x1.ebc1d40c5a329p-44}, - {-0x1.058f3c703fp-2, 0x1.0e866bcd236adp-44}, - {-0x1.0402594b4dp-2, -0x1.036b89ef42d7fp-48}, - {-0x1.00e6c45ad5p-2, -0x1.cc68d52e01203p-50}, - {-0x1.fb9186d5e4p-3, 0x1.d572aab993c87p-47}, - {-0x1.f871b28956p-3, 0x1.f75fd6a526efep-44}, - {-0x1.f22e5e72f2p-3, 0x1.f454f1417e41fp-44}, - {-0x1.ebe61f4dd8p-3, 0x1.3d45330fdca4dp-45}, - {-0x1.e8c0252aa6p-3, 0x1.6805b80e8e6ffp-45}, - {-0x1.e27076e2bp-3, 0x1.a342c2af0003cp-44}, - {-0x1.dc1bca0abep-3, -0x1.8fac1a628ccc6p-44}, - {-0x1.d8ef91af32p-3, 0x1.5105fc364c784p-46}, - {-0x1.d293581b6cp-3, 0x1.83270128aaa5fp-44}, - {-0x1.cf6354e09cp-3, -0x1.771239a07d55bp-45}, - {-0x1.c8ff7c79aap-3, 0x1.7794f689f8434p-45}, - {-0x1.c5cba543aep-3, -0x1.0929decb454fcp-45}, - {-0x1.bf601bb0e4p-3, -0x1.386a947c378b5p-45}, - {-0x1.bc286742d8p-3, -0x1.9ac53f39d121cp-44}, - {-0x1.b5b519e8fcp-3, 0x1.4b722ec011f31p-44}, - {-0x1.af3c94e80cp-3, 0x1.a4e633fcd9066p-52}, - {-0x1.abfe5ae462p-3, 0x1.b68f5395f139dp-44}, - {-0x1.a57df28244p-3, -0x1.b99c8ca1d9abbp-44}, - {-0x1.a23bc1fe2cp-3, 0x1.539cd91dc9f0bp-44}, - {-0x1.9bb362e7ep-3, 0x1.1f2a8a1ce0ffcp-45}, - {-0x1.986d322818p-3, -0x1.93b564dd44p-48}, - {-0x1.91dcc8c34p-3, -0x1.7bc6abddeff46p-44}, - {-0x1.8e928de886p-3, -0x1.a8154b13d72d5p-44}, - {-0x1.87fa06520cp-3, -0x1.22120401202fcp-44}, - {-0x1.84abb75866p-3, 0x1.d8daadf4e2bd2p-44}, - {-0x1.815c0a1436p-3, 0x1.02a52f9201ce8p-44}, - {-0x1.7ab890210ep-3, 0x1.bdb9072534a58p-45}, - {-0x1.7764c128f2p-3, -0x1.274903479e3d1p-47}, - {-0x1.70b8f97a1ap-3, -0x1.4ea64f6a95befp-44}, - {-0x1.6d60fe719ep-3, 0x1.bc6e557134767p-44}, - {-0x1.66acd4272ap-3, -0x1.aa1bdbfc6c785p-44}, - {-0x1.6350a28aaap-3, -0x1.d5ec0ab8163afp-45}, - {-0x1.5ff3070a7ap-3, 0x1.8586f183bebf2p-44}, - {-0x1.59338d9982p-3, -0x1.0ba68b7555d4ap-48}, - {-0x1.55d1ad4232p-3, -0x1.add94dda647e8p-44}, - {-0x1.4f099f4a24p-3, 0x1.e9bf2fafeaf27p-44}, - {-0x1.4ba36f39a6p-3, 0x1.4354bb3f219e5p-44}, - {-0x1.483bccce6ep-3, -0x1.eea52723f6369p-46}, - {-0x1.41682bf728p-3, 0x1.10047081f849dp-45}, - {-0x1.3dfc2b0eccp-3, -0x1.8a72a62b8c13fp-45}, - {-0x1.371fc201e8p-3, -0x1.ee8779b2d8abcp-44}, - {-0x1.33af57577p-3, -0x1.c9ecca2fe72a5p-44}, - {-0x1.303d718e48p-3, 0x1.680b5ce3ecb05p-50}, - {-0x1.29552f82p-3, 0x1.5b967f4471dfcp-44}, - {-0x1.25ded0abc6p-3, -0x1.5a3854f176449p-44}, - {-0x1.2266f190a6p-3, 0x1.4d20ab840e7f6p-45}, - {-0x1.1b72ad52f6p-3, -0x1.e80a41811a396p-45}, - {-0x1.17f6458fcap-3, -0x1.843fad093c8dcp-45}, - {-0x1.1478584674p-3, -0x1.563451027c75p-46}, - {-0x1.0d77e7cd08p-3, -0x1.cb2cd2ee2f482p-44}, - {-0x1.09f561ee72p-3, 0x1.8f3057157d1a8p-45}, - {-0x1.0671512ca6p-3, 0x1.a47579cdc0a3dp-45}, - {-0x1.02ebb42bf4p-3, 0x1.5a8fa5ce00e5dp-46}, - {-0x1.f7b79fec38p-4, 0x1.10987e897ed01p-47}, - {-0x1.f0a30c0118p-4, 0x1.d599e83368e91p-44}, - {-0x1.e98b54967p-4, -0x1.4677489c50e97p-44}, - {-0x1.e27076e2bp-4, 0x1.a342c2af0003cp-45}, - {-0x1.d4313d66ccp-4, 0x1.9454379135713p-45}, - {-0x1.cd0cdbf8cp-4, -0x1.3e14db50dd743p-44}, - {-0x1.c5e548f5bcp-4, -0x1.d0c57585fbe06p-46}, - {-0x1.b78c82bb1p-4, 0x1.25ef7bc3987e7p-44}, - {-0x1.b05b49bee4p-4, -0x1.ff22c18f84a5ep-47}, - {-0x1.a926d3a4acp-4, -0x1.563650bd22a9cp-44}, - {-0x1.a1ef1d806p-4, -0x1.cd4176df97bcbp-44}, - {-0x1.9ab4246204p-4, 0x1.8a64826787061p-45}, - {-0x1.8c345d6318p-4, -0x1.b20f5acb42a66p-44}, - {-0x1.84ef898e84p-4, 0x1.7d5cd246977c9p-44}, - {-0x1.7da766d7bp-4, -0x1.2cc844480c89bp-44}, - {-0x1.765bf23a6cp-4, 0x1.ecbc035c4256ap-48}, - {-0x1.6f0d28ae58p-4, 0x1.4b4641b664613p-44}, - {-0x1.60658a9374p-4, -0x1.0c3b1dee9c4f8p-44}, - {-0x1.590cafdfp-4, -0x1.c284f5722abaap-44}, - {-0x1.51b073f06p-4, -0x1.83f69278e686ap-44}, - {-0x1.4a50d3aa1cp-4, 0x1.f7fe1308973e2p-45}, - {-0x1.42edcbea64p-4, -0x1.bc0eeea7c9acdp-46}, - {-0x1.341d7961bcp-4, -0x1.1d0929983761p-44}, - {-0x1.2cb0283f5cp-4, -0x1.e1ee2ca657021p-44}, - {-0x1.253f62f0ap-4, -0x1.416f8fb69a701p-44}, - {-0x1.1dcb263dbp-4, -0x1.9444f5e9e8981p-44}, - {-0x1.16536eea38p-4, 0x1.47c5e768fa309p-46}, - {-0x1.0ed839b554p-4, 0x1.901f46d48abb4p-44}, - {-0x1.075983599p-4, 0x1.b8ecfe4b59987p-44}, - {-0x1.f0a30c0118p-5, 0x1.d599e83368e91p-45}, - {-0x1.e19070c278p-5, 0x1.fea4664629e86p-45}, - {-0x1.d276b8adbp-5, -0x1.6a423c78a64bp-46}, - {-0x1.c355dd092p-5, -0x1.f2ccc9abf8388p-45}, - {-0x1.b42dd71198p-5, 0x1.c827ae5d6704cp-46}, - {-0x1.a4fe9ffa4p-5, 0x1.6e584a0402925p-44}, - {-0x1.95c830ec9p-5, 0x1.c148297c5feb8p-45}, - {-0x1.868a83084p-5, 0x1.2623a134ac693p-46}, - {-0x1.77458f633p-5, 0x1.181dce586af09p-44}, - {-0x1.58a5bafc9p-5, 0x1.b2b739570ad39p-45}, - {-0x1.494acc34d8p-5, -0x1.11c78a56fd247p-45}, - {-0x1.39e87b9fe8p-5, -0x1.eafd480ad9015p-44}, - {-0x1.2a7ec2215p-5, 0x1.78ce77a9163fep-45}, - {-0x1.1b0d98924p-5, 0x1.3401e9ae889bbp-44}, - {-0x1.0b94f7c198p-5, 0x1.e89896f022783p-45}, - {-0x1.f829b0e78p-6, -0x1.980267c7e09e4p-45}, - {-0x1.d91a66c54p-6, -0x1.e61f1658cfb9ap-45}, - {-0x1.b9fc027bp-6, 0x1.b9a010ae6922ap-44}, - {-0x1.9ace7551dp-6, 0x1.d75d97ec7c41p-45}, - {-0x1.7b91b07d6p-6, 0x1.3b955b602ace4p-44}, - {-0x1.5c45a51b9p-6, 0x1.63bb6216d87d8p-45}, - {-0x1.3cea44347p-6, 0x1.6a2c432d6a40bp-44}, - {-0x1.1d7f7eb9fp-6, 0x1.4193a83fcc7a6p-46}, - {-0x1.fc0a8b0fcp-7, -0x1.f1e7cf6d3a69cp-50}, - {-0x1.bcf712c74p-7, -0x1.c25e097bd9771p-46}, - {-0x1.7dc475f82p-7, 0x1.eb1245b5da1f5p-44}, - {-0x1.3e7295d26p-7, 0x1.609c1ff29a114p-45}, - {-0x1.fe02a6b1p-8, -0x1.9e23f0dda40e4p-46}, - {-0x1.7ee11ebd8p-8, -0x1.749d3c2d23a07p-47}, - {-0x1.ff00aa2bp-9, -0x1.0bc04a086b56ap-45}, - {-0x1.ff802a9bp-10, 0x1.3bc661d61c5ebp-44}, - {0x1.00200556p-10, 0x1.56224cd5f35f8p-44}, - {0x1.809048288p-9, 0x1.85c0696a70c0cp-45}, - {0x1.40c8a7478p-8, 0x1.e3871df070002p-46}, - {0x1.c189cbb1p-8, -0x1.d80551258856p-44}, - {0x1.2145e939ep-7, 0x1.e3d1238c4eap-44}, - {0x1.61e77e8b6p-7, -0x1.8073eeaf8eaf3p-44}, - {0x1.a2a9c6c18p-7, -0x1.f73bc4d6d3472p-44}, - {0x1.e38ce3034p-7, -0x1.9de88a3da281ap-44}, - {0x1.12487a55p-6, 0x1.fdbe5fed4b393p-44}, - {0x1.32db0ea13p-6, 0x1.710cb130895fcp-45}, - {0x1.537e3f45fp-6, 0x1.ab259d2d7f253p-45}, - {0x1.63d617869p-6, 0x1.7abf389596542p-47}, - {0x1.8492528c9p-6, -0x1.aa0ba325a0c34p-45}, - {0x1.a55f548c6p-6, -0x1.de0709f2d03c9p-45}, - {0x1.c63d2ec15p-6, -0x1.5439ce030a687p-44}, - {0x1.e72bf2814p-6, -0x1.8d75149774d47p-45}, - {0x1.0415d89e78p-5, -0x1.dddc7f461c516p-44}, - {0x1.149e3e4008p-5, -0x1.2b98a9a4168fdp-44}, - {0x1.252f32f8dp-5, 0x1.83e9ae021b67bp-45}, - {0x1.35c8bfaa1p-5, 0x1.8357d5ef9eb35p-44}, - {0x1.3e18c1ca08p-5, 0x1.748ed3f6e378ep-44}, - {0x1.4ebf4334ap-5, -0x1.d9150f73be773p-45}, - {0x1.5f6e73079p-5, -0x1.0485a8012494cp-45}, - {0x1.70265a551p-5, -0x1.888df11fd5ce7p-45}, - {0x1.80e7023d9p-5, -0x1.99dc16f28bf45p-44}, - {0x1.91b073efd8p-5, -0x1.9d7c53f76ca96p-46}, - {0x1.9a187b574p-5, -0x1.0c22e4ec4d90dp-44}, - {0x1.aaef2d0fbp-5, 0x1.0fc1a353bb42ep-45}, - {0x1.bbcebfc69p-5, -0x1.7bf868c317c2ap-46}, - {0x1.ccb73cddd8p-5, 0x1.965c36e09f5fep-44}, - {0x1.dda8adc68p-5, -0x1.1b1ac64d9e42fp-45}, - {0x1.e624c4a0b8p-5, -0x1.0f25c74676689p-44}, - {0x1.f723b518p-5, -0x1.d6eb0dd5610d3p-44}, - {0x1.0415d89e74p-4, 0x1.111c05cf1d753p-46}, - {0x1.0c9e615ac4p-4, 0x1.c2da80974d976p-45}, - {0x1.10e45b3cbp-4, -0x1.7cf69284a3465p-44}, - {0x1.1973bd1464p-4, 0x1.566d154f930b3p-44}, - {0x1.2207b5c784p-4, 0x1.49d8cfc10c7bfp-44}, - {0x1.2aa04a447p-4, 0x1.7a48ba8b1cb41p-44}, - {0x1.2eee507b4p-4, 0x1.8081edd77c86p-47}, - {0x1.378dd7f748p-4, 0x1.7141128f1facap-44}, - {0x1.403207b414p-4, 0x1.6fd84aa8157cp-45}, - {0x1.4485e03dbcp-4, 0x1.fad46e8d26ab7p-44}, - {0x1.4d3115d208p-4, -0x1.53a2582f4e1efp-48}, - {0x1.55e10050ep-4, 0x1.c1d740c53c72ep-47}, - {0x1.5e95a4d978p-4, 0x1.1cb7ce1d17171p-44}, - {0x1.62f1be7d78p-4, -0x1.179957ed63c4ep-45}, - {0x1.6bad83c188p-4, 0x1.daf3cc08926aep-47}, - {0x1.746e100228p-4, -0x1.126d16e1e21d2p-44}, - {0x1.78d02263d8p-4, 0x1.69b5794b69fb7p-47}, - {0x1.8197e2f41p-4, -0x1.c0fe460d20041p-44}, - {0x1.8a6477a91cp-4, 0x1.c28c0af9bd6dfp-44}, - {0x1.8ecc933aecp-4, -0x1.22f39be67f7aap-45}, - {0x1.97a07024ccp-4, -0x1.8bcc1732093cep-48}, - {0x1.a0792e9278p-4, -0x1.a9ce6c9ad51bfp-47}, - {0x1.a4e7640b1cp-4, -0x1.e42b6b94407c8p-47}, - {0x1.adc77ee5bp-4, -0x1.573b209c31904p-44}, - {0x1.b23965a53p-4, -0x1.ff64eea137079p-49}, - {0x1.bb20e936d8p-4, -0x1.68ba835459b8ep-44}, - {0x1.c40d6425a4p-4, 0x1.cb1121d1930ddp-44}, - {0x1.c885801bc4p-4, 0x1.646d1c65aacd3p-45}, - {0x1.d179788218p-4, 0x1.36433b5efbeedp-44}, - {0x1.d5f556592p-4, 0x1.0e239cc185469p-44}, - {0x1.def0d8d468p-4, -0x1.24750412e9a74p-44}, - {0x1.e7f1691a34p-4, -0x1.2c1c59bc77bfap-44}, - {0x1.ec739830ap-4, 0x1.11fcba80cdd1p-44}, - {0x1.f57bc7d9p-4, 0x1.76a6c9ea8b04ep-46}, - {0x1.fa01c9db58p-4, -0x1.8f351fa48a73p-47}, - {0x1.0188d2ecf6p-3, 0x1.3f9651cff9dfep-47}, - {0x1.03cdc0a51ep-3, 0x1.81a9cf169fc5cp-44}, - {0x1.08598b59e4p-3, -0x1.7e5dd7009902cp-45}, - {0x1.0aa0691268p-3, -0x1.45519d7032129p-44}, - {0x1.0f301717dp-3, -0x1.e09b441ae86c5p-44}, - {0x1.13c2605c3ap-3, -0x1.cf5fdd94f6509p-45}, - {0x1.160c8024b2p-3, 0x1.ec2d2a9009e3dp-45}, - {0x1.1aa2b7e24p-3, -0x1.1ac38dde3b366p-44}, - {0x1.1ceed09854p-3, -0x1.15c1c39192af9p-44}, - {0x1.2188fd9808p-3, -0x1.b3a1e7f50c701p-44}, - {0x1.23d712a49cp-3, 0x1.00d238fd3df5cp-46}, - {0x1.28753bc11ap-3, 0x1.7494e359302e6p-44}, - {0x1.2ac55095f6p-3, -0x1.d3466d0c6c8a8p-46}, - {0x1.2f677cbbcp-3, 0x1.52b302160f40dp-44}, - {0x1.31b994d3a4p-3, 0x1.f098ee3a5081p-44}, - {0x1.365fcb015ap-3, -0x1.fd3a0afb9691bp-44}, - {0x1.38b3e9e028p-3, -0x1.70ef0545c17f9p-44}, - {0x1.3d5e3126bcp-3, 0x1.3fb2f85096c4bp-46}, - {0x1.3fb45a5992p-3, 0x1.19713c0cae559p-44}, - {0x1.420b32741p-3, -0x1.16282c85a0884p-46}, - {0x1.46baf0f9f6p-3, -0x1.249cd0790841ap-46}, - {0x1.4913d8333cp-3, -0x1.53e43558124c4p-44}, - {0x1.4dc7b897bcp-3, 0x1.c79b60ae1ff0fp-47}, - {0x1.5022b292f6p-3, 0x1.48a05ff36a25bp-44}, - {0x1.54dabc261p-3, 0x1.746fee5c8d0d8p-45}, - {0x1.5737cc9018p-3, 0x1.9baa7a6b887f6p-44}, - {0x1.5bf406b544p-3, -0x1.27023eb68981cp-46}, - {0x1.5e533144c2p-3, -0x1.1ce0bf3b290eap-44}, - {0x1.60b3100b0ap-3, -0x1.71456c988f814p-44}, - {0x1.6574ebe8c2p-3, -0x1.98c1d34f0f462p-44}, - {0x1.67d6e9d786p-3, -0x1.11e8830a706d3p-44}, - {0x1.6c9d07d204p-3, -0x1.c73fafd9b2dcap-50}, - {0x1.6f0128b756p-3, 0x1.577390d31ef0fp-44}, - {0x1.716600c914p-3, 0x1.51b157cec3838p-49}, - {0x1.7631d82936p-3, -0x1.5e77dc7c5f3e1p-45}, - {0x1.7898d85444p-3, 0x1.8e67be3dbaf3fp-44}, - {0x1.7d6903caf6p-3, -0x1.4c06b17c301d7p-45}, - {0x1.7fd22ff59ap-3, -0x1.58bebf457b7d2p-46}, - {0x1.823c16551ap-3, 0x1.e0ddb9a631e83p-46}, - {0x1.871213750ep-3, 0x1.328eb42f9af75p-44}, - {0x1.897e2b17b2p-3, -0x1.96b37380cbe9ep-45}, - {0x1.8beafeb39p-3, -0x1.73d54aae92cd1p-47}, - {0x1.90c6db9fccp-3, -0x1.935f57718d7cap-46}, - {0x1.9335e5d594p-3, 0x1.3115c3abd47dap-44}, - {0x1.95a5adcf7p-3, 0x1.7f22858a0ff6fp-47}, - {0x1.9a8778debap-3, 0x1.470fa3efec39p-44}, - {0x1.9cf97cdcep-3, 0x1.d862f10c414e3p-44}, - {0x1.9f6c40708ap-3, -0x1.337d94bcd3f43p-44}, - {0x1.a454082e6ap-3, 0x1.60a77c81f7171p-44}, - {0x1.a6c90d44b8p-3, -0x1.f63b7f037b0c6p-44}, - {0x1.a93ed3c8aep-3, -0x1.8724350562169p-45}, - {0x1.ae2ca6f672p-3, 0x1.7a8d5ae54f55p-44}, - {0x1.b0a4b48fc2p-3, -0x1.2e72d5c3998edp-45}, - {0x1.b31d8575bcp-3, 0x1.c794e562a63cbp-44}, - {0x1.b811730b82p-3, 0x1.e90683b9cd768p-46}, - {0x1.ba8c90ae4ap-3, 0x1.a32e7f44432dap-44}, - {0x1.bd087383bep-3, -0x1.d4bc4595412b6p-45}, - {0x1.c2028ab18p-3, -0x1.92e0ee55c7ac6p-45}, - {0x1.c480c0005cp-3, 0x1.9a294d5e44e76p-44}, - {0x1.c6ffbc6fp-3, 0x1.ee138d3a69d43p-44}, - {0x1.c97f8079d4p-3, 0x1.3b161a8c6e6c5p-45}, - {0x1.ce816157f2p-3, -0x1.9e0aba2099515p-45}, - {0x1.d1037f2656p-3, -0x1.84a7e75b6f6e4p-47}, - {0x1.d38666872p-3, -0x1.73650b38932bcp-44}, - {0x1.d88e93fb3p-3, -0x1.75f280234bf51p-44}, - {0x1.db13db0d48p-3, 0x1.2806a847527e6p-44}, - {0x1.dd99edaf6ep-3, -0x1.02ec669c756ebp-44}, - {0x1.e020cc6236p-3, -0x1.52b00adb91424p-45}, - {0x1.e530effe72p-3, -0x1.fdbdbb13f7c18p-44}, - {0x1.e7ba35eb78p-3, -0x1.d5eee23793649p-47}, - {0x1.ea4449f04ap-3, 0x1.5e91663732a36p-44}, - {0x1.eccf2c8feap-3, -0x1.bec63a3e7564p-44}, - {0x1.ef5ade4ddp-3, -0x1.a211565bb8e11p-51}, - {0x1.f474b134ep-3, -0x1.bae49f1df7b5ep-44}, - {0x1.f702d36778p-3, -0x1.0819516673e23p-46}, - {0x1.f991c6cb3cp-3, -0x1.90d04cd7cc834p-44}, - {0x1.fc218be62p-3, 0x1.4bba46f1cf6ap-44}, - {0x1.00a1c6addap-2, 0x1.1cd8d688b9e18p-44}, - {0x1.01eae5626cp-2, 0x1.a43dcfade85aep-44}, - {0x1.03346e0106p-2, 0x1.89ff8a966395cp-48}, - {0x1.047e60cde8p-2, 0x1.dbdf10d397f3cp-45}, - {0x1.05c8be0d96p-2, 0x1.ad0f1c77ccb58p-45}, - {0x1.085eb8f8aep-2, 0x1.e5d513f45fe7bp-44}, - {0x1.09aa572e6cp-2, 0x1.b50a1e1734342p-44}, - {0x1.0af660eb9ep-2, 0x1.3c7c3f528d80ap-45}, - {0x1.0c42d67616p-2, 0x1.7188b163ceae9p-45}, - {0x1.0d8fb813ebp-2, 0x1.ee8c88753fa35p-46}, - {0x1.102ac0a35dp-2, -0x1.f1fbddfdfd686p-45}, - {0x1.1178e8227ep-2, 0x1.1ef78ce2d07f2p-44}, - {0x1.12c77cd007p-2, 0x1.3b2948a11f797p-46}, - {0x1.14167ef367p-2, 0x1.e0c07824daaf5p-44}, - {0x1.1565eed456p-2, -0x1.e75adfb6aba25p-49}, - {0x1.16b5ccbadp-2, -0x1.23299042d74bfp-44}, - {0x1.1956d3b9bcp-2, 0x1.7d2f73ad1aa14p-45}, - {0x1.1aa7fd638dp-2, 0x1.9f60a9616f7ap-45}, - {0x1.1bf99635a7p-2, -0x1.1ac89575c2125p-44}, - {0x1.1d4b9e796cp-2, 0x1.22a667c42e56dp-45}, - {0x1.1e9e16788ap-2, -0x1.82eaed3c8b65ep-44}, - {0x1.1ff0fe7cf4p-2, 0x1.e9d5b513ff0c1p-44}, - {0x1.214456d0ecp-2, -0x1.caf0428b728a3p-44}, - {0x1.23ec5991ecp-2, -0x1.6dbe448a2e522p-44}, - {0x1.25410494e5p-2, 0x1.b1d7ac0ef77f2p-44}, - {0x1.269621134ep-2, -0x1.1b61f10522625p-44}, - {0x1.27ebaf58d9p-2, -0x1.b198800b4bda7p-45}, - {0x1.2941afb187p-2, -0x1.210c2b730e28bp-44}, - {0x1.2a982269a4p-2, -0x1.2058e557285cfp-45}, - {0x1.2bef07cdc9p-2, 0x1.a9cfa4a5004f4p-45}, - {0x1.2d46602addp-2, -0x1.88d0ddcd54196p-45}, - {0x1.2ff66b04ebp-2, -0x1.8aed2541e6e2ep-44}, - {0x1.314f1e1d36p-2, -0x1.8e27ad3213cb8p-45}, - {0x1.32a8456512p-2, 0x1.4f928139af5d6p-47}, - {0x1.3401e12aedp-2, -0x1.17c73556e291dp-44}, - {0x1.355bf1bd83p-2, -0x1.ba99b8964f0e8p-45}, - {0x1.36b6776be1p-2, 0x1.16ecdb0f177c8p-46}, - {0x1.3811728565p-2, -0x1.a71e493a0702bp-45}, - {0x1.396ce359bcp-2, -0x1.5839c5663663dp-47}, - {0x1.3ac8ca38e6p-2, -0x1.d0befbc02be4ap-45}, - {0x1.3c25277333p-2, 0x1.83b54b606bd5cp-46}, - {0x1.3d81fb5947p-2, -0x1.22c7c2a9d37a4p-45}, - {0x1.3edf463c17p-2, -0x1.f067c297f2c3fp-44}, - {0x1.419b423d5fp-2, -0x1.ce379226de3ecp-44}, - {0x1.42f9f3ff62p-2, 0x1.906440f7d3354p-44}, - {0x1.44591e053ap-2, -0x1.6e95892923d88p-47}, - {0x1.45b8c0a17ep-2, -0x1.d9120e7d0a853p-47}, - {0x1.4718dc271cp-2, 0x1.06c18fb4c14c5p-44}, - {0x1.487970e958p-2, 0x1.dc1b8465cf25fp-44}, - {0x1.49da7f3bccp-2, 0x1.07b334daf4b9ap-44}, - {0x1.4b3c077268p-2, -0x1.65b4681052b9fp-46}, - {0x1.4c9e09e173p-2, -0x1.e20891b0ad8a4p-45}, - {0x1.4e0086dd8cp-2, -0x1.4d692a1e44788p-44}, - {0x1.4f637ebbaap-2, -0x1.fc158cb3124b9p-44}, - {0x1.50c6f1d11cp-2, -0x1.a0e6b7e827c2cp-44}, - {0x1.522ae0738ap-2, 0x1.ebe708164c759p-45}, - {0x1.538f4af8f7p-2, 0x1.7ec02e45547cep-45}, - {0x1.54f431b7bep-2, 0x1.a8954c0910952p-46}, - {0x1.5659950695p-2, 0x1.4c5fd2badc774p-46}, - {0x1.57bf753c8dp-2, 0x1.fadedee5d40efp-46}, - {0x1.5925d2b113p-2, -0x1.69bf5a7a56f34p-44}, - {0x1.5a8cadbbeep-2, -0x1.7c79b0af7ecf8p-48}, - {0x1.5bf406b544p-2, -0x1.27023eb68981cp-45}, - {0x1.5d5bddf596p-2, -0x1.a0b2a08a465dcp-47}, - {0x1.5ec433d5c3p-2, 0x1.6b71a1229d17fp-44}, - {0x1.602d08af09p-2, 0x1.ebe9176df3f65p-46}, - {0x1.61965cdb03p-2, -0x1.f08ad603c488ep-45}, - {0x1.630030b3abp-2, -0x1.db623e731aep-45}, -}; - -/* The following is a degree-7 polynomial generated by Sollya - approximating log(1+x) for |x| < 0.00212097167968735, - with absolute error < 2^-79.592 and relative error < 2^-70.467 - (see file Prel.sollya). - The polynomial is P[0]*x + P[1]*x^2 + ... + P[6]*x^7. - The algorithm assumes that the degree-1 coefficient P[0] is 1, - and the degree-2 coefficient P[1] is -0.5. */ -static const double P[7] = {0x1p0, /* degree 1 */ - -0x1p-1, /* degree 2 */ - 0x1.555555555555p-2, /* degree 3 */ - -0x1.fffffffff572dp-3, /* degree 4 */ - 0x1.999999a2d7868p-3, /* degree 5 */ - -0x1.5555c0d31b08ep-3, /* degree 6 */ - 0x1.2476b9058e396p-3, /* degree 7 */ -}; - -/* The following is a degree-11 polynomial generated by Sollya - approximating log(1+x) for |x| < 0.03125, - with absolute error < 2^-73.441 and relative error < 2^-67.088 - (see file Pabs_a.sollya). - The polynomial is P[0]*x + P[1]*x^2 + ... + P[10]*x^11. - The algorithm assumes that the degree-1 coefficient P[0] is 1 - and the degree-2 coefficient P[1] is -0.5. */ -static const double Pa[11] = {0x1p0, /* degree 1 */ - -0x1p-1, /* degree 2 */ - 0x1.5555555555555p-2, /* degree 3 */ - -0x1.ffffffffffe5fp-3, /* degree 4 */ - 0x1.999999999aa82p-3, /* degree 5 */ - -0x1.555555583a8c8p-3, /* degree 6 */ - 0x1.2492491c359e6p-3, /* degree 7 */ - -0x1.ffffc728edeeap-4, /* degree 8 */ - 0x1.c71c961f3498p-4, /* degree 9 */ - -0x1.9a82ac77c05f4p-4, /* degree 10 */ - 0x1.74b40dd1707d3p-4, /* degree 11 */ -}; - -// Multiply exactly a and b, such that *hi + *lo = a * b. -static inline void a_mul(double *hi, double *lo, double a, double b) { - *hi = a * b; - *lo = __builtin_fma(a, b, -*hi); +static inline double twosum(double xh, double ch, double *l){ + double s = xh + ch, d = s - xh; + *l = (ch - d) + (xh + (d - s)); + return s; } -/* put in h+l a double-double approximation of log(z)-z for - |z| < 0.00212097167968735, with absolute error bounded by 2^-78.25 - (see analyze_p1(-0.00212097167968735,0.00212097167968735) - from accompanying file log1p.sage, which also yields |l| < 2^-69.99) */ -static void -p_1 (double *h, double *l, double z) -{ - double z2h, z2l; - a_mul (&z2h, &z2l, z, z); /* exact: z2h+z2l = z*z */ - double p56 = __builtin_fma (P[6], z, P[5]); - double p34 = __builtin_fma (P[4], z, P[3]); - double ph = __builtin_fma (p56, z2h, p34); - /* ph approximates P[3]+P[4]*z+P[5]*z^2+P[6]*z^3 */ - ph = __builtin_fma (ph, z, P[2]); - /* ph approximates P[2]+P[3]*z+P[4]*z^2+P[5]*z^3+P[6]*z^4 */ - ph *= z2h; - /* ph approximates P[2]*z^2+P[3]*z^3+P[4]*z^4+P[5]*z^5+P[6]*z^6 */ - fast_two_sum (h, l, -0.5 * z2h, ph * z); - *l += -0.5 * z2l; +static inline double fastsum(double xh, double xl, double yh, double yl, double *e){ + double sl, sh = fasttwosum(xh, yh, &sl); + *e = (xl + yl) + sl; + return sh; } -/* put in h+l a double-double approximation of log(z)-z for - |z| < 0.03125, with absolute error bounded by 2^-67.14 - (see analyze_p1a(-0.03125,0.03125) from log1p.sage) */ -static void -p_1a (double *h, double *l, double z) -{ - double z2h, z2l; - a_mul (&z2h, &z2l, z, z); - double z4h = z2h * z2h; - double p910 = __builtin_fma (Pa[10], z, Pa[9]); - double p78 = __builtin_fma (Pa[8], z, Pa[7]); - double p56 = __builtin_fma (Pa[6], z, Pa[5]); - double p34 = __builtin_fma (Pa[4], z, Pa[3]); - double p710 = __builtin_fma (p910, z2h, p78); - double p36 = __builtin_fma (p56, z2h, p34); - double ph = __builtin_fma (p710, z4h, p36); - ph = __builtin_fma (ph, z, Pa[2]); - ph *= z2h; - fast_two_sum (h, l, -0.5 * z2h, ph * z); - *l += -0.5 * z2l; +static inline double sum(double xh, double xl, double ch, double cl, double *l){ + double sl, sh = twosum(xh,ch, &sl); + *l = (xl + cl) + sl; + return sh; } -/* Given 1 <= x < 2, where x = v.f, put in h+l a double-double approximation - of log(2^e*x), with absolute error bounded by 2^-69.99 (details below). -*/ -static void -cr_log_fast (double *h, double *l, int e, d64u64 v) -{ - uint64_t m = 0x10000000000000 + (v.u & 0xfffffffffffff); - /* x = m/2^52 */ - /* if x > sqrt(2), we divide it by 2 to avoid cancellation */ - int c = m >= 0x16a09e667f3bcd; - e += c; /* now -1074 <= e <= 1024 */ - static const double cy[] = {1.0, 0.5}; - static const uint64_t cm[] = {43, 44}; - - int i = m >> cm[c]; - double y = v.f * cy[c]; -#define OFFSET 362 - double r = (_INVERSE - OFFSET)[i]; - double l1 = (_LOG_INV - OFFSET)[i][0]; - double l2 = (_LOG_INV - OFFSET)[i][1]; - double z = __builtin_fma (r, y, -1.0); /* exact */ - /* evaluate P(z), for |z| < 0.00212097167968735 */ - double ph, pl; - p_1 (&ph, &pl, z); - - /* Add e*log(2) to (h,l), where -1074 <= e <= 1023, thus e has at most - 11 bits. log2_h is an integer multiple of 2^-42, so that e*log2_h - is exact. */ - static const double log2_h = 0x1.62e42fefa38p-1, - log2_l = 0x1.ef35793c7673p-45; - /* |log(2) - (h+l)| < 2^-102.01 */ - /* let hh = e * log2_h: hh is an integer multiple of 2^-42, - with |hh| <= 1074*log2_h - = 3274082061039582*2^-42. l1 is also an integer multiple of 2^-42, - with |l1| <= 1524716581803*2^-42. Thus hh+l1 is an integer multiple of - 2^-42, with 2^42*|hh+l1| <= 3275606777621385 < 2^52, thus hh+l1 is exactly - representable. */ - - double ee = e; - fast_two_sum (h, l, __builtin_fma (ee, log2_h, l1), z); - /* here |hh+l1|+|z| <= 3275606777621385*2^-42 + 0.0022 < 745 - thus |h| < 745, and the additional error from the fast_two_sum() call is - bounded by 2^-105*745 < 2^-95.4. */ - /* add ph + pl + l2 to l */ - *l = ph + (*l + (l2 + pl)); - /* here |ph| < 2.26e-6, |l| < ulp(h) = 2^-43, |l2| < 2^-43 and - |pl| < 2^-69.99, thus |l2 + pl| < 2^-42 and |*l + l2 + pl| < 2^-41.99, - and the rounding error on l2 + pl is bounded by 2^-95 (l2 + pl cannot - be > 2^-42), and that on *l + (...) by 2^-94. - Now |ph + (*l + (l2 + pl))| < 2.26e-6 + 2^-41.99 < 2^-18.7, thus the - rounding error on ph + ... is bounded by ulp(2^-18.7) = 2^-71, which - yields a cumulated error bound of 2^-71 + 2^-95 + 2^-94 < 2^-70.99. */ - - *l = __builtin_fma (ee, log2_l, *l); - /* let l_in be the input value of *l, and l_out the output value. - We have |l_in| < 2^-18.7 (from above) - and |e*log2_l| <= 1074*0x1.ef35793c7673p-45 - thus |l_out| < 2^-18.69 and err(l_out) <= ulp(2^-18.69) = 2^-71 */ - - /* The absolute error on h + l is bounded by: - 2^-78.25 from the error in the Sollya polynomial plus the rounding errors - in p_1 (&ph, &pl, z) - 2^-91.94 for the maximal difference |e*(log(2)-(log2_h + log2_l))| - (|e| <= 1074 and |log(2)-(log2_h + log2_l)| < 2^-102.01) - 2^-97 for the maximal difference |l1 + l2 - (-log(r))| - 2^-95.4 from the fast_two_sum call - 2^-70.99 from the *l = ph + (*l + l2) instruction - 2^-71 from the last __builtin_fma call. - This gives an absolute error bounded by < 2^-69.99. - */ +static inline double muldd(double xh, double xl, double ch, double cl, double *l){ + double ahhh = ch*xh; + *l = (cl*xh + ch*xl) + __builtin_fma(ch, xh, -ahhh); + return ahhh; } -static inline void dint_fromd (dint64_t *a, double b); -static void log_2 (dint64_t *r, dint64_t *x); -static inline double dint_tod (dint64_t *a); - -/* accurate path, using Tom Hubrecht's code below */ -static double -cr_log1p_accurate (double x) -{ - dint64_t X, Y, C; - -#define EXCEPTIONS 38 - static const double T[EXCEPTIONS][3] = { - {-0x1.ee5c09701a8e8p-9, -0x1.ef4b4d559442ep-9, -0x1.51a199b84acd9p-110}, - {-0x1.ec50c1d0101dfp-9, -0x1.ed3e0b991b5dbp-9, 0x1.fffffffffffe6p-63}, - {-0x1.e81621738c297p-9, -0x1.e8ff5ad035c59p-9, -0x1.fc08a7d86de44p-112}, - {-0x1.dbd70f17ca7a7p-9, -0x1.dcb4b66956133p-9, -0x1.950be553dfc5dp-111}, - {-0x1.c559493ed3a9p-9, -0x1.c622754f12eecp-9, 0x1.ffffffffffffcp-63}, - {-0x1.bdd3211005ea1p-9, -0x1.be95abf29f07p-9, -0x1.480973c20c31dp-112}, - {-0x1.97ffffffffc9dp-42, -0x1.98000000001b1p-42, -0x1.fffffffffffffp-96}, - {-0x1.4fffffffffdb4p-42, -0x1.5000000000126p-42, 0x1.51a400000058ap-172}, - {-0x1.1fffffffffe5p-42, -0x1.20000000000d8p-42, 0x1.6c8000000052p-173}, - {-0x1.07ffffffffe95p-42, -0x1.08000000000b5p-42, -0x1.fffffffffffffp-96}, - {-0x1.dfffffffffda8p-43, -0x1.e00000000012cp-43, 0x1.5f9000000041fp-174}, - {-0x1.afffffffffe1ap-43, -0x1.b0000000000f3p-43, 0x1.cd520000004dep-175}, - {-0x1.7fffffffffe8p-43, -0x1.80000000000cp-43, 0x1.20000000002b3p-175}, - {-0x1.4fffffffffedap-43, -0x1.5000000000093p-43, 0x1.51a40000002c5p-176}, - {-0x1.1ffffffffff28p-43, -0x1.200000000006cp-43, 0x1.6c8000000029p-177}, - {-0x1.dfffffffffed4p-44, -0x1.e000000000096p-44, 0x1.5f9000000020fp-178}, - {-0x1.affffffffff0dp-44, -0x1.b000000000079p-44, -0x1.fffffffffffffp-98}, - {-0x1.7ffffffffff4p-44, -0x1.800000000006p-44, 0x1.200000000015ap-179}, - {-0x1.4ffffffffff6dp-44, -0x1.5000000000049p-44, -0x1.fffffffffffffp-98}, - {-0x1.1ffffffffff94p-44, -0x1.2000000000036p-44, 0x1.6c80000000148p-181}, - {-0x1.dffffffffff6ap-45, -0x1.e00000000004bp-45, 0x1.5f90000000108p-182}, - {-0x1.7ffffffffffap-45, -0x1.800000000003p-45, 0x1.20000000000adp-183}, - {-0x1.1ffffffffffcap-45, -0x1.200000000001bp-45, 0x1.6c800000000a4p-185}, - {-0x1.dffffffffffb5p-46, -0x1.e000000000025p-46, -0x1.fffffffffffffp-100}, - {-0x1.7ffffffffffdp-46, -0x1.8000000000018p-46, 0x1.2000000000056p-187}, - {-0x1.1ffffffffffe5p-46, -0x1.200000000000dp-46, -0x1.fffffffffffffp-100}, - {-0x1.7ffffffffffe8p-47, -0x1.800000000000cp-47, 0x1.200000000002bp-191}, - {-0x1.7fffffffffff4p-48, -0x1.8000000000006p-48, 0x1.2000000000016p-195}, - {-0x1.7fffffffffffap-49, -0x1.8000000000003p-49, 0x1.2000000000008p-199}, - {-0x1.7fffffffffffdp-50, -0x1.8000000000001p-50, -0x1.fffffffffffffp-104}, - {-0x1.6a09e667f3bccp-52, -0x1.6a09e667f3bcdp-52, -0x1.278c3417a93d7p-159}, - {0x1.8000000000003p-50, 0x1.7ffffffffffffp-50, -0x1.fffffffffffffp-104}, - {0x1.200000000001bp-46, 0x1.1fffffffffff3p-46, -0x1.fffffffffffffp-100}, - {0x1.e00000000004bp-46, 0x1.dffffffffffdbp-46, -0x1.fffffffffffffp-100}, - {0x1.5000000000093p-44, 0x1.4ffffffffffb7p-44, -0x1.fffffffffffffp-98}, - {0x1.b0000000000f3p-44, 0x1.affffffffff87p-44, -0x1.fffffffffffffp-98}, - {0x1.080000000016bp-42, 0x1.07fffffffff4bp-42, -0x1.fffffffffffffp-96}, - {0x1.9800000000363p-42, 0x1.97ffffffffe4fp-42, -0x1.fffffffffffffp-96}, - }; - for (int i = 0; i < EXCEPTIONS; i++) - if (x == T[i][0]) - return T[i][1] + T[i][2]; +static inline double mulddd(double x, double ch, double cl, double *l){ + double ahhh = ch*x; + *l = cl*x + __builtin_fma(ch, x, -ahhh); + return ahhh; +} - /* for x > 0x1.6a5df33e01575p+101, log(x) and log1p(x) round to the same - value */ - if (x > 0x1.6a5df33e01575p+101) - { - dint_fromd (&X, x); - log_2 (&Y, &X); - return dint_tod (&Y); +static inline double polydd(double xh, double xl, int n, const double c[][2], double *l){ + int i = n-1; + double ch = fasttwosum(c[i][0], *l, l), cl = c[i][1] + *l; + while(--i>=0){ + ch = muldd(xh,xl, ch,cl, &cl); + ch = fastsum(c[i][0],c[i][1], ch,cl, &cl); } + *l = cl; + return ch; +} - /* for |x| <= 0.5, we have |log(1+x)-x| < x^2, thus - for |x| <= 2^-54, |log(1+x)-x| < 2^-54*|x| < 1/2 ulp(x) - thus log(1+x) rounds to x or to the adjacent numbers */ - if (-0x1p-53 <= x && x <= 0x1p-53) - { - /* warning: for x subnormal, x^2/2 will underflow */ - if (-0x1p-54 <= x && x <= 0x1p-54) - return __builtin_fma (x, -x, x); - else /* 2^-54 < |x| <= 2^-53 thus 0.5*x will not underflow */ - return __builtin_fma (x, -0.5*x, x); +static inline double polyddd(double x, int n, const double c[][2], double *l){ + int i = n-1; + double ch = fasttwosum(c[i][0], *l, l), cl = c[i][1] + *l; + while(--i>=0){ + ch = mulddd(x, ch,cl, &cl); + ch = fastsum(c[i][0],c[i][1], ch,cl, &cl); } + *l = cl; + return ch; +} - /* (xh,xl) <- 1+x */ - double xh, xl; - if (x > 1.0) - fast_two_sum (&xh, &xl, x, 1.0); - else - /* for small x, fast_two_sum is exact because the exponent difference - between 1 and x does not exceed 53 (we have treated |x| <= 2^-53 - above). */ - fast_two_sum (&xh, &xl, 1.0, x); - - dint_fromd (&X, xh); - log_2 (&Y, &X); +static double __attribute__((noinline)) as_log1p_refine(double, double); - /* if xl=0, we can simply return the accurate path for log(xh) */ - if (xl == 0) - return dint_tod (&Y); +/* + rt[4][16] and ln[4][16][3] are lookup tables for the quadripartite scheme + centered around zero. + -ln(rt[][]) = ln[][][2] + ln[][][1] + ln[][][0] +*/ +static const double rt[4][16] = { + {0x1.6a09e68p+0, 0x1.5ab07ep+0, 0x1.4bfdad8p+0, 0x1.3dea65p+0, + 0x1.306fe08p+0, 0x1.2387a7p+0, 0x1.172b84p+0, 0x1.0b5587p+0, + 0x1p+0, 0x1.ea4afap-1, 0x1.d5818ep-1, 0x1.c199bep-1, + 0x1.ae89f98p-1, 0x1.9c4918p-1, 0x1.8ace54p-1, 0x1.7a1147p-1}, + {0x1.059b0dp+0, 0x1.04e5f7p+0, 0x1.04315e8p+0, 0x1.037d43p+0, + 0x1.02c9a4p+0, 0x1.0216818p+0, 0x1.0163da8p+0, 0x1.00b1af8p+0, + 0x1p+0, 0x1.fe9d968p-1, 0x1.fd3c228p-1, 0x1.fbdba38p-1, + 0x1.fa7c18p-1, 0x1.f91d8p-1, 0x1.f7bfdbp-1, 0x1.f663278p-1}, + {0x1.0058c88p+0, 0x1.004dad8p+0, 0x1.0042938p+0, 0x1.0037798p+0, + 0x1.002c608p+0, 0x1.0021478p+0, 0x1.00162fp+0, 0x1.000b178p+0, + 0x1p+0, 0x1.ffe9d2p-1, 0x1.ffd3a58p-1, 0x1.ffbd798p-1, + 0x1.ffa74e8p-1, 0x1.ff91248p-1, 0x1.ff7afb8p-1, 0x1.ff64d38p-1}, + {0x1.00058b8p+0, 0x1.0004dap+0, 0x1.0004288p+0, 0x1.0003778p+0, + 0x1.0002c6p+0, 0x1.0002148p+0, 0x1.000163p+0, 0x1.0000b18p+0, + 0x1p+0, 0x1.fffe9dp-1, 0x1.fffd3ap-1, 0x1.fffbd78p-1, + 0x1.fffa748p-1, 0x1.fff9118p-1, 0x1.fff7ae8p-1, 0x1.fff64cp-1} +}; - /* |Y-log(XH)| ~ 8e-52 */ +static const double ln[4][16][3] = { + {{0x1.61fa45b636ea2p-95, -0x1.497697cb3134p-45, -0x1.62e43033a8p-2}, + {-0x1.42b671e5e6d5ep-93, 0x1.fc50ee605bd8p-44, -0x1.3687aa721cp-2}, + {0x1.0cc2ea968d329p-95, 0x1.f48666c24eacp-43, -0x1.0a2b247d58p-2}, + {-0x1.963904db0a34ep-93, -0x1.58495e50d36ap-43, -0x1.bb9d3d808p-3}, + {0x1.337e0d9f81652p-95, 0x1.c89a0bede978p-45, -0x1.62e42f0378p-3}, + {-0x1.1bdf53871d50bp-95, 0x1.2d67e8a0c1d7p-42, -0x1.0a2b24a1p-3}, + {-0x1.781dd6fc4053p-98, 0x1.07a22a9e81ed8p-42, -0x1.62e43327cp-4}, + {-0x1.84e4562b8f2f3p-96, -0x1.868afe14895p-43, -0x1.62e435baep-5}, + {0x0p+0, 0x0p+0, 0x0p+0}, + {-0x1.17e3ec05cde7p-96, 0x1.174a19689569p-42, 0x1.62e432b22p-5}, + {-0x1.8067ec2a27738p-95, 0x1.111a4eadf313p-43, 0x1.62e42e4a8p-4}, + {-0x1.60bef06b14405p-93, 0x1.dd4ec4e1d421p-43, 0x1.0a2b233f08p-3}, + {-0x1.b18e160362c24p-94, 0x1.6bd65e8b0b7p-45, 0x1.62e43056cp-3}, + {-0x1.c6ac3f1862a6bp-93, -0x1.0f5aad509ea8p-44, 0x1.bb9d3cbd68p-3}, + {-0x1.dead1a4581acfp-93, -0x1.ac842de00564p-43, 0x1.0a2b244da4p-2}, + {-0x1.96b1f2f60e3e4p-93, 0x1.9cec9a50db228p-42, 0x1.3687aa9b78p-2}}, + {{0x1.dbd93cdc08613p-96, 0x1.96f39c49fa8ap-44, -0x1.62e423dd4p-6}, + {-0x1.3c008f058a015p-94, -0x1.f26429af65b7p-43, -0x1.36879e514p-6}, + {0x1.f96a86136c1d1p-93, -0x1.bfc5afb2bd378p-42, -0x1.0a2b2240cp-6}, + {0x1.3917cea885bep-93, -0x1.421e0c297638p-46, -0x1.bb9d4b288p-7}, + {0x1.f0f1b5d989675p-93, 0x1.92a7506c90a18p-42, -0x1.62e43c12p-7}, + {-0x1.f7f8d6a190051p-93, -0x1.94925ae0e524p-42, -0x1.0a2b41ddp-7}, + {0x1.ccb0919263869p-94, -0x1.0fb337ff2cf28p-42, -0x1.62e41068p-8}, + {0x1.c9a5efe4b7c6cp-93, -0x1.966c27788d1cp-44, -0x1.62e3e4ccp-9}, + {0x0p+0, 0x0p+0, 0x0p+0}, + {-0x1.40288ccae8f0fp-95, -0x1.f3c5ff88d19c8p-42, 0x1.62e462b6p-9}, + {-0x1.f7e788a87135p-94, -0x1.a9610028771cp-43, 0x1.62e44c93p-8}, + {0x1.574cc6d3f577dp-93, 0x1.2a3a1a65aa398p-42, 0x1.0a2b1e33p-7}, + {-0x1.56bb79b254f33p-99, -0x1.4a995b6d9ddcp-44, 0x1.62e4367cp-7}, + {0x1.c4c209ca6783dp-94, -0x1.d7b98ef45911p-43, 0x1.bb9d449a8p-7}, + {0x1.e9731de7f0155p-93, -0x1.de722390bbd6p-43, 0x1.0a2b1f194p-6}, + {0x1.fadc62522444dp-96, -0x1.fd95cb835e38p-45, 0x1.3687ad114p-6}}, + {{-0x1.1f72d2a6a460ep-95, 0x1.a25045c37c33p-43, -0x1.62e4795p-10}, + {0x1.2847e318fd3ffp-93, -0x1.c633239e1cdc8p-42, -0x1.3686e5dcp-10}, + {0x1.63f5750b9d826p-93, -0x1.cb15590f1cd78p-42, -0x1.0a2b6538p-10}, + {-0x1.1382d6395c24cp-94, 0x1.7636a5400e2bp-43, -0x1.bb9bf138p-11}, + {0x1.be4491ec20322p-94, 0x1.d0c5e2c9b6be8p-42, -0x1.62e53e5p-11}, + {-0x1.706f04cc2c9f6p-93, -0x1.f3bc0ce9b9a08p-42, -0x1.0a2ab37p-11}, + {0x1.ab6f41df01d7fp-93, 0x1.a7cbc9a97ba4p-44, -0x1.62e0ap-12}, + {-0x1.67e487663ca3ep-100, -0x1.957976dc5f36p-43, -0x1.62e84fcp-13}, + {0x0p+0, 0x0p+0, 0x0p+0}, + {0x1.9681e48dde135p-93, -0x1.868625640a69p-43, 0x1.62e7bp-13}, + {0x1.a2948cd558655p-93, -0x1.2ee3d96b696ap-42, 0x1.62e35f6p-12}, + {-0x1.cfc26ccf6d0e4p-96, 0x1.53edbcf1165p-46, 0x1.0a2b4b2p-11}, + {0x1.f68d24b9e338dp-93, 0x1.783e334613p-51, 0x1.62e4be1p-11}, + {-0x1.f33369bf7dff1p-95, -0x1.60785f20acb2p-42, 0x1.bb9e085p-11}, + {-0x1.685a35575eff1p-95, -0x1.5a62ec66568p-48, 0x1.0a2b94d4p-10}, + {-0x1.4c4d1abca79bfp-95, 0x1.7ded26dc813p-46, 0x1.368810f8p-10}}, + {{0x1.40676dea39b19p-94, 0x1.25337681fa9p-42, -0x1.62dc284p-14}, + {-0x1.ec76c964ac8d6p-94, -0x1.504032e2ed388p-42, -0x1.367d0ecp-14}, + {0x1.8ecaeb6d9523cp-95, 0x1.c28fde83047ep-44, -0x1.0a1dd6cp-14}, + {-0x1.e4069214576bep-93, 0x1.58f2757976ef8p-42, -0x1.bbbcffp-15}, + {0x1.86146d1f9b91fp-93, -0x1.d4717ca0a323p-42, -0x1.62fe138p-15}, + {0x1.1eb44b07102c5p-93, -0x1.86ffcda25278p-43, -0x1.0a3eebp-15}, + {-0x1.95bbb5fd5a466p-93, 0x1.1ce399729e7bp-43, -0x1.62ff0ap-16}, + {-0x1.79059023f8767p-93, -0x1.dbf1c6a400408p-42, -0x1.62ff84p-17}, + {0x0p+0, 0x0p+0, 0x0p+0}, + {-0x1.b4cb08d6fd48fp-93, -0x1.db0e38e5aaa98p-42, 0x1.63007cp-17}, + {-0x1.0e6a88bfc3838p-93, 0x1.2b1c75580439p-43, 0x1.6300f6p-16}, + {0x1.8074feacfe49dp-94, 0x1.401bb919f14ep-42, 0x1.0a21148p-15}, + {-0x1.f56f5f168db15p-93, -0x1.85d6f6487ce2p-44, 0x1.62e1ecp-15}, + {0x1.9eae7e05a0143p-93, -0x1.af5d58a7c9218p-42, 0x1.bba301p-15}, + {-0x1.a859095999ae3p-94, 0x1.590faa0883bd8p-42, 0x1.0a32298p-14}, + {0x1.4f787e495e5ep-93, -0x1.fbb791220a18p-46, 0x1.3682f14p-14}} +}; - div_dint (&C, xl, xh); - mul_dint (&X, &C, &C); - /* multiply X by -1/2 */ - X.ex -= 1; - X.sgn = 0x1; - /* C <- C - C^2/2 */ - add_dint (&C, &C, &X); - /* |C-log(1+xl/xh)| ~ 2e-64 */ - add_dint (&Y, &Y, &C); +/* + rf[64] and lf[64][2] are lookup tables for the fast path + -ln(rf[][]) = lf[][1] + lf[][0] + values are approximately from 1/sqrt(2) to sqrt(2) +*/ +static const double rf[64] = { + 0x1.6816818p+0, 0x1.642c858p+0, 0x1.605816p+0, 0x1.5c98828p+0, + 0x1.58ed23p+0, 0x1.5555558p+0, 0x1.51d07e8p+0, 0x1.4e5e0a8p+0, + 0x1.4afd6ap+0, 0x1.47ae148p+0, 0x1.446f868p+0, 0x1.4141418p+0, + 0x1.3e22ccp+0, 0x1.3b13b1p+0, 0x1.381381p+0, 0x1.3521cf8p+0, + 0x1.323e348p+0, 0x1.2f684cp+0, 0x1.2c9fb5p+0, 0x1.29e4128p+0, + 0x1.27350b8p+0, 0x1.249249p+0, 0x1.21fb78p+0, 0x1.1f7048p+0, + 0x1.1cf06bp+0, 0x1.1a7b96p+0, 0x1.181181p+0, 0x1.15b1e6p+0, + 0x1.135c81p+0, 0x1.111111p+0, 0x1.0ecf568p+0, 0x1.0c9715p+0, + 0x1.0a68108p+0, 0x1.0842108p+0, 0x1.0624ddp+0, 0x1.041041p+0, + 0x1.020408p+0, 0x1p+0, 0x1.f81f82p-1, 0x1.f07c1fp-1, + 0x1.e9131a8p-1, 0x1.e1e1e2p-1, 0x1.dae6078p-1, 0x1.d41d42p-1, + 0x1.cd85688p-1, 0x1.c71c72p-1, 0x1.c0e07p-1, 0x1.bacf918p-1, + 0x1.b4e81b8p-1, 0x1.af286cp-1, 0x1.a98ef6p-1, 0x1.a41a418p-1, + 0x1.9ec8e98p-1, 0x1.9999998p-1, 0x1.948b1p-1, 0x1.8f9c19p-1, + 0x1.8acb91p-1, 0x1.8618618p-1, 0x1.8181818p-1, 0x1.7d05f4p-1, + 0x1.78a4c8p-1, 0x1.745d178p-1, 0x1.702e06p-1, 0x1.6c16c18p-1 +}; - return dint_tod (&Y); -} +static const double lf[64][2] = { + {-0x1.f2f8281bade6ap-42, -0x1.5d5bde3994p-2}, {0x1.c2843fdd367a4p-42, -0x1.522ae0438cp-2}, + {-0x1.06c10c34c14bp-44, -0x1.4718dc171cp-2}, {0x1.cfa4e853f589p-43, -0x1.3c2526cb34p-2}, + {-0x1.ce3ac179bd856p-42, -0x1.314f1e0534p-2}, {-0x1.b91f82deb8122p-42, -0x1.269621934cp-2}, + {0x1.46bbb83d7163ep-42, -0x1.1bf995a9a8p-2}, {0x1.b842e5a74bdbp-42, -0x1.1178e84a8p-2}, + {-0x1.862715e5bb534p-42, -0x1.071385f4d4p-2}, {-0x1.9bcbcbea0cdf8p-42, -0x1.f991c6eb38p-3}, + {-0x1.01101cb605958p-43, -0x1.e530f1067p-3}, {0x1.0c38c81ad8f06p-42, -0x1.d10380b658p-3}, + {0x1.3aa40992a6d82p-42, -0x1.bd0874c3cp-3}, {0x1.30f68780ae82ep-42, -0x1.a93ed248bp-3}, + {-0x1.7d116989d098p-47, -0x1.95a5ac5f7p-3}, {-0x1.1e0012ba619cap-42, -0x1.823c150518p-3}, + {0x1.54535d5671858p-43, -0x1.6f0127cf58p-3}, {-0x1.ed87db3498128p-42, -0x1.5bf407b54p-3}, + {-0x1.aafde9c9fc39ap-42, -0x1.4913d94338p-3}, {-0x1.015868c234p-43, -0x1.365fca3158p-3}, + {0x1.eff33f502c226p-42, -0x1.23d7126cap-3}, {0x1.b8521e874d358p-43, -0x1.1178e7228p-3}, + {0x1.54d75afe84568p-43, -0x1.fe89129dcp-4}, {-0x1.1a813f3fa7c1ep-42, -0x1.da7278384p-4}, + {-0x1.6c6676f40963ep-42, -0x1.b6ac8afadp-4}, {-0x1.2620b7957a7a6p-42, -0x1.9335e4d59p-4}, + {0x1.f8ffee5598f38p-43, -0x1.700d2f4ebp-4}, {-0x1.fab0f5bf42ca2p-42, -0x1.4d311652p-4}, + {-0x1.7a3e970b1c3a8p-44, -0x1.2aa049247p-4}, {-0x1.d030435fecb5p-43, -0x1.08598a59ep-4}, + {0x1.35084a4fb8ab8p-43, -0x1.ccb7357dep-5}, {0x1.32f36d60b44c4p-43, -0x1.894aa1cap-5}, + {0x1.c1bcce5be811p-45, -0x1.466ae8a2ep-5}, {0x1.777740b18714ap-42, -0x1.0415d81e8p-5}, + {-0x1.955c057693d94p-43, -0x1.8492470c8p-6}, {0x1.4f71addb8bep-43, -0x1.020564894p-6}, + {-0x1.bcda4e198afbp-44, -0x1.01014f588p-7}, {0x1.cp-67, 0x0p+0}, + {-0x1.fe0df75092c5ep-42, 0x1.fc0a891p-7}, {0x1.98036ec7e0a1p-45, 0x1.f829b1e78p-6}, + {0x1.ba010f49e5ffp-42, 0x1.774593832p-5}, {-0x1.3ab13c266d328p-42, 0x1.f0a30a012p-5}, + {-0x1.71798573e45d4p-43, 0x1.341d78b1cp-4}, {0x1.ad32f072669fcp-42, 0x1.6f0d272e5p-4}, + {-0x1.54e391e16ea38p-43, 0x1.a926d434bp-4}, {-0x1.a302bbaf0559p-45, 0x1.e27074e2bp-4}, + {0x1.cb4cd66e31f3p-44, 0x1.0d77e8cd08p-3}, {-0x1.5b7a5bc474128p-44, 0x1.29552e92p-3}, + {-0x1.7062e8135f74p-46, 0x1.44d2b5e4b8p-3}, {0x1.3d4c88fe1f4bp-43, 0x1.5ff3060a78p-3}, + {-0x1.37b70004a6946p-42, 0x1.7ab890411p-3}, {-0x1.4a5885167c1ecp-42, 0x1.9525aa7f48p-3}, + {0x1.ff9d5953004acp-42, 0x1.af3c940008p-3}, {0x1.a21ec41d8219cp-43, 0x1.c8ff7cf9a8p-3}, + {-0x1.a322bf2f02ae8p-44, 0x1.e27075e2bp-3}, {0x1.f1548b8a33616p-42, 0x1.fb9186b5ep-3}, + {0x1.0e36401f7a006p-42, 0x1.0a324e0f38p-2}, {-0x1.9f1fa55382a8ap-42, 0x1.1675cacabcp-2}, + {-0x1.a69763deb096p-44, 0x1.22941fc0f8p-2}, {0x1.d30bc3ac91bdap-42, 0x1.2e8e2bee1p-2}, + {0x1.7a79cf4d73b28p-44, 0x1.3a64c59694p-2}, {0x1.ec345197b22dep-42, 0x1.4618bb81c4p-2}, + {-0x1.f4810a30aeba8p-44, 0x1.51aad7c2ep-2}, {0x1.394d2371c1d1cp-43, 0x1.5d1bdbbd8p-2} +}; -/* given x > -1, put in (h,l) a double-double approximation of log(1+x), - and return a bound err on the maximal absolute error so that: - |h + l - log(1+x)| < err. - We have x = m*2^e with 1 <= m < 2 (m = v.f) and -1074 <= e <= 1023 */ -static double -cr_log1p_fast (double *h, double *l, double x, int e, d64u64 v) -{ - if (e < -5) /* e <= -6 thus |x| < 2^-5 */ - { - double lo; - /* taken the following from the accurate path */ - if (-0x1p-53 <= x && x <= 0x1p-53) - { - if (-0x1p-54 <= x && x <= 0x1p-54) - *h = __builtin_fma (x, -x, x); - else - *h = __builtin_fma (x, -0.5*x, x); - *l = 0; - return 0; +double cr_log1p(double x){ + b64u64_u ix = {.f = x}; + u64 ax = ix.u<<1; + double ln1, ln0, eps; + if(__builtin_expect(ax<0x7f60000000000000ul, 1)){ // |x| < 0.0625 + double x2 = x*x; + if(__builtin_expect(ax<0x7e60000000000000ul, 1)){ // |x| < 0x1p-12 + ln1 = x; + eps = 0x1.6p-64*x; + if(__builtin_expect(ax<0x7d43360000000000ul, 1)){ // |x| < 0x1.19bp-21 + if(ax<0x7940000000000000ul){ // |x| < 0x1p-53 + if(!ax) return x; + return __builtin_fma(__builtin_fabs(x), -0x1p-54, x); + } + static const double c[] = {-0x1.00000000001d1p-1, 0x1.55555555558f7p-2}; + ln0 = x2*(c[0] + x*c[1]); + } else { + static const double c[] = + {-0x1.ffffffffffffdp-2, 0x1.5555555555551p-2, -0x1.000000d5555e1p-2, 0x1.99999b442f73fp-3}; + ln0 = x2*((c[0]+x*c[1])+x2*(c[2]+x*c[3])); + } + } else { + static const double c[] = + {0x1.5555555555555p-2, -0x1p-2, 0x1.9999999999b41p-3, -0x1.555555555583bp-3, + 0x1.24924923f39ep-3, -0x1.fffffffe42e43p-4, 0x1.c71c75511d70bp-4, -0x1.99999de10510fp-4, + 0x1.7457e81b175f6p-4, -0x1.554fb43e54e0fp-4, 0x1.3ed68744f3d18p-4, -0x1.28558ad5a7ac4p-4}; + double x3 = x2*x, x4 = x2*x2, hx = -0.5*x; + ln1 = __builtin_fma(hx,x,x); + ln0 = __builtin_fma(hx,x,x-ln1); + double f = ((c[0]+x*c[1])+x2*(c[2]+x*c[3])) + + x4*(((c[4]+x*c[5])+x2*(c[6]+x*c[7])) + x4*((c[8]+x*c[9])+x2*(c[10]+x*c[11]))); + ln0 += x3*f; + eps = x3*0x1.94p-52; } - p_1a (h, &lo, x); - fast_two_sum (h, l, x, *h); - *l += lo; - /* from analyze_x_plus_p1a(rel=true,Xmax=2^-5.) in the accompanying file - log1p.sage, the relative error is bounded by 2^-61.14 with respect to - h. We use the fact that we don't need the return value err to be - positive, since we add/subtract it in the rounding test. */ - return 0x1.d1p-62 * *h; /* 2^-61.14 < 0x1.d1p-62 */ - } - - /* for x > 0x1.6a5df33e01575p+101, log(x) and log1p(x) round to the same - value */ - if (x > 0x1.6a5df33e01575p+101) - { - cr_log_fast (h, l, e, v); - return 0x1.02p-70; /* error bound from cr_log_fast: 2^-69.99 < 1.02p-70 */ + } else { // |x| >= 0.0625 + static const double c[] = { + -0x1.000000000003dp-1, 0x1.5555555554cf5p-2, -0x1.ffffffeca2939p-3, 0x1.99999a3661724p-3, + -0x1.555d345bfe6fdp-3, 0x1.247b887a6e5edp-3}; + b64u64_u t, dt; + if(__builtin_expect((i64)ix.u<0x4340000000000000l && ix.u<0xbff0000000000000ul, 1)){ + /* 0.0625 < x < 0x1p+53 or -1 < x < -0.0625. In the case 1 < x < 2^53 + the fasttwosum() pre-condition is not fulfilled. But in that case + the 2nd operation z = s - x = s - 1 of fasttwosum() is exact, since + x+y <= 2^53, thus the last operation computes e = (x+y) - s, which is + exact by Sterbenz theorem. */ + t.f = fasttwosum(1.0, x, &dt.f); + } else { + if(__builtin_expect(ix.u<0x4690000000000000ul, 1)){ // x < 0x1p+106 + t.f = x; dt.f = 1; + } else { + if(__builtin_expect(ix.u<0x7ff0000000000000ul, 1)){ // x < 0x1p+1024 + t.f = x; dt.f = 0; + } else { + if(ax>0xffe0000000000000ul) return x; // nan + if(ix.u==0x7ff0000000000000ul) return x; // +inf + if(ix.u==0xbff0000000000000ul) return -1./0.0; // -1 + return 0.0/0.0; // <-1 + } + } + } + i64 j = t.u - 0x3fe6a00000000000l, j1 = (j>>(52-6))&0x3f, je = (j>>52), eoff = je<<52; + b64u64_u rs = {.f = rf[j1]}; + if(__builtin_expect(je<1022, 1)){ + rs.u -= eoff; + } else { + rs.u -= 1021l<<52; + static const double sc[] = {0x1p-1, 0x1p-2, 0x1p-3}; + rs.f *= sc[je-1022]; + } + double dh = rs.f*t.f, dl = __builtin_fma(rs.f,t.f,-dh) + rs.f*dt.f; + double xl, xh = fasttwosum(dh-1.0, dl, &xl), x2 = xh*xh; + xl += x2*((c[0] + xh*c[1]) + x2*((c[2] + xh*c[3]) + x2*(c[4] + xh*c[5]))); + double L1 = 0x1.62e42fefa4p-1*je, L0 = -0x1.8432a1b0e2634p-43*je; + ln1 = lf[j1][1] + L1; + ln0 = lf[j1][0] + L0; + ln1 = fastsum(ln1, ln0, xh, xl, &ln0); + eps = 0x1.ap-65; } - - /* (xh,xl) <- 1+x */ - double xh, xl; - if (x > 1.0) - fast_two_sum (&xh, &xl, x, 1.0); - else - fast_two_sum (&xh, &xl, 1.0, x); - - v.f = xh; - e = (v.u >> 52) - 0x3ff; - v.u = (0x3fful << 52) | (v.u & 0xfffffffffffff); - cr_log_fast (h, l, e, v); - - if (xl == 0) /* x+1 = xh exactly, thus we can call cr_log_fast on xh */ - return 0x1.b6p-69; /* error bound from cr_log */ - - /* now xl is not zero: log(xh+xl) = log(xh) + log(1+xl/xh) */ - double c = xl / xh; /* xh cannot be zero since xl <> 0 */ - /* Since |xl| < ulp(xh), we have |xl| < 2^-52 |xh|, - thus |c| < 2^-52, and since |log(1+x)-x| < x^2 for |x| < 0.5, - we have |log(1+c)-c)| < c^2 < 2^-104. */ - *l += c; - /* Since |l_in| < 2^-18.69 (from the analysis of cr_log_fast, see file - ../log/log.c), and |c| < 2^-52, we have |l| < 2^-18.68, thus the - rounding error in *l += c is bounded by ulp(2^-18.68) = 2^-71. - The total absolute error is thus bounded by: - 0x1.b6p-69 + 2^-104 + 2^-71 < 2^-68.02. */ - - return 0x1.f9p-69; /* 2^-68.02 < 0x1.f9p-69 */ + double lb = ln1 + (ln0 - eps), ub = ln1 + (ln0 + eps); + if(__builtin_expect(lb != ub, 0)) return as_log1p_refine(x, lb); + return lb; } -double -cr_log1p (double x) -{ - d64u64 v = {.f = x}; - int e = ((v.u >> 52) & 0x7ff) - 0x3ff; - if (__builtin_expect (e == 0x400 || x == 0 || x <= -1.0, 0)) - /* case NaN/Inf, +/-0 or x <= -1 */ - { - if (x <= -1.0) /* we use the fact that NaN < -1 is false */ - { - /* log1p(x<-1) is NaN, log1p(-1) is -Inf and raises DivByZero */ - if (x < -1.0) - return 0.0 / 0.0; +static double __attribute__((noinline)) as_log1p_refine(double x, double a){ + static const double cz[][2] = { + {0x1.5555555555555p-2, 0x1.5555555555556p-56}, {-0x1p-2, 0x1.25558eff3c1efp-86}, + {0x1.999999999999ap-3, -0x1.999999a91d6cap-57}, {-0x1.5555555555555p-3, -0x1.588aab185593ap-57}, + {0x1.2492492492492p-3, 0x1.28c490abc528fp-57} + }; + static const double czl[] = { + -0x1.fffffffffc555p-4, 0x1.c71c71c7185aap-4, -0x1.9999d44449a31p-4, 0x1.745d51f1817c7p-4 + }; + static const double cy[][2] = { + {1,0}, {-0.5, 0}, + {0x1.5555555555555p-2, 0x1.5555555555555p-56}, {-0x1p-2, -0x1.80007ed9858b7p-107}, + {0x1.999999999999ap-3, -0x1.9999999999991p-57} + }; + static const double cl[4] = { + -0x1.5555555555555p-3, 0x1.2492492492492p-3, -0x1.0000000073334p-3, 0x1.c71c71c802f68p-4 + }; + b64u64_u ix = {.f = x}; + double ln22, ln21, ln20; + u64 ax = ix.u<<1; + if(ax<0x7ea0000000000000ul){ + if(ax<0x7940000000000000ul){ + if(!ax) return x; + return __builtin_fma(__builtin_fabs(x), -0x1p-54, x); + } + double x2h = x*x, x2l = __builtin_fma(x,x,-x2h); + double x3l, x3h = mulddd(x,x2h, x2l, &x3l); + double sl = x*((czl[0] + x*czl[1]) + x2h*(czl[2] + x*czl[3])); + double sh = polyddd(x, 5,cz, &sl); + sh = muldd(sh,sl,x3h,x3l, &sl); + x2h *= -0.5; + x2l *= -0.5; + ln22 = x; + ln21 = fastsum(x2h,x2l, sh,sl, &ln20); + } else { + i64 j = __builtin_roundeven(a*0x1.71547652b82fep+16); + i64 i = j + 34952; + int j1 = (i>>12)&0xf, j2 = (i>>8)&0xf, j3 = (i>>4)&0xf, j4 = i&0xf, je = i>>16; + double L[3]; + L[0] = (ln[0][j1][0] + ln[1][j2][0]) + (ln[2][j3][0] + ln[3][j4][0]); + L[1] = (ln[0][j1][1] + ln[1][j2][1]) + (ln[2][j3][1] + ln[3][j4][1]); + L[2] = (ln[0][j1][2] + ln[1][j2][2]) + (ln[2][j3][2] + ln[3][j4][2]); + + b64u64_u t, dt; + if((i64)ix.u<0x4690000000000000l && ix.u<0xbfe0000000000000ul ){ + t.f = twosum(1.0, x, &dt.f); + if(__builtin_expect(!(dt.u<<1), 0)) dt.u = 0; + } else { + if(__builtin_expect((i64)ix.u>=0x4690000000000000l, 0)) + t.f = x; else - return 1.0 / -0.0; + t.f = 1 + x; + dt.u = 0; + } + t.u -= (long)je<<52; + + double t12 = rt[0][j1]*rt[1][j2], t34 = rt[2][j3]*rt[3][j4]; + double th = t12*t34, tl = __builtin_fma(t12,t34,-th); + double dh = th*t.f, dl = __builtin_fma(th,t.f,-dh); + double sh = tl*t.f, sl = __builtin_fma(tl,t.f,-sh); + double xl, xh = fasttwosum(dh-1, dl, &xl); + xh = fastsum(xh, xl, sh, sl, &xl); + if(dt.u){ + dt.u -= (long)je<<52; + double ddh = th*dt.f, ddl = __builtin_fma(th,dt.f,-ddh) + tl*dt.f; + xh = fastsum(xh, xl, ddh, ddl, &xl); + } + sl = xh*((cl[0] + xh*cl[1]) + (xh*xh)*(cl[2] + xh*cl[3])); + sh = polydd(xh,xl, 5,cy, &sl); + sh = muldd(xh,xl, sh,sl, &sl); + if(je){ + ln22 = 0x1.62e42fefa4p-1*je; ln21 = -0x1.8432a1b0e28p-43*je; ln20 = 0x1.cc01f97b57a08p-87*je; + ln22 += L[2]; + ln21 = fastsum(ln21, ln20, L[1], L[0], &ln20); + } else { + ln22 = L[2]; + ln21 = L[1]; + ln20 = L[0]; } - return x; /* +/-0, NaN or +Inf */ + ln21 = sum(ln21, ln20, sh, sl, &ln20); } - /* now x > -1 */ - /* normalize v in [1,2) */ - v.u = (0x3fful << 52) | (v.u & 0xfffffffffffff); - /* now x = m*2^e with 1 <= m < 2 (m = v.f) and -1074 <= e <= 1023 */ - double h, l, err; - err = cr_log1p_fast (&h, &l, x, e, v); - - double left = h + (l - err), right = h + (l + err); - if (left == right) - return left; - return cr_log1p_accurate (x); -} - -/* the following code was copied from Tom Hubrecht's implementation of - correctly rounded pow for CORE-MATH */ - -// Approximation for the second iteration -static inline void p_2(dint64_t *r, dint64_t *z) { - cp_dint(r, &P_2[0]); - - mul_dint(r, z, r); - add_dint(r, &P_2[1], r); - - mul_dint(r, z, r); - add_dint(r, &P_2[2], r); - - mul_dint(r, z, r); - add_dint(r, &P_2[3], r); - - mul_dint(r, z, r); - add_dint(r, &P_2[4], r); - - mul_dint(r, z, r); - add_dint(r, &P_2[5], r); - - mul_dint(r, z, r); - add_dint(r, &P_2[6], r); - - mul_dint(r, z, r); - add_dint(r, &P_2[7], r); - - mul_dint(r, z, r); - add_dint(r, &P_2[8], r); - - mul_dint(r, z, r); - add_dint(r, &P_2[9], r); - - mul_dint(r, z, r); - add_dint(r, &P_2[10], r); - - mul_dint(r, z, r); - add_dint(r, &P_2[11], r); - - mul_dint(r, z, r); - add_dint(r, &P_2[12], r); - - mul_dint(r, z, r); -} - -static void log_2(dint64_t *r, dint64_t *x) { - int64_t E = x->ex; - - // Find the lookup index - uint16_t i = x->hi >> 55; - - if (x->hi > 0xb504f333f9de6484) { - E++; - i = i >> 1; + ln22 = fasttwosum(ln22,ln21, &ln21); + ln21 = fasttwosum(ln21,ln20, &ln20); + + b64u64_u t = {.f = ln21}; + if(__builtin_expect(!(t.u&(~0ul>>12)), 0)){ + b64u64_u w = {.f = ln20}; + if((w.u^t.u)>>63) + t.u--; + else + t.u++; + ln21 = t.f; } - - x->ex = x->ex - E; - - dint64_t z; - mul_dint(&z, x, &_INVERSE_2[i - 128]); - - add_dint(&z, &M_ONE, &z); - - // E·log(2) - mul_dint_2(r, E, &LOG2); - - dint64_t p; - - p_2(&p, &z); - - add_dint(&p, &_LOG_INV_2[i - 128], &p); - - add_dint(r, &p, r); -} - -// Convert a dint64_t value to a double -// assuming the input is not in the subnormal range -static inline double dint_tod(dint64_t *a) { - - f64_u r = {.u = (a->hi >> 11) | (0x3ffl << 52)}; - /* r contains the upper 53 bits of a->hi, 1 <= r < 2 */ - - double rd = 0.0; - /* if round bit is 1, add 2^-53 */ - if ((a->hi >> 10) & 0x1) - rd += 0x1p-53; - - /* if trailing bits after the rounding bit are non zero, add 2^-54 */ - if (a->hi & 0x3ff || a->lo) - rd += 0x1p-54; - - r.u = r.u | a->sgn << 63; - r.f += (a->sgn == 0) ? rd : -rd; - - f64_u e; - - /* For log, the result is always in the normal range, - thus a->ex > -1023. Similarly, we cannot have a->ex > 1023. */ - - e.u = ((a->ex + 1023) & 0x7ff) << 52; - - return r.f * e.f; + return ln22 + ln21; } diff --git a/src/binary64/log1p/log1p.wc b/src/binary64/log1p/log1p.wc index edfd6047..eeed92ee 100644 --- a/src/binary64/log1p/log1p.wc +++ b/src/binary64/log1p/log1p.wc @@ -347435,3 +347435,26 @@ -0x1.f8f27b3d1a9d8p-1 -0x1.f8d47a920aa11p-1 -0x1.f88870883b2ccp-1 +# threshold values +0x1p-4 +0x1.0000000000001p-4 +0x1.fffffffffffffp-5 +0x1p-12 +0x1.0000000000001p-12 +0x1.fffffffffffffp-13 +0x1.19bp-21 +0x1.19b0000000001p-21 +0x1.19affffffffffp-21 +0x1p-53 +0x1.0000000000001p-53 +0x1.fffffffffffffp-54 +0x1p+53 +0x1.0000000000001p+53 +0x1.fffffffffffffp+52 +-0x1p+0 +-0x1.fffffffffffffp-1 +-0x1.0000000000001p+0 +0x1p+106 +0x1.0000000000001p+106 +0x1.fffffffffffffp+105 +0x1.fffffffffffffp+1023 diff --git a/src/binary64/log2p1/check_special.c b/src/binary64/log2p1/check_special.c index 097b3aa8..2bc1345e 100644 --- a/src/binary64/log2p1/check_special.c +++ b/src/binary64/log2p1/check_special.c @@ -62,7 +62,6 @@ static double get_random () { b64u64_u v; - long l; v.u = rand (); v.u |= (uint64_t) rand () << 31; v.u |= (uint64_t) rand () << 62; diff --git a/src/binary64/rsqrt/check_special.c b/src/binary64/rsqrt/check_special.c index 2ec3499a..6aafa2fe 100644 --- a/src/binary64/rsqrt/check_special.c +++ b/src/binary64/rsqrt/check_special.c @@ -93,7 +93,6 @@ static double get_random () { b64u64_u v; - long l; v.u = rand (); v.u |= (uint64_t) rand () << 31; v.u |= (uint64_t) rand () << 62; diff --git a/src/binary64/sin/check_special.c b/src/binary64/sin/check_special.c index 1513ff01..5c268211 100644 --- a/src/binary64/sin/check_special.c +++ b/src/binary64/sin/check_special.c @@ -61,7 +61,6 @@ static double get_random () { b64u64_u v; - long l; v.u = rand (); v.u |= (uint64_t) rand () << 31; v.u |= (uint64_t) rand () << 62; diff --git a/src/binary64/sinh/check_special.c b/src/binary64/sinh/check_special.c index 63a87c85..a0d4a277 100644 --- a/src/binary64/sinh/check_special.c +++ b/src/binary64/sinh/check_special.c @@ -62,7 +62,6 @@ static double get_random () { b64u64_u v; - long l; v.u = rand (); v.u |= (uint64_t) rand () << 31; v.u |= (uint64_t) rand () << 62; diff --git a/src/binary64/sinpi/check_special.c b/src/binary64/sinpi/check_special.c index 88e1336a..d58defae 100644 --- a/src/binary64/sinpi/check_special.c +++ b/src/binary64/sinpi/check_special.c @@ -62,7 +62,6 @@ static double get_random () { b64u64_u v; - long l; v.u = rand (); v.u |= (uint64_t) rand () << 31; v.u |= (uint64_t) rand () << 62; diff --git a/src/binary64/tan/check_special.c b/src/binary64/tan/check_special.c index 510bc41e..346df9f3 100644 --- a/src/binary64/tan/check_special.c +++ b/src/binary64/tan/check_special.c @@ -61,7 +61,6 @@ static double get_random () { b64u64_u v; - long l; v.u = rand (); v.u |= (uint64_t) rand () << 31; v.u |= (uint64_t) rand () << 62; diff --git a/src/binary64/tanh/check_special.c b/src/binary64/tanh/check_special.c index cd41a351..a83cdbdb 100644 --- a/src/binary64/tanh/check_special.c +++ b/src/binary64/tanh/check_special.c @@ -62,7 +62,6 @@ static double get_random () { b64u64_u v; - long l; v.u = rand (); v.u |= (uint64_t) rand () << 31; v.u |= (uint64_t) rand () << 62; diff --git a/src/binary80/exp2/exp2l.c b/src/binary80/exp2/exp2l.c index d4477900..6c7656a4 100644 --- a/src/binary80/exp2/exp2l.c +++ b/src/binary80/exp2/exp2l.c @@ -36,7 +36,11 @@ SOFTWARE. */ #include +#include + +#ifdef __x86_64__ #include +#endif // Warning: clang also defines __GNUC__ #if defined(__GNUC__) && !defined(__clang__) @@ -45,6 +49,16 @@ SOFTWARE. #pragma STDC FENV_ACCESS ON +static inline int get_rounding_mode (void) +{ +#ifdef __x86_64__ + const unsigned flagp = _mm_getcsr (); + return (flagp&(3<<13))>>3; +#else + return fegetround (); +#endif +} + // anonymous structs, see https://port70.net/~nsz/c/c11/n1570.html#6.7.2.1p19 typedef union { long double f; @@ -422,11 +436,13 @@ Pacc (long double *h, long double *l, long double x) /* Assume -16446 < x < -0x1.71547652b82fe176p-65 or 0x1.71547652b82fe176p-64 < x < 16384. - Return H + L approximating 2^x with relative error < 2^-85.803 - or H = L = NaN. + Calculate an approximation of 2^x with relative error < 2^-84.968. + If needmoreaccuracy is set to a non-zero value, returns in x + a correctly rounded approximation to the long double format. */ -static long double fast_path (int *H, long double x){ - unsigned flag = _mm_getcsr(), rm = (flag>>13)&3; +static long double fast_path (int *needmoreaccuracy, long double x){ + // get current rounding mode + const unsigned rm = get_rounding_mode (); b96u96_u v = {.f = x}; // compute k = round(2^15*x) @@ -492,6 +508,8 @@ static long double fast_path (int *H, long double x){ */ b64u64_u th = {.f = h}, tl = {.f = l}; long eh = th.u>>52, el = (tl.u>>52)&0x3ff, de = eh - el; + // the high part is always positive, the low part can be positive or negative + // represent the mantissa of the low part in two's complement format long ml = (tl.u&~(0xfffl<<52))|1l<<52, sgnl = -(tl.u>>63); ml = (ml^sgnl) - sgnl; int64_t mlt; @@ -506,25 +524,31 @@ static long double fast_path (int *H, long double x){ mlt = ml>>sh; ml <<= 64-sh; } + // construct the mantissa of the long double number uint64_t mh = ((th.u<<11)|1l<<63); - long eps = 0x10e*(mh>>30); + /* The relative error is bounded by 2^-84.968 * mh < 0x1.06p-85 * mh. + Since we add it to ml, we have to add 0x1.06p-85 * mh * 2^64 = 0x106p-29 * mh. */ + long eps = 0x106*(mh>>29); mh += mlt; - if(__builtin_expect(!(mh>>63),0)){ + if(__builtin_expect(!(mh>>63),0)){ // the low part is negative and + // can unset the msb so shift the + // number back mh = mh<<1 | (uint64_t)ml>>63; ml <<= 1; e--; eps <<= 1; } - if(rm==0){ + if(rm==FE_TONEAREST){ // round to nearest mh += (uint64_t)ml>>63; ml <<= 1; - } else if(rm==2) { + } else if(rm==FE_UPWARD) { // round to +inf mh += 1; ml = -ml; } - v.m = mh; - v.e = e + 0x3c00 + eh; - *H = (uint64_t)(ml+eps) < (uint64_t)2*eps || e < -16355 || (ml<<1)==0 || mh==0; + v.m = mh; // mantissa + v.e = e + 0x3c00 + eh; // exponent + // rounding test || result is subnormal || cannot round in integer format || integer overflow + *needmoreaccuracy = (uint64_t)(ml+eps) < (uint64_t)2*eps || e < -16355 || (ml<<1)==0 || mh==0; return v.f; } @@ -771,9 +795,9 @@ cr_exp2l (long double x) // now -16446 < x < -0x1.71547652b82fe176p-65 or 0x1.71547652b82fe176p-64 < x < 16384 long double h; - int canround; - h = fast_path (&canround, x); - if(__builtin_expect(!canround, 1)) return h; + int needmoreaccuracy; + h = fast_path (&needmoreaccuracy, x); + if(__builtin_expect(!needmoreaccuracy, 1)) return h; long double l; accurate_path (&h, &l, x); return h + l; diff --git a/src/binary80/exp2/exp2l.wc b/src/binary80/exp2/exp2l.wc index 73b75061..e03c0e37 100644 --- a/src/binary80/exp2/exp2l.wc +++ b/src/binary80/exp2/exp2l.wc @@ -208102,6 +208102,1463 @@ -0x1.0044a9073faf39f2p+14 -0x1.004489fb6d68efd4p+14 -0x1.0044713a680cff38p+14 +-0x1.0044608a3cd5d9dcp+14 +-0x1.00445559799d4p+14 +-0x1.004452d335118cb4p+14 +-0x1.00441d66a5ce59c4p+14 +-0x1.00441b87721eed84p+14 +-0x1.00440115ab4bbef6p+14 +-0x1.0043e7e6c477290cp+14 +-0x1.0043c1c0141b2e58p+14 +-0x1.0043b8689293b564p+14 +-0x1.00438afdacc67cf2p+14 +-0x1.0043817877bac0bcp+14 +-0x1.004382b559e4b3acp+14 +-0x1.00437f9b252811eap+14 +-0x1.004369fa7e3bcd04p+14 +-0x1.004364583b1b8cd6p+14 +-0x1.00436b9515e602eap+14 +-0x1.004356462a498808p+14 +-0x1.00430dbcda4bbee6p+14 +-0x1.00430738d606408cp+14 +-0x1.0042e7fdae9e9ea2p+14 +-0x1.0042a2f683b2774cp+14 +-0x1.0042ac4b51380d72p+14 +-0x1.0042985f31b934dap+14 +-0x1.0042722361a0fd4cp+14 +-0x1.004251bdc220eb02p+14 +-0x1.0042566257a707f8p+14 +-0x1.00424ddc01fc9f78p+14 +-0x1.00424711445acf74p+14 +-0x1.00423e397d47053cp+14 +-0x1.00423af4e371235cp+14 +-0x1.0042324b69f100bp+14 +-0x1.0042105e87c17acp+14 +-0x1.00420a3a3dd8d32cp+14 +-0x1.004201af005de03cp+14 +-0x1.0041fe72ae043d32p+14 +-0x1.0041f9f71e40b078p+14 +-0x1.0041f06a24562f1ap+14 +-0x1.0041b75fc13deb52p+14 +-0x1.0041b706f6885222p+14 +-0x1.0041a31af1d4900cp+14 +-0x1.004198fbe6b67ec6p+14 +-0x1.00419124a895f4cep+14 +-0x1.00415afa9bb1a738p+14 +-0x1.004159b1114c19c8p+14 +-0x1.004135a6870fbc02p+14 +-0x1.0041379dbb37bd16p+14 +-0x1.004120274301f2a4p+14 +-0x1.00412b4317d3b68ap+14 +-0x1.00411f08bf75073p+14 +-0x1.00411450194b08a8p+14 +-0x1.0041030b637b6832p+14 +-0x1.0040f031fe2a10bap+14 +-0x1.0040f748bdff0fcep+14 +-0x1.0040ef3416a42574p+14 +-0x1.0040e1420c5b08acp+14 +-0x1.0040c64e96402feap+14 +-0x1.0040c2405f87bbbap+14 +-0x1.0040b53ada9b8284p+14 +-0x1.0040a9073faf39f2p+14 +-0x1.0040ab8010a4dfd6p+14 +-0x1.004099c466251f7p+14 +-0x1.004089fb6d68efd4p+14 +-0x1.00408437ba06a8aep+14 +-0x1.00405559799d4p+14 +-0x1.00401d66a5ce59c4p+14 +-0x1.003fe7e6c477290cp+14 +-0x1.003fc8c13fe1c07ap+14 +-0x1.003f93844e49619ap+14 +-0x1.003f8afdacc67cf2p+14 +-0x1.003f7f9b252811eap+14 +-0x1.003f69fa7e3bcd04p+14 +-0x1.003f60a36fd64d4p+14 +-0x1.003f6b9515e602eap+14 +-0x1.003f64583b1b8cd6p+14 +-0x1.003f56462a498808p+14 +-0x1.003f4d72ebbc1fa2p+14 +-0x1.003f3fb9dd6d21aap+14 +-0x1.003f370503950256p+14 +-0x1.003f0dbcda4bbee6p+14 +-0x1.003f0738d606408cp+14 +-0x1.003f0d4d1c0f4caap+14 +-0x1.003efa3c4075bf5ep+14 +-0x1.003eb2fc0dfb29dcp+14 +-0x1.003ea2f683b2774cp+14 +-0x1.003ea1e2f7d2fabcp+14 +-0x1.003eac4b51380d72p+14 +-0x1.003e97a4f8ac887p+14 +-0x1.003e7cbd9954d05p+14 +-0x1.003e722361a0fd4cp+14 +-0x1.003e7f4a873a7c94p+14 +-0x1.003e3af4e371235cp+14 +-0x1.003e324b69f100bp+14 +-0x1.003e21bd88b965a8p+14 +-0x1.003e2d97c52c24fcp+14 +-0x1.003e105e87c17acp+14 +-0x1.003e1b05523241d8p+14 +-0x1.003e01af005de03cp+14 +-0x1.003e0c82a87ea764p+14 +-0x1.003dfe72ae043d32p+14 +-0x1.003df9f71e40b078p+14 +-0x1.003df06a24562f1ap+14 +-0x1.003dcc4ec6b97696p+14 +-0x1.003db706f6885222p+14 +-0x1.003da31af1d4900cp+14 +-0x1.003d5afa9bb1a738p+14 +-0x1.003d420e52ca31dcp+14 +-0x1.003d2b4317d3b68ap+14 +-0x1.003d0da24e67937cp+14 +-0x1.003d030b637b6832p+14 +-0x1.003cef3416a42574p+14 +-0x1.003cf748bdff0fcep+14 +-0x1.003ce1420c5b08acp+14 +-0x1.003cc41a6e45d56cp+14 +-0x1.003cc2405f87bbbap+14 +-0x1.003ca6194892b4b8p+14 +-0x1.003c99c466251f7p+14 +-0x1.003c7189f937d132p+14 +-0x1.003c5559799d4p+14 +-0x1.003c554f7373cce2p+14 +-0x1.003c1d66a5ce59c4p+14 +-0x1.003c04b072a6cb32p+14 +-0x1.003bf9fbadccf47p+14 +-0x1.003bf7b97dacc588p+14 +-0x1.003bc8c13fe1c07ap+14 +-0x1.003bb9d82b922edep+14 +-0x1.003ba5f04b961076p+14 +-0x1.003ba1eee33b3562p+14 +-0x1.003b8afdacc67cf2p+14 +-0x1.003b69fa7e3bcd04p+14 +-0x1.003b60a36fd64d4p+14 +-0x1.003b6b4723640934p+14 +-0x1.003b4d72ebbc1fa2p+14 +-0x1.003b4976b8888496p+14 +-0x1.003b1277605698a6p+14 +-0x1.003b0dbcda4bbee6p+14 +-0x1.003acd807ebe9282p+14 +-0x1.003ab2fc0dfb29dcp+14 +-0x1.003ab0ecab0e5c4p+14 +-0x1.003abb8c590815bep+14 +-0x1.003a97a4f8ac887p+14 +-0x1.003a8b25e426b66ep+14 +-0x1.003a722361a0fd4cp+14 +-0x1.003a7d499f72926cp+14 +-0x1.003a6fb5374c658cp+14 +-0x1.003a6898390ba0c2p+14 +-0x1.003a5eafb56a1c68p+14 +-0x1.003a523db7c78a86p+14 +-0x1.003a5d2df77b16dcp+14 +-0x1.003a3af4e371235cp+14 +-0x1.003a324b69f100bp+14 +-0x1.003a105e87c17acp+14 +-0x1.003a138e97b50042p+14 +-0x1.003a01af005de03cp+14 +-0x1.003a0c82a87ea764p+14 +-0x1.0039b361c70794b2p+14 +-0x1.0039756991ed3404p+14 +-0x1.00397e4e84a59f62p+14 +-0x1.00393af5e631c102p+14 +-0x1.00392b4317d3b68ap+14 +-0x1.0038f7b34689a6fap+14 +-0x1.0038fa4f6bdab27ep+14 +-0x1.0038fd42086d8706p+14 +-0x1.0038eebdedde118p+14 +-0x1.0038f8495f0f2838p+14 +-0x1.0038ef3416a42574p+14 +-0x1.0038e1420c5b08acp+14 +-0x1.0038c41a6e45d56cp+14 +-0x1.003899c466251f7p+14 +-0x1.003885737c1fbbcp+14 +-0x1.0038881917a99de4p+14 +-0x1.003863a469fecd1ap+14 +-0x1.00385d9e1cd75472p+14 +-0x1.00385559799d4p+14 +-0x1.0038554f7373cce2p+14 +-0x1.003820518e0cff8cp+14 +-0x1.00381d66a5ce59c4p+14 +-0x1.0037f7b97dacc588p+14 +-0x1.0037e5751bdede86p+14 +-0x1.0037e49516c4ddfap+14 +-0x1.0037d8be6eda95fp+14 +-0x1.0037c3b9aa704cfp+14 +-0x1.0037b7f358eb0afep+14 +-0x1.0037b9d82b922edep+14 +-0x1.0037b542bc8358c8p+14 +-0x1.0037a8b25544045ap+14 +-0x1.0037a5f04b961076p+14 +-0x1.0037a1eee33b3562p+14 +-0x1.00379f2d01b85038p+14 +-0x1.00378afdacc67cf2p+14 +-0x1.003769fa7e3bcd04p+14 +-0x1.003760a36fd64d4p+14 +-0x1.00375459c6315af6p+14 +-0x1.00374976b8888496p+14 +-0x1.00371277605698a6p+14 +-0x1.00370f760564ebf8p+14 +-0x1.0036d69066b18452p+14 +-0x1.0036c167b78ae21ap+14 +-0x1.0036c9489ead7abep+14 +-0x1.0036cd807ebe9282p+14 +-0x1.0036a10353c8e70ep+14 +-0x1.003697a4f8ac887p+14 +-0x1.00366fb5374c658cp+14 +-0x1.003664bdc2bdfcdep+14 +-0x1.00365eafb56a1c68p+14 +-0x1.00365d2df77b16dcp+14 +-0x1.00363af4e371235cp+14 +-0x1.0036322cb5d9d35ap+14 +-0x1.0036324b69f100bp+14 +-0x1.00362885d433757p+14 +-0x1.003611773f1e9fbcp+14 +-0x1.003601af005de03cp+14 +-0x1.0035f50d8be892cep+14 +-0x1.0035e3e6d0d0d60ap+14 +-0x1.0035b361c70794b2p+14 +-0x1.003584c966b26d22p+14 +-0x1.0035756991ed3404p+14 +-0x1.00357e4e84a59f62p+14 +-0x1.00357e0bf0689bb6p+14 +-0x1.0035728628d5ba04p+14 +-0x1.003558cf280fde2ap+14 +-0x1.00353af5e631c102p+14 +-0x1.003531ab9d996a7ap+14 +-0x1.00351cee5df081b4p+14 +-0x1.003514c399543d78p+14 +-0x1.00350ab1c4ee7844p+14 +-0x1.00350cc1c2b4bb26p+14 +-0x1.0034fa4f6bdab27ep+14 +-0x1.0034eebdedde118p+14 +-0x1.0034e2b106bfb61p+14 +-0x1.0034d70e4e4e9c24p+14 +-0x1.0034c429bd778f7cp+14 +-0x1.0034c41a6e45d56cp+14 +-0x1.0034ac58b629ba68p+14 +-0x1.003499c466251f7p+14 +-0x1.0034877fa5d66274p+14 +-0x1.003485737c1fbbcp+14 +-0x1.003483e5b68688bp+14 +-0x1.003485805bc7599ep+14 +-0x1.003465af54b07068p+14 +-0x1.00345d24a7776362p+14 +-0x1.00345ce2e9a6ed9p+14 +-0x1.00345559799d4p+14 +-0x1.0034554f7373cce2p+14 +-0x1.003420518e0cff8cp+14 +-0x1.00341ba0ee22b4bap+14 +-0x1.003405da6b5ff672p+14 +-0x1.0033f5e49998f36ap+14 +-0x1.0033e5751bdede86p+14 +-0x1.0033e3e8126e7e04p+14 +-0x1.0033c3b9aa704cfp+14 +-0x1.0033bef9470fc0fp+14 +-0x1.0033b892cadb220cp+14 +-0x1.0033a8b25544045ap+14 +-0x1.0033a7872e55b47p+14 +-0x1.00339f2d01b85038p+14 +-0x1.00339318c9dc5dfep+14 +-0x1.003369fa7e3bcd04p+14 +-0x1.003360a36fd64d4p+14 +-0x1.00334976b8888496p+14 +-0x1.003347ea1b5f527cp+14 +-0x1.00331cdc144d27bep+14 +-0x1.0032fba53bfb49b2p+14 +-0x1.0032f765f993c212p+14 +-0x1.0032de1373d9a742p+14 +-0x1.0032dd8951f05cp+14 +-0x1.0032d69066b18452p+14 +-0x1.0032c167b78ae21ap+14 +-0x1.0032c593f4de4cdep+14 +-0x1.0032c9489ead7abep+14 +-0x1.0032bfc316773c6ap+14 +-0x1.0032a10353c8e70ep+14 +-0x1.00329a7414ea28b2p+14 +-0x1.003297a4f8ac887p+14 +-0x1.00329f42e75a151p+14 +-0x1.00328baab36aa9e8p+14 +-0x1.003278663f8133dcp+14 +-0x1.00326fb5374c658cp+14 +-0x1.0032690d2485c8c4p+14 +-0x1.00325eafb56a1c68p+14 +-0x1.00323af4e371235cp+14 +-0x1.003233ab0c2c80aep+14 +-0x1.00322885d433757p+14 +-0x1.003211773f1e9fbcp+14 +-0x1.00320bb6122eea38p+14 +-0x1.003205f7f0c9a154p+14 +-0x1.0031756991ed3404p+14 +-0x1.00317e4e84a59f62p+14 +-0x1.0031728628d5ba04p+14 +-0x1.003158cf280fde2ap+14 +-0x1.00313af5e631c102p+14 +-0x1.00313bef4e7b43e6p+14 +-0x1.00313bd0f8859046p+14 +-0x1.00311d5071d592f6p+14 +-0x1.00310ab1c4ee7844p+14 +-0x1.00310cc1c2b4bb26p+14 +-0x1.0030ed3cf0b26a9ep+14 +-0x1.0030d1ec82459e46p+14 +-0x1.0030d70e4e4e9c24p+14 +-0x1.0030c429bd778f7cp+14 +-0x1.0030bced15e077eap+14 +-0x1.0030ac58b629ba68p+14 +-0x1.003092757df6d17cp+14 +-0x1.003099c466251f7p+14 +-0x1.0030877fa5d66274p+14 +-0x1.003085805bc7599ep+14 +-0x1.00306aa7ab8f527p+14 +-0x1.003065af54b07068p+14 +-0x1.00305ce2e9a6ed9p+14 +-0x1.00305559799d4p+14 +-0x1.0030554f7373cce2p+14 +-0x1.003020518e0cff8cp+14 +-0x1.00300dfb5fb4dd84p+14 +-0x1.003005da6b5ff672p+14 +-0x1.002fffe974da2ccp+14 +-0x1.002ff5e49998f36ap+14 +-0x1.002fe5751bdede86p+14 +-0x1.002fd29d64aa60ecp+14 +-0x1.002fc3b9aa704cfp+14 +-0x1.002fbe63a6c39a5p+14 +-0x1.002fb89036f12824p+14 +-0x1.002fb98693f36aa6p+14 +-0x1.002fa8b25544045ap+14 +-0x1.002fa6599e8c849ap+14 +-0x1.002f88244191f5b8p+14 +-0x1.002f7021d6caed14p+14 +-0x1.002f6b69d94134d8p+14 +-0x1.002f51195208b48cp+14 +-0x1.002f4976b8888496p+14 +-0x1.002f47ea1b5f527cp+14 +-0x1.002f46e3fa4b07d6p+14 +-0x1.002f1cdc144d27bep+14 +-0x1.002f14cf59bdfb68p+14 +-0x1.002f03dfefcf9da6p+14 +-0x1.002f04521014bc98p+14 +-0x1.002efdab4fe432f8p+14 +-0x1.002ef765f993c212p+14 +-0x1.002eef8629f3fcf2p+14 +-0x1.002ede1373d9a742p+14 +-0x1.002edd8951f05cp+14 +-0x1.002ec9489ead7abep+14 +-0x1.002ebfc316773c6ap+14 +-0x1.002e9a7414ea28b2p+14 +-0x1.002e935a0bdec73ap+14 +-0x1.002e9f42e75a151p+14 +-0x1.002e8baab36aa9e8p+14 +-0x1.002e78663f8133dcp+14 +-0x1.002e6fb5374c658cp+14 +-0x1.002e6ccf9a483e3cp+14 +-0x1.002e5d39096cda8ap+14 +-0x1.002e33ab0c2c80aep+14 +-0x1.002e23f4bf0b23p+14 +-0x1.002e24590081fa66p+14 +-0x1.002e0a78844f740cp+14 +-0x1.002e0bb6122eea38p+14 +-0x1.002e05f7f0c9a154p+14 +-0x1.002dfe680fae5174p+14 +-0x1.002deeaa6411a1cp+14 +-0x1.002ded270714a574p+14 +-0x1.002de115afa3340cp+14 +-0x1.002ddbce20e3e1b2p+14 +-0x1.002d825ac7ae2272p+14 +-0x1.002d7bbe4d8ee676p+14 +-0x1.002d8981166e1c5p+14 +-0x1.002d756991ed3404p+14 +-0x1.002d58cf280fde2ap+14 +-0x1.002d3bd0f8859046p+14 +-0x1.002d1d5071d592f6p+14 +-0x1.002d0d53a6c81f48p+14 +-0x1.002cff3785532aa4p+14 +-0x1.002ced3cf0b26a9ep+14 +-0x1.002cec1ac7630e72p+14 +-0x1.002cdcbf246f8bf2p+14 +-0x1.002cd8bb26380224p+14 +-0x1.002cd1ec82459e46p+14 +-0x1.002cd70e4e4e9c24p+14 +-0x1.002cc66e2b331cf6p+14 +-0x1.002cc429bd778f7cp+14 +-0x1.002cbced15e077eap+14 +-0x1.002c92757df6d17cp+14 +-0x1.002c961f625f2024p+14 +-0x1.002c99c466251f7p+14 +-0x1.002c85805bc7599ep+14 +-0x1.002c6aaa15afcebcp+14 +-0x1.002c65af54b07068p+14 +-0x1.002c6aa7ab8f527p+14 +-0x1.002c6b0ee032b94ap+14 +-0x1.002c51c7340cd46cp+14 +-0x1.002c410b3d84ea1ap+14 +-0x1.002c3ea4d46d8a3cp+14 +-0x1.002c2a634786cccep+14 +-0x1.002c20518e0cff8cp+14 +-0x1.002c003288c49442p+14 +-0x1.002bed3cfbc3c234p+14 +-0x1.002ba6599e8c849ap+14 +-0x1.002baa93246e73cep+14 +-0x1.002ba60bcc7413dap+14 +-0x1.002b88244191f5b8p+14 +-0x1.002b8384f528a21ep+14 +-0x1.002b51195208b48cp+14 +-0x1.002b477f43ac8cdp+14 +-0x1.002b2433457edec6p+14 +-0x1.002b1cdc144d27bep+14 +-0x1.002b14cf59bdfb68p+14 +-0x1.002b04521014bc98p+14 +-0x1.002afdab4fe432f8p+14 +-0x1.002af765f993c212p+14 +-0x1.002af18a91c6bbb2p+14 +-0x1.002aef8629f3fcf2p+14 +-0x1.002ac820a12c2dcap+14 +-0x1.002ac915fc73b026p+14 +-0x1.002ac9489ead7abep+14 +-0x1.002abbb92468911ep+14 +-0x1.002a9a7414ea28b2p+14 +-0x1.002a935a0bdec73ap+14 +-0x1.002a9f42e75a151p+14 +-0x1.002a93110c6b9e84p+14 +-0x1.002a7e72c2e68886p+14 +-0x1.002a78663f8133dcp+14 +-0x1.002a33ab0c2c80aep+14 +-0x1.002a23f4bf0b23p+14 +-0x1.002a1f5adba55abcp+14 +-0x1.002a0bb6122eea38p+14 +-0x1.002a05f7f0c9a154p+14 +-0x1.0029fe680fae5174p+14 +-0x1.0029e115afa3340cp+14 +-0x1.0029dbce20e3e1b2p+14 +-0x1.0029bbbb420ebb62p+14 +-0x1.0029bf4b41c8981cp+14 +-0x1.0029a6f00e5da3dcp+14 +-0x1.0029825ac7ae2272p+14 +-0x1.00298981166e1c5p+14 +-0x1.00297bbe4d8ee676p+14 +-0x1.00298740502db86cp+14 +-0x1.00297c2161cbb698p+14 +-0x1.002958cf280fde2ap+14 +-0x1.00294cbbe3da2482p+14 +-0x1.0029430bf7e3abf6p+14 +-0x1.00291ef8490c5ee4p+14 +-0x1.0028ff3785532aa4p+14 +-0x1.0028ec1ac7630e72p+14 +-0x1.0028d8bb26380224p+14 +-0x1.0028d1ec82459e46p+14 +-0x1.0028c66e2b331cf6p+14 +-0x1.0028c429bd778f7cp+14 +-0x1.0028bced15e077eap+14 +-0x1.0028961f625f2024p+14 +-0x1.002899c466251f7p+14 +-0x1.002885805bc7599ep+14 +-0x1.002865af54b07068p+14 +-0x1.00286aa7ab8f527p+14 +-0x1.00286ec296481892p+14 +-0x1.002854b41a1a1892p+14 +-0x1.0028410b3d84ea1ap+14 +-0x1.00283ea4d46d8a3cp+14 +-0x1.00282dfeada773bp+14 +-0x1.002826b169d69b1p+14 +-0x1.00282a634786cccep+14 +-0x1.002820518e0cff8cp+14 +-0x1.00281e6afa0f69a8p+14 +-0x1.00280cf369952d6cp+14 +-0x1.0028003288c49442p+14 +-0x1.0027f2ee53ba3e18p+14 +-0x1.0027bdefee1aa2acp+14 +-0x1.0027a6599e8c849ap+14 +-0x1.0027a60bcc7413dap+14 +-0x1.002788244191f5b8p+14 +-0x1.0027477f43ac8cdp+14 +-0x1.0027358fbdc71062p+14 +-0x1.00272433457edec6p+14 +-0x1.0027117e3755e47ap+14 +-0x1.00271472b6674c44p+14 +-0x1.00271cdc144d27bep+14 +-0x1.002714cf59bdfb68p+14 +-0x1.002703e00c8c368cp+14 +-0x1.0026f76aaaa0395cp+14 +-0x1.0026e361154872c8p+14 +-0x1.0026c820a12c2dcap+14 +-0x1.0026bbb92468911ep+14 +-0x1.00269a7414ea28b2p+14 +-0x1.002693110c6b9e84p+14 +-0x1.00267e72c2e68886p+14 +-0x1.002661b4f28ddae6p+14 +-0x1.00264837c45c728ep+14 +-0x1.00264cc49f76c3dep+14 +-0x1.002633ab0c2c80aep+14 +-0x1.002623f4bf0b23p+14 +-0x1.002605f7f0c9a154p+14 +-0x1.0025fe680fae5174p+14 +-0x1.0025f20e8a1778d4p+14 +-0x1.0025e115afa3340cp+14 +-0x1.0025dbce20e3e1b2p+14 +-0x1.0025bbbb420ebb62p+14 +-0x1.0025b9957cdbdf7ep+14 +-0x1.0025a6f00e5da3dcp+14 +-0x1.002588b5fec1213cp+14 +-0x1.0025869f4d7dde2ap+14 +-0x1.0025825ac7ae2272p+14 +-0x1.00258981166e1c5p+14 +-0x1.00257bbe4d8ee676p+14 +-0x1.00258740502db86cp+14 +-0x1.00257c2161cbb698p+14 +-0x1.00256c7bbd9c8a1ap+14 +-0x1.002558cf280fde2ap+14 +-0x1.00254c6ba62e25b6p+14 +-0x1.00254c98dcb0bff6p+14 +-0x1.0025430bf7e3abf6p+14 +-0x1.00254841e63b6d0ap+14 +-0x1.002539ea95965fe2p+14 +-0x1.00251ef8490c5ee4p+14 +-0x1.0024fd5e0aaffa56p+14 +-0x1.0024ec1ac7630e72p+14 +-0x1.0024c66e2b331cf6p+14 +-0x1.0024c429bd778f7cp+14 +-0x1.002480d8e485bef2p+14 +-0x1.002487c79d9236ep+14 +-0x1.00247cb5cfe1edbp+14 +-0x1.002454b41a1a1892p+14 +-0x1.00244e450e62da88p+14 +-0x1.00240cf369952d6cp+14 +-0x1.002406f0fb367212p+14 +-0x1.0023e6f1b356164cp+14 +-0x1.0023e80763bcdb8p+14 +-0x1.0023a6599e8c849ap+14 +-0x1.0023a2d9c47b7f3cp+14 +-0x1.0023a60bcc7413dap+14 +-0x1.002388244191f5b8p+14 +-0x1.00237e818c8f00f2p+14 +-0x1.002361a160b5e0cp+14 +-0x1.00235a5f6f466dfcp+14 +-0x1.0023358fbdc71062p+14 +-0x1.00232cc0462f1dfep+14 +-0x1.0023117e3755e47ap+14 +-0x1.00231cdc144d27bep+14 +-0x1.002314cf59bdfb68p+14 +-0x1.002309e921fefb4ap+14 +-0x1.002303e00c8c368cp+14 +-0x1.0022f76aaaa0395cp+14 +-0x1.0022ecca8f4a362ap+14 +-0x1.0022ea0523a45fb4p+14 +-0x1.0022bbb92468911ep+14 +-0x1.0022bbdec6580796p+14 +-0x1.00229a7414ea28b2p+14 +-0x1.002292c963db62bcp+14 +-0x1.00227e72c2e68886p+14 +-0x1.0022762d710082dap+14 +-0x1.00225b739b7caeep+14 +-0x1.00224837c45c728ep+14 +-0x1.00224cc49f76c3dep+14 +-0x1.002223f4bf0b23p+14 +-0x1.00222d1a7d1dd832p+14 +-0x1.002218b9ec02fb7cp+14 +-0x1.002205f7f0c9a154p+14 +-0x1.002206d808b0cf04p+14 +-0x1.00220c0ec4cd6b9cp+14 +-0x1.0021fe680fae5174p+14 +-0x1.0021e5a72b2dd1f2p+14 +-0x1.0021e115afa3340cp+14 +-0x1.0021d0b1d3980ee6p+14 +-0x1.0021dbce20e3e1b2p+14 +-0x1.00219438df77d7a6p+14 +-0x1.00219f8587821798p+14 +-0x1.002188b5fec1213cp+14 +-0x1.0021825ac7ae2272p+14 +-0x1.002183d3450afe7ap+14 +-0x1.00217bbe4d8ee676p+14 +-0x1.00217c2161cbb698p+14 +-0x1.002178d957dcd1f2p+14 +-0x1.002158cf280fde2ap+14 +-0x1.00214c6ba62e25b6p+14 +-0x1.00214e5644cae0cep+14 +-0x1.00214c98dcb0bff6p+14 +-0x1.00211eb4ce3492dap+14 +-0x1.0020fd5e0aaffa56p+14 +-0x1.0020ec1ac7630e72p+14 +-0x1.0020df79d93bc794p+14 +-0x1.0020c66e2b331cf6p+14 +-0x1.0020c429bd778f7cp+14 +-0x1.0020ba2a9ec907bep+14 +-0x1.0020b3a9e7adfc12p+14 +-0x1.0020b0b01c79dddep+14 +-0x1.0020aab063d48a7cp+14 +-0x1.0020a3b74fe29d36p+14 +-0x1.0020a24b74ca079cp+14 +-0x1.00208de2362dca3ep+14 +-0x1.002087c79d9236ep+14 +-0x1.00207cb5cfe1edbp+14 +-0x1.00204dacfb888f4cp+14 +-0x1.00204c1526237534p+14 +-0x1.00202bfd2c1232fp+14 +-0x1.00202f94136a1432p+14 +-0x1.001ff349f53167ccp+14 +-0x1.001ffd07cac8e508p+14 +-0x1.001fe6f1b356164cp+14 +-0x1.001fe80763bcdb8p+14 +-0x1.001fcb8ae9f2131ep+14 +-0x1.001fb345601bf116p+14 +-0x1.001f96d0b46142b6p+14 +-0x1.001f88244191f5b8p+14 +-0x1.001f60b7fd09d0cep+14 +-0x1.001f61a160b5e0cp+14 +-0x1.001f6a839fc000fcp+14 +-0x1.001f59be877f3fb4p+14 +-0x1.001f5a5f6f466dfcp+14 +-0x1.001f4693e866ad6p+14 +-0x1.001f3476265528c2p+14 +-0x1.001f263ba45a15b8p+14 +-0x1.001f117e3755e47ap+14 +-0x1.001f1cdc144d27bep+14 +-0x1.001f09e921fefb4ap+14 +-0x1.001f0110b1ff1cbp+14 +-0x1.001f02898c4fdf4ep+14 +-0x1.001ee2b36d0f67c4p+14 +-0x1.001eecca8f4a362ap+14 +-0x1.001eea0523a45fb4p+14 +-0x1.001ed603c1a9388ep+14 +-0x1.001ebbb92468911ep+14 +-0x1.001ebae403991c72p+14 +-0x1.001ead5b773ab98ep+14 +-0x1.001e826f84f51b08p+14 +-0x1.001e7fade5865c6ep+14 +-0x1.001e76abaffc0524p+14 +-0x1.001e58b2480005c8p+14 +-0x1.001e4837c45c728ep+14 +-0x1.001e42fb27e26c9p+14 +-0x1.001e4d939fea3efp+14 +-0x1.001e4e06f383c1bep+14 +-0x1.001e21fd55766aa8p+14 +-0x1.001e23f4bf0b23p+14 +-0x1.001e2d1a7d1dd832p+14 +-0x1.001e18b9ec02fb7cp+14 +-0x1.001e0f97696bc6c6p+14 +-0x1.001e0c0ec4cd6b9cp+14 +-0x1.001df33e803e928cp+14 +-0x1.001dfe680fae5174p+14 +-0x1.001de5a72b2dd1f2p+14 +-0x1.001ddca8bfe28ec8p+14 +-0x1.001dd0b1d3980ee6p+14 +-0x1.001dd11f5de40326p+14 +-0x1.001ddbce20e3e1b2p+14 +-0x1.001dc16a8dcdf79ep+14 +-0x1.001d9a33dcce72c8p+14 +-0x1.001d94e063ae9686p+14 +-0x1.001d83d3450afe7ap+14 +-0x1.001d7c2161cbb698p+14 +-0x1.001d78d957dcd1f2p+14 +-0x1.001d75cfa7af70fep+14 +-0x1.001d6c822b6758fp+14 +-0x1.001d58cf280fde2ap+14 +-0x1.001d1eb4ce3492dap+14 +-0x1.001cfd5e0aaffa56p+14 +-0x1.001cdf79d93bc794p+14 +-0x1.001cc429bd778f7cp+14 +-0x1.001cc25eaf896fe8p+14 +-0x1.001cb3a9e7adfc12p+14 +-0x1.001cb6a113caf97cp+14 +-0x1.001caab063d48a7cp+14 +-0x1.001ca35e19e7c9f6p+14 +-0x1.001ca24b74ca079cp+14 +-0x1.001c9c35bc0dac94p+14 +-0x1.001c8de2362dca3ep+14 +-0x1.001c8d535357d7bp+14 +-0x1.001c87c79d9236ep+14 +-0x1.001c71b7c3c7c5eap+14 +-0x1.001c7485af9f4508p+14 +-0x1.001c5b1a82618524p+14 +-0x1.001c4dacfb888f4cp+14 +-0x1.001c4c1526237534p+14 +-0x1.001bf349f53167ccp+14 +-0x1.001bfd07cac8e508p+14 +-0x1.001bcb8ae9f2131ep+14 +-0x1.001bbf5bbb3bbdbcp+14 +-0x1.001b974910b68138p+14 +-0x1.001b807596017d46p+14 +-0x1.001b60b7fd09d0cep+14 +-0x1.001b61a160b5e0cp+14 +-0x1.001b64894c7419p+14 +-0x1.001b4693e866ad6p+14 +-0x1.001b3476265528c2p+14 +-0x1.001b117e3755e47ap+14 +-0x1.001b1ae7c5791206p+14 +-0x1.001b0bf6f05661d4p+14 +-0x1.001b09e921fefb4ap+14 +-0x1.001b08a27bf3f97p+14 +-0x1.001b08d6fbd22d76p+14 +-0x1.001b02898c4fdf4ep+14 +-0x1.001af741958bdec6p+14 +-0x1.001ae2b36d0f67c4p+14 +-0x1.001aecca8f4a362ap+14 +-0x1.001aea0523a45fb4p+14 +-0x1.001acafb7eace2acp+14 +-0x1.001ac0ccd3cdd556p+14 +-0x1.001ab87193b91ffp+14 +-0x1.001abae403991c72p+14 +-0x1.001aba631beaf2e8p+14 +-0x1.001aad5b773ab98ep+14 +-0x1.001a9dba3bbddce4p+14 +-0x1.001a8abd01a02e42p+14 +-0x1.001a58b2480005c8p+14 +-0x1.001a42fb27e26c9p+14 +-0x1.001a4e06f383c1bep+14 +-0x1.001a3b80752d0e38p+14 +-0x1.001a23f4bf0b23p+14 +-0x1.001a20f717760d1p+14 +-0x1.001a2d1a7d1dd832p+14 +-0x1.001a18b9ec02fb7cp+14 +-0x1.001a0f97696bc6c6p+14 +-0x1.001a0c0ec4cd6b9cp+14 +-0x1.0019f33e803e928cp+14 +-0x1.0019f7f08aeff81ep+14 +-0x1.0019f26d0be66fbp+14 +-0x1.0019fd098c97cd36p+14 +-0x1.0019f3c5ac5393a4p+14 +-0x1.0019eaa2f66d738p+14 +-0x1.0019dca8bfe28ec8p+14 +-0x1.0019d0b1d3980ee6p+14 +-0x1.0019d11f5de40326p+14 +-0x1.0019dbce20e3e1b2p+14 +-0x1.0019d8d24e7a6efep+14 +-0x1.0019dc87f194e196p+14 +-0x1.00199e789072aa8cp+14 +-0x1.00199a33dcce72c8p+14 +-0x1.001999d8317802c4p+14 +-0x1.00197d9dd9880b6p+14 +-0x1.001975cfa7af70fep+14 +-0x1.001960a12d6343c2p+14 +-0x1.001958cf280fde2ap+14 +-0x1.00194c9a7663a4f4p+14 +-0x1.00191eb4ce3492dap+14 +-0x1.0018fd5e0aaffa56p+14 +-0x1.0018df79d93bc794p+14 +-0x1.0018b3a9e7adfc12p+14 +-0x1.0018b6a113caf97cp+14 +-0x1.0018aab063d48a7cp+14 +-0x1.0018a24b74ca079cp+14 +-0x1.00189238fa797856p+14 +-0x1.0018897857f53822p+14 +-0x1.00188a60436668f8p+14 +-0x1.00188b1bde725a66p+14 +-0x1.00188d535357d7bp+14 +-0x1.00187969af0556a4p+14 +-0x1.00187485af9f4508p+14 +-0x1.00185b1a82618524p+14 +-0x1.00184c1526237534p+14 +-0x1.00181a963fe6da74p+14 +-0x1.001809725cc3ee74p+14 +-0x1.0017f349f53167ccp+14 +-0x1.0017cb8ae9f2131ep+14 +-0x1.001793bd30416376p+14 +-0x1.0017974910b68138p+14 +-0x1.00177bd779a04c04p+14 +-0x1.001760b7fd09d0cep+14 +-0x1.001761a160b5e0cp+14 +-0x1.001764894c7419p+14 +-0x1.0017443cbdb899d8p+14 +-0x1.00174693e866ad6p+14 +-0x1.0017117e3755e47ap+14 +-0x1.00171b29eb06fc84p+14 +-0x1.00171ae7c5791206p+14 +-0x1.0017129f9988b07cp+14 +-0x1.001709e921fefb4ap+14 +-0x1.001708a27bf3f97p+14 +-0x1.001702898c4fdf4ep+14 +-0x1.0016eafeb5310122p+14 +-0x1.0016f741958bdec6p+14 +-0x1.0016e0e7edc6c004p+14 +-0x1.0016ecca8f4a362ap+14 +-0x1.0016ea0523a45fb4p+14 +-0x1.0016d43d14b901e4p+14 +-0x1.0016cafb7eace2acp+14 +-0x1.0016c4c88b096b98p+14 +-0x1.0016c0ccd3cdd556p+14 +-0x1.0016b87193b91ffp+14 +-0x1.0016b374985729fap+14 +-0x1.0016bae403991c72p+14 +-0x1.0016ba631beaf2e8p+14 +-0x1.0016afbe9601b78cp+14 +-0x1.001699f864c91672p+14 +-0x1.00169eeed14b0592p+14 +-0x1.00169e9ffbcd63c6p+14 +-0x1.00168abd01a02e42p+14 +-0x1.001658b2480005c8p+14 +-0x1.001642fb27e26c9p+14 +-0x1.00163b80752d0e38p+14 +-0x1.001620f717760d1p+14 +-0x1.00160c0ec4cd6b9cp+14 +-0x1.0015f26d0be66fbp+14 +-0x1.0015f3c5ac5393a4p+14 +-0x1.0015d11f5de40326p+14 +-0x1.0015d8d24e7a6efep+14 +-0x1.0015c4391fd6a094p+14 +-0x1.0015cc9306eb3964p+14 +-0x1.0015a7718ac518c4p+14 +-0x1.00159e789072aa8cp+14 +-0x1.00159a33dcce72c8p+14 +-0x1.001575cfa7af70fep+14 +-0x1.00156cda889d7316p+14 +-0x1.00155e17ec6dddc2p+14 +-0x1.001553e1a722f672p+14 +-0x1.001558cf280fde2ap+14 +-0x1.0015437bdb526c2cp+14 +-0x1.00154c9a7663a4f4p+14 +-0x1.00153403610b4fdcp+14 +-0x1.0015287298d146a8p+14 +-0x1.0014fd5e0aaffa56p+14 +-0x1.0014cb096d62c81ap+14 +-0x1.0014b3a9e7adfc12p+14 +-0x1.0014b6a113caf97cp+14 +-0x1.0014aab063d48a7cp+14 +-0x1.00149238fa797856p+14 +-0x1.0014897857f53822p+14 +-0x1.00148a60436668f8p+14 +-0x1.00148b1bde725a66p+14 +-0x1.001486934994441p+14 +-0x1.00147969af0556a4p+14 +-0x1.001474a8440f880ap+14 +-0x1.00147485af9f4508p+14 +-0x1.001461c92ae814bep+14 +-0x1.001455f80e3c8498p+14 +-0x1.00145b1a82618524p+14 +-0x1.00144f29ee3133bp+14 +-0x1.00144c1526237534p+14 +-0x1.00141a963fe6da74p+14 +-0x1.0013de28a80e53fcp+14 +-0x1.0013ded927d176d8p+14 +-0x1.0013c369910c841cp+14 +-0x1.0013bfb2ab08681ep+14 +-0x1.0013b50e4bef40d6p+14 +-0x1.0013966cf2bb17ecp+14 +-0x1.0013974910b68138p+14 +-0x1.001360b7fd09d0cep+14 +-0x1.001361a160b5e0cp+14 +-0x1.0013443cbdb899d8p+14 +-0x1.00134693e866ad6p+14 +-0x1.0013389a0ef5d3fep+14 +-0x1.00132bb729dbf5f2p+14 +-0x1.001323502a1a48cp+14 +-0x1.00131ae7c5791206p+14 +-0x1.001309e921fefb4ap+14 +-0x1.001308a27bf3f97p+14 +-0x1.001302898c4fdf4ep+14 +-0x1.0012f40a7ac63b98p+14 +-0x1.0012e77ae76a9d62p+14 +-0x1.0012e27d13a5b006p+14 +-0x1.0012e0e7edc6c004p+14 +-0x1.0012ea0523a45fb4p+14 +-0x1.0012dd67f86982f4p+14 +-0x1.0012c5a1e2b5a38ap+14 +-0x1.0012c0ccd3cdd556p+14 +-0x1.0012b87193b91ffp+14 +-0x1.0012bae403991c72p+14 +-0x1.0012ba631beaf2e8p+14 +-0x1.0012afbe9601b78cp+14 +-0x1.0012a3895e6375c8p+14 +-0x1.001299f864c91672p+14 +-0x1.00129e9ffbcd63c6p+14 +-0x1.001258b2480005c8p+14 +-0x1.00125f526e654e2p+14 +-0x1.00123b80752d0e38p+14 +-0x1.001220f717760d1p+14 +-0x1.00120c0ec4cd6b9cp+14 +-0x1.0011f3c5ac5393a4p+14 +-0x1.0011ebb6e4cc1b18p+14 +-0x1.0011d11f5de40326p+14 +-0x1.0011d8d24e7a6efep+14 +-0x1.0011c5e30bb6a9f6p+14 +-0x1.0011cc9306eb3964p+14 +-0x1.0011b7e2aa6aea66p+14 +-0x1.0011bd459319f86cp+14 +-0x1.00119e789072aa8cp+14 +-0x1.0011a00b4c9ea8f8p+14 +-0x1.00118b5820df1048p+14 +-0x1.001186911d240c96p+14 +-0x1.001175cfa7af70fep+14 +-0x1.00115e17ec6dddc2p+14 +-0x1.001158d18d759bbap+14 +-0x1.001158cf280fde2ap+14 +-0x1.0011437bdb526c2cp+14 +-0x1.00114c9a7663a4f4p+14 +-0x1.0011303a7ea0d55cp+14 +-0x1.00113403610b4fdcp+14 +-0x1.0011287298d146a8p+14 +-0x1.00111fe57f2c704cp+14 +-0x1.00111cc98f538564p+14 +-0x1.0010ece25d814884p+14 +-0x1.0010ed154e1bb2b4p+14 +-0x1.0010ce8eff470e1ap+14 +-0x1.0010cb096d62c81ap+14 +-0x1.0010b6988ba9f4aap+14 +-0x1.0010a50db22e8736p+14 +-0x1.0010897857f53822p+14 +-0x1.00109040dc62ffe8p+14 +-0x1.0010792a31d39544p+14 +-0x1.00107969af0556a4p+14 +-0x1.00107ad33cef211ep+14 +-0x1.0010738bba7b7654p+14 +-0x1.001077c384fda284p+14 +-0x1.001061c92ae814bep+14 +-0x1.001055f80e3c8498p+14 +-0x1.00105a31e0a033eep+14 +-0x1.00105b1a82618524p+14 +-0x1.00104f29ee3133bp+14 +-0x1.00101a963fe6da74p+14 +-0x1.00100ca494174b0ap+14 +-0x1.000fd7fd2a35ee82p+14 +-0x1.000fdbeced8c5cb6p+14 +-0x1.000fde28a80e53fcp+14 +-0x1.000fc369910c841cp+14 +-0x1.000fbfb2ab08681ep+14 +-0x1.000f98d7320ef976p+14 +-0x1.000f974d2e39b118p+14 +-0x1.000f9d8ad67552b8p+14 +-0x1.000f974910b68138p+14 +-0x1.000f6de8d19a2b38p+14 +-0x1.000f61a160b5e0cp+14 +-0x1.000f4693e866ad6p+14 +-0x1.000f32f915121552p+14 +-0x1.000f3e711da62d34p+14 +-0x1.000f2bb729dbf5f2p+14 +-0x1.000f0af6ae8582a4p+14 +-0x1.000f09e921fefb4ap+14 +-0x1.000f0ce4a0451ae2p+14 +-0x1.000ef40a7ac63b98p+14 +-0x1.000ee77ae76a9d62p+14 +-0x1.000edd67f86982f4p+14 +-0x1.000ed5df63ceda1p+14 +-0x1.000ec5a1e2b5a38ap+14 +-0x1.000ec28cc889adecp+14 +-0x1.000eb87193b91ffp+14 +-0x1.000eb1355cdc95b2p+14 +-0x1.000eba631beaf2e8p+14 +-0x1.000eb41478e84c74p+14 +-0x1.000eaaa70eed534ap+14 +-0x1.000ea3895e6375c8p+14 +-0x1.000e9aba97566c3p+14 +-0x1.000e89408a0a9534p+14 +-0x1.000e70ea92ab23c4p+14 +-0x1.000e58b2480005c8p+14 +-0x1.000e5f526e654e2p+14 +-0x1.000e49ca1da685aap+14 +-0x1.000e20f717760d1p+14 +-0x1.000e072a26a6cce2p+14 +-0x1.000e0b9d07c2abb6p+14 +-0x1.000dfaf50a73588cp+14 +-0x1.000df3c5ac5393a4p+14 +-0x1.000deed19e5fb454p+14 +-0x1.000dd8d24e7a6efep+14 +-0x1.000dcc9306eb3964p+14 +-0x1.000db7e2aa6aea66p+14 +-0x1.000dbd459319f86cp+14 +-0x1.000d7ce0d77f44eep+14 +-0x1.000d75cfa7af70fep+14 +-0x1.000d4c9a7663a4f4p+14 +-0x1.000d303a7ea0d55cp+14 +-0x1.000d375537612cacp+14 +-0x1.000d3247f9a456fp+14 +-0x1.000d1cc98f538564p+14 +-0x1.000cf94f4c6a8a5cp+14 +-0x1.000cece25d814884p+14 +-0x1.000ced154e1bb2b4p+14 +-0x1.000cb6988ba9f4aap+14 +-0x1.000ca67a30b66a2ap+14 +-0x1.000ca50db22e8736p+14 +-0x1.000c792a31d39544p+14 +-0x1.000c7ad33cef211ep+14 +-0x1.000c7849d32d354ap+14 +-0x1.000c77c384fda284p+14 +-0x1.000c64e73640c37p+14 +-0x1.000c67894bb8d272p+14 +-0x1.000c61c92ae814bep+14 +-0x1.000c4f29ee3133bp+14 +-0x1.000c405d52f4eb6p+14 +-0x1.000c31d6ff0d4296p+14 +-0x1.000c23f071311d5cp+14 +-0x1.000c1a963fe6da74p+14 +-0x1.000c0ca494174b0ap+14 +-0x1.000bdbeced8c5cb6p+14 +-0x1.000bc369910c841cp+14 +-0x1.000bbeebfab9fc6ap+14 +-0x1.000bab9bf3b3bb2ap+14 +-0x1.000b9db0c3fd72dap+14 +-0x1.000b9e8edd7befp+14 +-0x1.000b974d2e39b118p+14 +-0x1.000b9d8ad67552b8p+14 +-0x1.000b974910b68138p+14 +-0x1.000b77022599ef28p+14 +-0x1.000b61a160b5e0cp+14 +-0x1.000b58e3eadd09fep+14 +-0x1.000b58cdd1972e7p+14 +-0x1.000b32f915121552p+14 +-0x1.000b3e711da62d34p+14 +-0x1.000b3ca7d54df3aap+14 +-0x1.000b18e390d545a2p+14 +-0x1.000b1a0f168d8f82p+14 +-0x1.000b12043ca9075ep+14 +-0x1.000b0af6ae8582a4p+14 +-0x1.000b0ce4a0451ae2p+14 +-0x1.000af41e7fe96eb2p+14 +-0x1.000af79844990afp+14 +-0x1.000af40a7ac63b98p+14 +-0x1.000ae77ae76a9d62p+14 +-0x1.000ae3cc4c7ac8bap+14 +-0x1.000add67f86982f4p+14 +-0x1.000ad5df63ceda1p+14 +-0x1.000ac5a1e2b5a38ap+14 +-0x1.000ab4fce0943244p+14 +-0x1.000ab1355cdc95b2p+14 +-0x1.000abbe88711e17ap+14 +-0x1.000ab41478e84c74p+14 +-0x1.000aa3895e6375c8p+14 +-0x1.000a9aba97566c3p+14 +-0x1.000a8d016bbd9094p+14 +-0x1.000a89408a0a9534p+14 +-0x1.000a70ea92ab23c4p+14 +-0x1.000a7044bb135d22p+14 +-0x1.000a5f526e654e2p+14 +-0x1.000a374e74aca574p+14 +-0x1.000a20f717760d1p+14 +-0x1.000a20e0219ea6e4p+14 +-0x1.000a0b9d07c2abb6p+14 +-0x1.0009faf50a73588cp+14 +-0x1.0009fe54bf69d3d2p+14 +-0x1.0009f3c5ac5393a4p+14 +-0x1.0009c3bc4a1502ap+14 +-0x1.0009cc9306eb3964p+14 +-0x1.0009c1440f2af19ap+14 +-0x1.0009ba1599f6002ep+14 +-0x1.0009bd459319f86cp+14 +-0x1.00097e3b85e511cap+14 +-0x1.000979fec070f3fcp+14 +-0x1.00097ce0d77f44eep+14 +-0x1.000975cfa7af70fep+14 +-0x1.00094c9a7663a4f4p+14 +-0x1.0009439625e6f786p+14 +-0x1.00091cc98f538564p+14 +-0x1.0008ff894e93deb8p+14 +-0x1.0008f94f4c6a8a5cp+14 +-0x1.0008ece25d814884p+14 +-0x1.0008ed154e1bb2b4p+14 +-0x1.0008d9b4c1e2943cp+14 +-0x1.0008c1e4df95845cp+14 +-0x1.0008a67a30b66a2ap+14 +-0x1.0008ac282a6e0d36p+14 +-0x1.000889698ded86ep+14 +-0x1.0008792a31d39544p+14 +-0x1.00087849d32d354ap+14 +-0x1.000877c384fda284p+14 +-0x1.000867894bb8d272p+14 +-0x1.000861c92ae814bep+14 +-0x1.00084f29ee3133bp+14 +-0x1.00084d58019d73c2p+14 +-0x1.00083563bee8b47ap+14 +-0x1.000831d6ff0d4296p+14 +-0x1.000817d8103da22ep+14 +-0x1.00080ca494174b0ap+14 +-0x1.0007b7793d7918dp+14 +-0x1.0007beebfab9fc6ap+14 +-0x1.0007ab9bf3b3bb2ap+14 +-0x1.0007aa56a7e9fd92p+14 +-0x1.0007ad917c06df7ep+14 +-0x1.00079e8edd7befp+14 +-0x1.00079d8ad67552b8p+14 +-0x1.0007974910b68138p+14 +-0x1.000773e80a0b3b78p+14 +-0x1.000758cdd1972e7p+14 +-0x1.00073e711da62d34p+14 +-0x1.00073ca7d54df3aap+14 +-0x1.00073197c119c2eap+14 +-0x1.0007216ab168c4p+14 +-0x1.0007245bbffe94dcp+14 +-0x1.000719727ee6e7cap+14 +-0x1.000718e390d545a2p+14 +-0x1.00071a0f168d8f82p+14 +-0x1.00070ce4a0451ae2p+14 +-0x1.0006f40a7ac63b98p+14 +-0x1.0006e4558f7a0ae4p+14 +-0x1.0006e3cc4c7ac8bap+14 +-0x1.0006dd67f86982f4p+14 +-0x1.0006df525c6c8a2ap+14 +-0x1.0006c5a1e2b5a38ap+14 +-0x1.0006b4fce0943244p+14 +-0x1.0006b8764e39b458p+14 +-0x1.0006b41478e84c74p+14 +-0x1.0006a3895e6375c8p+14 +-0x1.000684cbeedc251ep+14 +-0x1.00068d016bbd9094p+14 +-0x1.00067daaccece50cp+14 +-0x1.00065279ba42e24ep+14 +-0x1.00065f526e654e2p+14 +-0x1.000645ec8ff73a9ap+14 +-0x1.000644eafb1bda22p+14 +-0x1.000648e91b35707ap+14 +-0x1.0006333be65e9894p+14 +-0x1.000620e0219ea6e4p+14 +-0x1.00061298a29f8fecp+14 +-0x1.00060d7de517961ep+14 +-0x1.00060ce612fc26eap+14 +-0x1.0005cc9306eb3964p+14 +-0x1.0005b5bde9508b5cp+14 +-0x1.0005ba1599f6002ep+14 +-0x1.0005bd459319f86cp+14 +-0x1.0005a9d5e594bb6ep+14 +-0x1.000574ec458af334p+14 +-0x1.000558a1f124e10ep+14 +-0x1.00054c9a7663a4f4p+14 +-0x1.0005439625e6f786p+14 +-0x1.00051cc98f538564p+14 +-0x1.0005043c41ac20f6p+14 +-0x1.0005084f948ffbcap+14 +-0x1.0004ff894e93deb8p+14 +-0x1.0004ee243b868f7ap+14 +-0x1.0004ed154e1bb2b4p+14 +-0x1.0004d9b4c1e2943cp+14 +-0x1.0004c1e4df95845cp+14 +-0x1.0004b33bbed17176p+14 +-0x1.0004a67a30b66a2ap+14 +-0x1.00049b3efd7f3064p+14 +-0x1.00048739916330d2p+14 +-0x1.000489698ded86ep+14 +-0x1.000486e7aae2f338p+14 +-0x1.0004792a31d39544p+14 +-0x1.0004605e071e2a4ep+14 +-0x1.000461c92ae814bep+14 +-0x1.00044b7f838aae0ep+14 +-0x1.00044835bc46e678p+14 +-0x1.00044f29ee3133bp+14 +-0x1.00044d58019d73c2p+14 +-0x1.00043b64790168b4p+14 +-0x1.0004361003c3ffb2p+14 +-0x1.000417d8103da22ep+14 +-0x1.00040ada3b594ddep+14 +-0x1.000402969c5b714ep+14 +-0x1.0003dc0800cbbd7ep+14 +-0x1.0003d7c24029df2cp+14 +-0x1.0003b7793d7918dp+14 +-0x1.0003beebfab9fc6ap+14 +-0x1.0003aa56a7e9fd92p+14 +-0x1.0003ad917c06df7ep+14 +-0x1.00039e8edd7befp+14 +-0x1.0003974910b68138p+14 +-0x1.000384fc0fc08606p+14 +-0x1.000373e80a0b3b78p+14 +-0x1.000368d25ed70bcap+14 +-0x1.000358cdd1972e7p+14 +-0x1.00034d457fd25e5p+14 +-0x1.00033197c119c2eap+14 +-0x1.00032967f0d0fa9cp+14 +-0x1.00031bf6da145314p+14 +-0x1.00031a0f168d8f82p+14 +-0x1.00030ce4a0451ae2p+14 +-0x1.0002fdb3cb4bf0ecp+14 +-0x1.0002e9ffd2b4011ep+14 +-0x1.0002bc324e3caf96p+14 +-0x1.0002b514a561b602p+14 +-0x1.0002a3895e6375c8p+14 +-0x1.000284cbeedc251ep+14 +-0x1.00028d016bbd9094p+14 +-0x1.00027daaccece50cp+14 +-0x1.000274df6425ab22p+14 +-0x1.00025f526e654e2p+14 +-0x1.000244eafb1bda22p+14 +-0x1.00024b248f59b214p+14 +-0x1.0002333be65e9894p+14 +-0x1.000220e0219ea6e4p+14 +-0x1.00020d7de517961ep+14 +-0x1.00020887a5706522p+14 +-0x1.00020d00bcf111a6p+14 +-0x1.0001ed73864f203p+14 +-0x1.0001e2f8e8f3b2e2p+14 +-0x1.0001cc9306eb3964p+14 +-0x1.00019477bf76f124p+14 +-0x1.00018ea0d0333f9p+14 +-0x1.0001643c4897459ap+14 +-0x1.000166d6c5324f4ep+14 +-0x1.0001688362eff29ap+14 +-0x1.00014b11e6f264fp+14 +-0x1.0001439625e6f786p+14 +-0x1.000126c88b682268p+14 +-0x1.00011295657a20c8p+14 +-0x1.0001043c41ac20f6p+14 +-0x1.00010b30cc8b7eacp+14 +-0x1.0000ff894e93deb8p+14 +-0x1.0000ee243b868f7ap+14 +-0x1.0000ed154e1bb2b4p+14 +-0x1.0000c69384e4f9ecp+14 +-0x1.0000b33bbed17176p+14 +-0x1.0000bb73b1edaed6p+14 +-0x1.00008739916330d2p+14 +-0x1.000085302c522d54p+14 +-0x1.000086e7aae2f338p+14 +-0x1.000087824b6dd1e4p+14 +-0x1.0000792a31d39544p+14 +-0x1.000061c92ae814bep+14 +-0x1.000057e2197dcfe8p+14 +-0x1.00004b7f838aae0ep+14 +-0x1.00004f29ee3133bp+14 +-0x1.0000361003c3ffb2p+14 +-0x1.000017d8103da22ep+14 +-0x1.000002969c5b714ep+14 +-0x1.ffffe038fbd78d0ep+13 +-0x1.fffff684581d2e28p+13 +-0x1.ffffec04ca517bdep+13 +-0x1.ffffd98295ea479ep+13 +-0x1.ffffb85c64725d12p+13 +-0x1.ffffa7c37af1ba8cp+13 +-0x1.ffffaf848053be58p+13 +-0x1.ffff81b64350b34ap+13 +-0x1.ffff9e98bf40435ep+13 +-0x1.ffff6ef27af231ap+13 +-0x1.ffff798af7ca1866p+13 +-0x1.ffff54ad4fd3fb24p+13 +-0x1.ffff5b22f80dbefcp+13 +-0x1.ffff3c4deb0f20fep+13 +-0x1.ffff104e0247dac2p+13 +-0x1.ffff1cca8db40d32p+13 +-0x1.ffff063f600e80e6p+13 +-0x1.fffee7d0141676fp+13 +-0x1.fffed4a91a54081ap+13 +-0x1.fffec80bdc2f78e6p+13 +-0x1.fffeb19ba32e5cep+13 +-0x1.fffe996cece60af8p+13 +-0x1.fffe85bc505defb4p+13 +-0x1.fffe9a8affa4bcap+13 +-0x1.fffe5bf83f9b890ap+13 +-0x1.fffe52cfe1a1f538p+13 +-0x1.fffe37edb428a628p+13 +-0x1.fffe365e2229ae02p+13 +-0x1.fffe22ae45d72f0cp+13 +-0x1.fffe341e2d1b1f04p+13 +-0x1.fffe2a92e369e534p+13 +-0x1.fffe19c9408a35c4p+13 +-0x1.fffe16b5fcb38cf8p+13 +-0x1.fffdfb679697e1d8p+13 +-0x1.fffdc8795442411ep+13 +-0x1.fffddbe36cd12e48p+13 +-0x1.fffd94fffb1f4208p+13 +-0x1.fffd98e589c6e762p+13 +-0x1.fffd8dde02d4917ep+13 +-0x1.fffd9bcaed84dadep+13 +-0x1.fffd9b1250e4ab78p+13 +-0x1.fffd7ad8d9771546p+13 +-0x1.fffd66c07628019ep+13 +-0x1.fffd6042dceed936p+13 +-0x1.fffd4a452909ae9ep+13 +-0x1.fffd51b6b2d3dac6p+13 +-0x1.fffd548aa3411dd2p+13 +-0x1.fffd5882e0ea7732p+13 +-0x1.fffd20fb0a88e1p+13 +-0x1.fffd2c978a6c58fap+13 +-0x1.fffd066e6bf1bdc2p+13 +-0x1.fffd056bf6cee4fap+13 +-0x1.fffd0997ddb84a3cp+13 +-0x1.fffd1a02d77b2128p+13 +-0x1.fffcfb5599d9ca18p+13 +-0x1.fffceec554e7d6f2p+13 +-0x1.fffcf4a7d595d614p+13 +-0x1.fffccfe99307cebp+13 +-0x1.fffccc505ddc77e4p+13 +-0x1.fffcdf0296d70594p+13 +-0x1.fffcbea4dcca9c4p+13 +-0x1.fffc8356ced4c7dp+13 +-0x1.fffc94277dbea7eap+13 +-0x1.fffc7be74011f64ap+13 +-0x1.fffc50aea160ea92p+13 +-0x1.fffc375aad4de0c6p+13 +-0x1.fffc110f4ae0ca44p+13 +-0x1.fffc1a0179e2234cp+13 +-0x1.fffbf4dee9e5388cp+13 +-0x1.fffbf43d24e1c6fep+13 +-0x1.fffbf9371097ed0ep+13 +-0x1.fffbdae70c9e406p+13 +-0x1.fffbc5f1d1e765c4p+13 +-0x1.fffb9ce5bf4a991ep+13 +-0x1.fffb9c2642a46276p+13 +-0x1.fffb99260dd672c8p+13 +-0x1.fffb53ca7b95cc5ap+13 +-0x1.fffb3a56111fe926p+13 +-0x1.fffb2222e16234fp+13 +-0x1.fffb2497cd909fep+13 +-0x1.fffae4dcbf82f46ep+13 +-0x1.fffae8d33257086ep+13 +-0x1.fffae92429e4814ep+13 +-0x1.fffac878912e8b34p+13 +-0x1.fffacdad8a649e9cp+13 +-0x1.fffab7ee0c9c3aa8p+13 +-0x1.fffaa5d482185afap+13 +-0x1.fffab58588645a84p+13 +-0x1.fffa87d4c63cff4ap+13 +-0x1.fffa86bfb4193c62p+13 +-0x1.fffa872c4bcdef0cp+13 +-0x1.fffa5458a113e79cp+13 +-0x1.fffa252acaf4419p+13 +-0x1.fffa38147588a6dep+13 +-0x1.fffa0878835841ecp+13 +-0x1.fffa0a564371b306p+13 +-0x1.fffa0d5495c8c8c2p+13 +-0x1.fffa1207990fd56p+13 +-0x1.fff9e8b6d6b671f4p+13 +-0x1.fff9ff129d27bd7p+13 +-0x1.fff9eca515605924p+13 +-0x1.fff9f8030280689ep+13 +-0x1.fff9dff5fd73c522p+13 +-0x1.fff9e4076c17fe06p+13 +-0x1.fff9c868e95130c2p+13 +-0x1.fff9da2a9c376568p+13 +-0x1.fff9c41d376695b2p+13 +-0x1.fff9d885076f3cb4p+13 +-0x1.fff9c80adc02f1a6p+13 +-0x1.fff9bdb3ffe515dep+13 +-0x1.fff9a6220dede13p+13 +-0x1.fff98c1d8ffdadb8p+13 +-0x1.fff9242289e691e8p+13 +-0x1.fff9231d82416888p+13 +-0x1.fff90e7322c661a4p+13 +-0x1.fff90a6058a45aa8p+13 +-0x1.fff90dcf55c5e67p+13 +-0x1.fff90f0496dba3c8p+13 +-0x1.fff902048c06dd5ap+13 +-0x1.fff8dc7185eb9812p+13 +-0x1.fff8de63d90c4d26p+13 +-0x1.fff8c5b139e8fc2cp+13 +-0x1.fff8cc951aacdee2p+13 +-0x1.fff8c39255d0297cp+13 +-0x1.fff8b9f0973eaf7ep+13 +-0x1.fff8afc432fb9fdp+13 +-0x1.fff89e53dc62676p+13 +-0x1.fff864db4e6fc69p+13 +-0x1.fff848dfaeec22d8p+13 +-0x1.fff8197344a66326p+13 +-0x1.fff811f6ae876482p+13 +-0x1.fff81cac7fccd66cp+13 +-0x1.fff8024910e96026p+13 +-0x1.fff81394aa9db93ep+13 +-0x1.fff7ec04ca517bdep+13 +-0x1.fff7d2f072ede94ep+13 +-0x1.fff7d1ee183780dep+13 +-0x1.fff7bf377e5f6d0cp+13 +-0x1.fff7af848053be58p+13 +-0x1.fff79e98bf40435ep+13 +-0x1.fff76ef27af231ap+13 +-0x1.fff76437fe2f9268p+13 +-0x1.fff7799939b93336p+13 +-0x1.fff7798af7ca1866p+13 +-0x1.fff75b22f80dbefcp+13 +-0x1.fff729cac3d73092p+13 +-0x1.fff703d9e15deaacp+13 +-0x1.fff70a56854e26dap+13 +-0x1.fff7063f600e80e6p+13 +-0x1.fff6def10935dedcp+13 +-0x1.fff6d4a91a54081ap+13 +-0x1.fff6c80bdc2f78e6p+13 +-0x1.fff6de8758554c3p+13 +-0x1.fff6b2f89fb4764ap+13 +-0x1.fff6a49f9af02112p+13 +-0x1.fff681e1598973d4p+13 +-0x1.fff685bc505defb4p+13 +-0x1.fff69a8affa4bcap+13 +-0x1.fff67e50909533dep+13 +-0x1.fff671883ad92fc2p+13 +-0x1.fff65bf83f9b890ap+13 +-0x1.fff6445d4bd3f27ep+13 +-0x1.fff637edb428a628p+13 +-0x1.fff6365e2229ae02p+13 +-0x1.fff622ae45d72f0cp+13 +-0x1.fff619c9408a35c4p+13 +-0x1.fff6023429a968ccp+13 +-0x1.fff5fb679697e1d8p+13 +-0x1.fff5eed7db3c8c74p+13 +-0x1.fff5fc1b73b7a892p+13 +-0x1.fff5c8795442411ep+13 +-0x1.fff5dbe36cd12e48p+13 +-0x1.fff594fffb1f4208p+13 +-0x1.fff598e589c6e762p+13 +-0x1.fff542611be13a02p+13 +-0x1.fff54a452909ae9ep+13 +-0x1.fff551b6b2d3dac6p+13 +-0x1.fff5548aa3411dd2p+13 +-0x1.fff55882e0ea7732p+13 +-0x1.fff52f7e820e8c02p+13 +-0x1.fff520fb0a88e1p+13 +-0x1.fff521eb240f6538p+13 +-0x1.fff50577745eb0a8p+13 +-0x1.fff50997ddb84a3cp+13 +-0x1.fff50588a49feee4p+13 +-0x1.fff4f52d938c047ap+13 +-0x1.fff4d671b29f6e7p+13 +-0x1.fff4cfe99307cebp+13 +-0x1.fff4d3dbd5f63322p+13 +-0x1.fff4bea4dcca9c4p+13 +-0x1.fff4a2a7e4b80644p+13 +-0x1.fff49e4e91b4983cp+13 +-0x1.fff494277dbea7eap+13 +-0x1.fff46e059d70257ap+13 +-0x1.fff44fd7342bc8fp+13 +-0x1.fff4375aad4de0c6p+13 +-0x1.fff416e75c2b6366p+13 +-0x1.fff4110f4ae0ca44p+13 +-0x1.fff41a0179e2234cp+13 +-0x1.fff3fc678c584532p+13 +-0x1.fff3e0dc15328dbcp+13 +-0x1.fff3dae70c9e406p+13 +-0x1.fff3a1071f1149ecp+13 +-0x1.fff39ce5bf4a991ep+13 +-0x1.fff39c2642a46276p+13 +-0x1.fff35f0634a0f514p+13 +-0x1.fff33a56111fe926p+13 +-0x1.fff335cb7182ff6ap+13 +-0x1.fff32222e16234fp+13 +-0x1.fff32497cd909fep+13 +-0x1.fff2f379fe57269cp+13 +-0x1.fff2e7584ee0335ep+13 +-0x1.fff2e32c97cbfa3cp+13 +-0x1.fff2d4477d71b50cp+13 +-0x1.fff2cdad8a649e9cp+13 +-0x1.fff2b7ee0c9c3aa8p+13 +-0x1.fff2a0e43b448c08p+13 +-0x1.fff2a5d482185afap+13 +-0x1.fff2be9be39f8824p+13 +-0x1.fff2a39de9a702b8p+13 +-0x1.fff2b58588645a84p+13 +-0x1.fff2822430080ba6p+13 +-0x1.fff27d3f944de0bep+13 +-0x1.fff25458a113e79cp+13 +-0x1.fff23b65830af32ap+13 +-0x1.fff226e8488d196ep+13 +-0x1.fff21370850fd936p+13 +-0x1.fff203cafbe04d38p+13 +-0x1.fff21207990fd56p+13 +-0x1.fff1eca515605924p+13 +-0x1.fff1ff129d27bd7p+13 +-0x1.fff1f8030280689ep+13 +-0x1.fff1d885076f3cb4p+13 +-0x1.fff1bdb3ffe515dep+13 +-0x1.fff1a6220dede13p+13 +-0x1.fff16606bb77d06p+13 +-0x1.fff1538916560f1p+13 +-0x1.fff13725a4b230a2p+13 +-0x1.fff1242289e691e8p+13 +-0x1.fff10e7322c661a4p+13 +-0x1.fff10473340ebe9cp+13 +-0x1.fff10a6058a45aa8p+13 +-0x1.fff10f0496dba3c8p+13 +-0x1.fff0e0922532e50ep+13 +-0x1.fff0c5b139e8fc2cp+13 +-0x1.fff0cc951aacdee2p+13 +-0x1.fff0b9f0973eaf7ep+13 +-0x1.fff0b5713b4bb792p+13 +-0x1.fff0ba5ac1bd84d4p+13 +-0x1.fff0b8b51c7a6b52p+13 +-0x1.fff08de85c734bfp+13 +-0x1.fff07a7d9d392c42p+13 +-0x1.fff064db4e6fc69p+13 +-0x1.fff060b2a87ff4ecp+13 +-0x1.fff0521edd9f4846p+13 +-0x1.fff0479fb5282ee6p+13 +-0x1.fff05b8b82d2bd24p+13 +-0x1.fff022bff6810258p+13 +-0x1.fff01394aa9db93ep+13 # non-regression tests -0x8p+11 -0x8.000000001e848p+11 diff --git a/src/binary80/exp2/function_under_test.h b/src/binary80/exp2/function_under_test.h new file mode 100644 index 00000000..a867173d --- /dev/null +++ b/src/binary80/exp2/function_under_test.h @@ -0,0 +1,2 @@ +#define cr_function_under_test cr_exp2l +#define ref_function_under_test ref_exp2l diff --git a/src/binary80/support/check_worst_uni.c b/src/binary80/support/check_worst_uni.c index 62ef16e4..2ae8c19f 100644 --- a/src/binary80/support/check_worst_uni.c +++ b/src/binary80/support/check_worst_uni.c @@ -170,6 +170,23 @@ doloop(void) printf("%d tests passed, %d failure(s)\n", tests, failures); } +// check the "long double" type is the double-extended format +static void +check_long_double (void) +{ + fesetround (FE_TONEAREST); + long double x = 1.0, y = 1.0; + int p = 0; + while (x + y != x) + y = y * 0.5, p ++; + if (p != 64) + { + printf ("The long-double format is not the double-extended format\n"); + printf ("It has a precision of %d bits\n", p); + exit (1); + } +} + int main (int argc, char *argv[]) { @@ -206,5 +223,7 @@ main (int argc, char *argv[]) } } + check_long_double (); + doloop(); }