From 6baa20c762efcd8c9535a5e7c1bc70186d49a67a Mon Sep 17 00:00:00 2001 From: Alexei Sibidanov Date: Sun, 14 Jan 2024 13:58:21 -0800 Subject: [PATCH 01/27] expm1: optimization based on current exp implementation --- src/binary64/expm1/expm1.c | 1134 +++++++++++------------------------- 1 file changed, 341 insertions(+), 793 deletions(-) diff --git a/src/binary64/expm1/expm1.c b/src/binary64/expm1/expm1.c index 3a059065..72b598e5 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,370 @@ 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)); + 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 - return ix; } -#define HAS_BUILTIN_ROUNDEVEN -#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; -} +static inline double as_todenormal(double x){ +#ifdef __x86_64__ + __m128i sb; sb[0] = ~0ul>>12; +#if defined(__clang__) + __m128d r = _mm_set_sd(x); +#else + __m128d r; asm("":"=x"(r):"0"(x)); +#endif + r = _mm_and_pd(r, (__m128d)sb); + return r[0]; +#else + b64u64_u ix = {.f = x}; + ix.u &= ~0ul>>12; + return ix.f; #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; - } - _d.u = M << 52; - *hi *= _d.f; - *lo *= _d.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] -}; - -// 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; +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; } -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 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} }; -/* |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 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}, +}; +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); } From 2c65f34330394faeb5518bed98f3358c204bfd38 Mon Sep 17 00:00:00 2001 From: Alexei Sibidanov Date: Mon, 15 Jan 2024 15:08:36 -0800 Subject: [PATCH 02/27] remove unused function --- src/binary64/expm1/expm1.c | 17 ----------------- 1 file changed, 17 deletions(-) diff --git a/src/binary64/expm1/expm1.c b/src/binary64/expm1/expm1.c index 72b598e5..624b2b8f 100644 --- a/src/binary64/expm1/expm1.c +++ b/src/binary64/expm1/expm1.c @@ -103,23 +103,6 @@ static inline double as_ldexp(double x, i64 i){ #endif } -static inline double as_todenormal(double x){ -#ifdef __x86_64__ - __m128i sb; sb[0] = ~0ul>>12; -#if defined(__clang__) - __m128d r = _mm_set_sd(x); -#else - __m128d r; asm("":"=x"(r):"0"(x)); -#endif - r = _mm_and_pd(r, (__m128d)sb); - return r[0]; -#else - b64u64_u ix = {.f = x}; - ix.u &= ~0ul>>12; - return ix.f; -#endif -} - 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, From 053577fe9fe715be5b37960e28159afe0b540f2c Mon Sep 17 00:00:00 2001 From: Paul Zimmermann Date: Thu, 18 Jan 2024 15:17:57 +0100 Subject: [PATCH 03/27] removed unused variable --- src/binary64/atan/check_special.c | 1 - src/binary64/cos/check_special.c | 1 - src/binary64/cosh/check_special.c | 1 - src/binary64/erf/check_special.c | 1 - src/binary64/erfc/check_special.c | 1 - src/binary64/exp/check_special.c | 1 - src/binary64/exp10/check_special.c | 1 - src/binary64/exp10m1/check_special.c | 1 - src/binary64/exp2/check_special.c | 1 - src/binary64/exp2m1/check_special.c | 1 - src/binary64/expm1/check_special.c | 1 - src/binary64/log/check_special.c | 1 - src/binary64/log10/check_special.c | 1 - src/binary64/log10p1/check_special.c | 1 - src/binary64/log1p/check_special.c | 1 - src/binary64/log2p1/check_special.c | 1 - src/binary64/rsqrt/check_special.c | 1 - src/binary64/sin/check_special.c | 1 - src/binary64/sinh/check_special.c | 1 - src/binary64/sinpi/check_special.c | 1 - src/binary64/tan/check_special.c | 1 - src/binary64/tanh/check_special.c | 1 - 22 files changed, 22 deletions(-) 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/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/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/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; From 479641f0de56fcd8fdd2bfd1abb4f5a6eb2b539e Mon Sep 17 00:00:00 2001 From: Alexei Sibidanov Date: Mon, 29 Jan 2024 19:47:53 -0800 Subject: [PATCH 04/27] log1p: optimized version -- speed and object size --- src/binary64/log1p/log1p.c | 1209 +++++++++--------------------------- 1 file changed, 308 insertions(+), 901 deletions(-) diff --git a/src/binary64/log1p/log1p.c b/src/binary64/log1p/log1p.c index eee547f0..868da897 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,337 @@ 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 s = xh + ch, d = s - xh; + *l = ((ch - d) + (xh + (d - s))) + (xl + cl); + return s; } -/* 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); - - /* if xl=0, we can simply return the accurate path for log(xh) */ - if (xl == 0) - return dint_tod (&Y); - - /* |Y-log(XH)| ~ 8e-52 */ +static double __attribute__((noinline)) as_log1p_refine(double, double); + +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} +}; - 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); +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}} +}; - return dint_tod (&Y); -} +double cr_log1p(double x){ + static const struct {ushort c0; short c1;} B[] = { + {301, 27565}, {7189, 24786}, {13383, 22167}, {18923, 19696}, + {23845, 17361}, {28184, 15150}, {31969, 13054}, {35231, 11064}, + {37996, 9173}, {40288, 7372}, {42129, 5657}, {43542, 4020}, + {44546, 2457}, {45160, 962}, {45399, -468}, {45281, -1838}, + {44821, -3151}, {44032, -4412}, {42929, -5622}, {41522, -6786}, + {39825, -7905}, {37848, -8982}, {35602, -10020}, {33097, -11020}, + {30341, -11985}, {27345, -12916}, {24115, -13816}, {20661, -14685}, + {16989, -15526}, {13107, -16339}, {9022, -17126}, {4740, -17889} + }; -/* 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; + b64u64_u ix = {.f = x}; + u64 ax = ix.u<<1; + double ln1, ln0, eps; + if(__builtin_expect(ax<0x7f60000000000000ul, 1)){ + double x2 = x*x; + if(__builtin_expect(ax<0x7e60000000000000ul, 1)){ + ln1 = x; + eps = 0x1.6p-64*x; + if(__builtin_expect(ax<0x7d43360000000000ul, 1)){ + if(ax<0x7940000000000000ul){ + 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 */ + } else { + static const double c[] = + {-0x1p-1, 0x1.5555555555555p-2, -0x1.fffffffff2p-3, 0x1.99999999887e6p-3, + -0x1.5555c55570f25p-3, 0x1.2492b9217dbfep-3}; + b64u64_u t, dt; + if(__builtin_expect((i64)ix.u<0x4340000000000000l && ix.u<0xbff0000000000000ul, 1)){ + t.f = fasttwosum(1.0, x, &dt.f); + } else { + if(__builtin_expect(ix.u<0x4690000000000000ul, 1)){ + t.f = x; dt.f = 1; + } else { + if(__builtin_expect(ix.u<0x7ff0000000000000ul, 1)){ + t.f = x; dt.f = 0; + } else { + if((ix.u<<1)>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 + } + } + } + u64 i = (t.u>>(52-5))&0x1f; + long d = t.u & (~0ul>>17); + i64 j = t.u + 13841960651842387968ul + ((u64)B[i].c0<<33) + ((long)B[i].c1*(d>>16)); + i64 j1 = (j>>48)&0xf, j2 = (j>>44)&0xf, je = j>>52; + i64 eoff = je<<52; + t.u -= eoff; + if(__builtin_expect(dt.u<<1, 1)) dt.u -= eoff; + double r = rt[0][j1]*rt[1][j2]; + double dh = r*t.f, dl = __builtin_fma(r,t.f,-dh) + r*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 = ln[0][j1][2] + ln[1][j2][2] + L1; + ln0 = ln[0][j1][1] + ln[1][j2][1] + L0; + ln1 = fastsum(ln1, ln0, xh, xl, &ln0); + eps = 0x1p-68; } - - /* 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 */ - } - - /* (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; - else - return 1.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 + 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); } - return x; /* +/-0, NaN or +Inf */ + 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]; + } + 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; } From 559d69db59f8b14c507c8b7e179b188f0340f16d Mon Sep 17 00:00:00 2001 From: Paul Zimmermann Date: Tue, 30 Jan 2024 15:54:53 +0100 Subject: [PATCH 05/27] added threshold values --- src/binary64/log1p/log1p.wc | 20 ++++++++++++++++++++ 1 file changed, 20 insertions(+) diff --git a/src/binary64/log1p/log1p.wc b/src/binary64/log1p/log1p.wc index edfd6047..b9fb025c 100644 --- a/src/binary64/log1p/log1p.wc +++ b/src/binary64/log1p/log1p.wc @@ -347435,3 +347435,23 @@ -0x1.f8f27b3d1a9d8p-1 -0x1.f8d47a920aa11p-1 -0x1.f88870883b2ccp-1 +# threshold values +0x1p+1015 +0x1.0000000000001p+1015 +0x1.fffffffffffffp+1014 +0x1p+999 +0x1.0000000000001p+999 +0x1.fffffffffffffp+998 +0x1.336p+981 +0x1.3360000000001p+981 +0x1.335ffffffffffp+981 +0x1p+917 +0x1.0000000000001p+917 +0x1.fffffffffffffp+916 +0x1p+53 +0x1.0000000000001p+53 +0x1.fffffffffffffp+52 +0x1p+106 +0x1.0000000000001p+106 +0x1.fffffffffffffp+105 +0x1.fffffffffffffp+1023 From d2c81196145f8cc021495b01e663f3a8d68fdce2 Mon Sep 17 00:00:00 2001 From: Alexei Sibidanov Date: Tue, 30 Jan 2024 19:49:01 -0800 Subject: [PATCH 06/27] log1p: get rid of the sophisticated range reduction and thus improve performance --- src/binary64/log1p/log1p.c | 110 ++++++++++++++++++++++++++----------- 1 file changed, 77 insertions(+), 33 deletions(-) diff --git a/src/binary64/log1p/log1p.c b/src/binary64/log1p/log1p.c index 868da897..d8667597 100644 --- a/src/binary64/log1p/log1p.c +++ b/src/binary64/log1p/log1p.c @@ -57,9 +57,9 @@ static inline double fastsum(double xh, double xl, double yh, double yl, double } static inline double sum(double xh, double xl, double ch, double cl, double *l){ - double s = xh + ch, d = s - xh; - *l = ((ch - d) + (xh + (d - s))) + (xl + cl); - return s; + double sl, sh = twosum(xh,ch, &sl); + *l = (xl + cl) + sl; + return sh; } static inline double muldd(double xh, double xl, double ch, double cl, double *l){ @@ -158,7 +158,7 @@ static const double ln[4][16][3] = { {-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}, + {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}, @@ -184,18 +184,61 @@ static const double ln[4][16][3] = { {0x1.4f787e495e5ep-93, -0x1.fbb791220a18p-46, 0x1.3682f14p-14}} }; -double cr_log1p(double x){ - static const struct {ushort c0; short c1;} B[] = { - {301, 27565}, {7189, 24786}, {13383, 22167}, {18923, 19696}, - {23845, 17361}, {28184, 15150}, {31969, 13054}, {35231, 11064}, - {37996, 9173}, {40288, 7372}, {42129, 5657}, {43542, 4020}, - {44546, 2457}, {45160, 962}, {45399, -468}, {45281, -1838}, - {44821, -3151}, {44032, -4412}, {42929, -5622}, {41522, -6786}, - {39825, -7905}, {37848, -8982}, {35602, -10020}, {33097, -11020}, - {30341, -11985}, {27345, -12916}, {24115, -13816}, {20661, -14685}, - {16989, -15526}, {13107, -16339}, {9022, -17126}, {4740, -17889} - }; +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 +}; +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} +}; + +double cr_log1p(double x){ b64u64_u ix = {.f = x}; u64 ax = ix.u<<1; double ln1, ln0, eps; @@ -230,9 +273,9 @@ double cr_log1p(double x){ eps = x3*0x1.94p-52; } } else { - static const double c[] = - {-0x1p-1, 0x1.5555555555555p-2, -0x1.fffffffff2p-3, 0x1.99999999887e6p-3, - -0x1.5555c55570f25p-3, 0x1.2492b9217dbfep-3}; + 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)){ t.f = fasttwosum(1.0, x, &dt.f); @@ -249,23 +292,24 @@ double cr_log1p(double x){ return 0.0/0.0; // <-1 } } - } - u64 i = (t.u>>(52-5))&0x1f; - long d = t.u & (~0ul>>17); - i64 j = t.u + 13841960651842387968ul + ((u64)B[i].c0<<33) + ((long)B[i].c1*(d>>16)); - i64 j1 = (j>>48)&0xf, j2 = (j>>44)&0xf, je = j>>52; - i64 eoff = je<<52; - t.u -= eoff; - if(__builtin_expect(dt.u<<1, 1)) dt.u -= eoff; - double r = rt[0][j1]*rt[1][j2]; - double dh = r*t.f, dl = __builtin_fma(r,t.f,-dh) + r*dt.f; + } + 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 = ln[0][j1][2] + ln[1][j2][2] + L1; - ln0 = ln[0][j1][1] + ln[1][j2][1] + L0; + ln1 = lf[j1][1] + L1; + ln0 = lf[j1][0] + L0; ln1 = fastsum(ln1, ln0, xh, xl, &ln0); - eps = 0x1p-68; + eps = 0x1.ap-65; } double lb = ln1 + (ln0 - eps), ub = ln1 + (ln0 + eps); if(__builtin_expect(lb != ub, 0)) return as_log1p_refine(x, lb); @@ -322,7 +366,7 @@ static double __attribute__((noinline)) as_log1p_refine(double x, double a){ } else { if(__builtin_expect((i64)ix.u>=0x4690000000000000l, 0)) t.f = x; - else + else t.f = 1 + x; dt.u = 0; } @@ -355,7 +399,7 @@ static double __attribute__((noinline)) as_log1p_refine(double x, double a){ } 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}; From 329c8b9fa581c6d40ad4d04eceeed6f6b4b6bb12 Mon Sep 17 00:00:00 2001 From: Paul Zimmermann Date: Wed, 31 Jan 2024 09:21:49 +0100 Subject: [PATCH 07/27] added debug statements to isolate an invalid condition of fasttwosum() --- src/binary64/log1p/log1p.c | 22 ++++++++++++++++++++-- 1 file changed, 20 insertions(+), 2 deletions(-) diff --git a/src/binary64/log1p/log1p.c b/src/binary64/log1p/log1p.c index d8667597..6c4871cd 100644 --- a/src/binary64/log1p/log1p.c +++ b/src/binary64/log1p/log1p.c @@ -24,7 +24,9 @@ OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE SOFTWARE. */ +#include #include +#include // Warning: clang also defines __GNUC__ #if defined(__GNUC__) && !defined(__clang__) @@ -38,7 +40,14 @@ typedef int64_t i64; typedef unsigned short ushort; typedef union {double f; uint64_t u;} b64u64_u; +static int valid (double x, double y) { + return x == 0 || __builtin_fabs (x) >= __builtin_fabs (y); +} + static inline double fasttwosum(double x, double y, double *e){ + int ok = valid (x, y); + if (!ok) printf ("x=%la y=%la\n", x, y); + assert (ok); double s = x + y, z = s - x; *e = y - z; return s; @@ -51,6 +60,7 @@ static inline double twosum(double xh, double ch, double *l){ } static inline double fastsum(double xh, double xl, double yh, double yl, double *e){ + assert (valid (xh, yh)); double sl, sh = fasttwosum(xh, yh, &sl); *e = (xl + yl) + sl; return sh; @@ -76,6 +86,7 @@ static inline double mulddd(double x, double ch, double cl, double *l){ static inline double polydd(double xh, double xl, int n, const double c[][2], double *l){ int i = n-1; + assert (valid (c[i][0], *l)); double ch = fasttwosum(c[i][0], *l, l), cl = c[i][1] + *l; while(--i>=0){ ch = muldd(xh,xl, ch,cl, &cl); @@ -87,6 +98,7 @@ static inline double polydd(double xh, double xl, int n, const double c[][2], do static inline double polyddd(double x, int n, const double c[][2], double *l){ int i = n-1; + assert (valid (c[i][0], *l)); double ch = fasttwosum(c[i][0], *l, l), cl = c[i][1] + *l; while(--i>=0){ ch = mulddd(x, ch,cl, &cl); @@ -242,7 +254,7 @@ 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)){ + if(__builtin_expect(ax<0x7f60000000000000ul, 1)){ // |x| < 0.0625 double x2 = x*x; if(__builtin_expect(ax<0x7e60000000000000ul, 1)){ ln1 = x; @@ -272,12 +284,14 @@ double cr_log1p(double x){ ln0 += x3*f; eps = x3*0x1.94p-52; } - } else { + } 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)){ + if (!valid (1.0, x)) printf ("x=%la\n", x); + assert (valid (1.0, x)); t.f = fasttwosum(1.0, x, &dt.f); } else { if(__builtin_expect(ix.u<0x4690000000000000ul, 1)){ @@ -303,6 +317,7 @@ double cr_log1p(double x){ rs.f *= sc[je-1022]; } double dh = rs.f*t.f, dl = __builtin_fma(rs.f,t.f,-dh) + rs.f*dt.f; + assert (valid (dh-1.0, dl)); 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; @@ -376,6 +391,7 @@ static double __attribute__((noinline)) as_log1p_refine(double x, double a){ 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); + assert (valid (dh-1, dl)); double xl, xh = fasttwosum(dh-1, dl, &xl); xh = fastsum(xh, xl, sh, sl, &xl); if(dt.u){ @@ -397,7 +413,9 @@ static double __attribute__((noinline)) as_log1p_refine(double x, double a){ } ln21 = sum(ln21, ln20, sh, sl, &ln20); } + assert (valid (ln22,ln21)); ln22 = fasttwosum(ln22,ln21, &ln21); + assert (valid (ln21,ln20)); ln21 = fasttwosum(ln21,ln20, &ln20); b64u64_u t = {.f = ln21}; From 53496eda1e3626b0b8b3130d77a69e827c04cff5 Mon Sep 17 00:00:00 2001 From: Alexei Sibidanov Date: Wed, 31 Jan 2024 12:07:44 -0800 Subject: [PATCH 08/27] log1p: remove debug printout and add comments for lookup tables --- src/binary64/log1p/log1p.c | 28 ++++++++++------------------ 1 file changed, 10 insertions(+), 18 deletions(-) diff --git a/src/binary64/log1p/log1p.c b/src/binary64/log1p/log1p.c index 6c4871cd..6e8f9e3d 100644 --- a/src/binary64/log1p/log1p.c +++ b/src/binary64/log1p/log1p.c @@ -24,9 +24,7 @@ OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE SOFTWARE. */ -#include #include -#include // Warning: clang also defines __GNUC__ #if defined(__GNUC__) && !defined(__clang__) @@ -40,14 +38,7 @@ typedef int64_t i64; typedef unsigned short ushort; typedef union {double f; uint64_t u;} b64u64_u; -static int valid (double x, double y) { - return x == 0 || __builtin_fabs (x) >= __builtin_fabs (y); -} - static inline double fasttwosum(double x, double y, double *e){ - int ok = valid (x, y); - if (!ok) printf ("x=%la y=%la\n", x, y); - assert (ok); double s = x + y, z = s - x; *e = y - z; return s; @@ -60,7 +51,6 @@ static inline double twosum(double xh, double ch, double *l){ } static inline double fastsum(double xh, double xl, double yh, double yl, double *e){ - assert (valid (xh, yh)); double sl, sh = fasttwosum(xh, yh, &sl); *e = (xl + yl) + sl; return sh; @@ -86,7 +76,6 @@ static inline double mulddd(double x, double ch, double cl, double *l){ static inline double polydd(double xh, double xl, int n, const double c[][2], double *l){ int i = n-1; - assert (valid (c[i][0], *l)); double ch = fasttwosum(c[i][0], *l, l), cl = c[i][1] + *l; while(--i>=0){ ch = muldd(xh,xl, ch,cl, &cl); @@ -98,7 +87,6 @@ static inline double polydd(double xh, double xl, int n, const double c[][2], do static inline double polyddd(double x, int n, const double c[][2], double *l){ int i = n-1; - assert (valid (c[i][0], *l)); double ch = fasttwosum(c[i][0], *l, l), cl = c[i][1] + *l; while(--i>=0){ ch = mulddd(x, ch,cl, &cl); @@ -110,6 +98,11 @@ static inline double polyddd(double x, int n, const double c[][2], double *l){ static double __attribute__((noinline)) as_log1p_refine(double, double); +/* + 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, @@ -196,6 +189,11 @@ static const double ln[4][16][3] = { {0x1.4f787e495e5ep-93, -0x1.fbb791220a18p-46, 0x1.3682f14p-14}} }; +/* + 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, @@ -290,8 +288,6 @@ double cr_log1p(double x){ -0x1.555d345bfe6fdp-3, 0x1.247b887a6e5edp-3}; b64u64_u t, dt; if(__builtin_expect((i64)ix.u<0x4340000000000000l && ix.u<0xbff0000000000000ul, 1)){ - if (!valid (1.0, x)) printf ("x=%la\n", x); - assert (valid (1.0, x)); t.f = fasttwosum(1.0, x, &dt.f); } else { if(__builtin_expect(ix.u<0x4690000000000000ul, 1)){ @@ -317,7 +313,6 @@ double cr_log1p(double x){ rs.f *= sc[je-1022]; } double dh = rs.f*t.f, dl = __builtin_fma(rs.f,t.f,-dh) + rs.f*dt.f; - assert (valid (dh-1.0, dl)); 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; @@ -391,7 +386,6 @@ static double __attribute__((noinline)) as_log1p_refine(double x, double a){ 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); - assert (valid (dh-1, dl)); double xl, xh = fasttwosum(dh-1, dl, &xl); xh = fastsum(xh, xl, sh, sl, &xl); if(dt.u){ @@ -413,9 +407,7 @@ static double __attribute__((noinline)) as_log1p_refine(double x, double a){ } ln21 = sum(ln21, ln20, sh, sl, &ln20); } - assert (valid (ln22,ln21)); ln22 = fasttwosum(ln22,ln21, &ln21); - assert (valid (ln21,ln20)); ln21 = fasttwosum(ln21,ln20, &ln20); b64u64_u t = {.f = ln21}; From 8aea658d4727ab678ac2c0c3ea3000673e52a9ea Mon Sep 17 00:00:00 2001 From: Paul Zimmermann Date: Thu, 1 Feb 2024 09:43:36 +0100 Subject: [PATCH 09/27] fixed threshold values, and added comments --- src/binary64/log1p/log1p.c | 11 ++++++----- src/binary64/log1p/log1p.wc | 27 +++++++++++++++------------ 2 files changed, 21 insertions(+), 17 deletions(-) diff --git a/src/binary64/log1p/log1p.c b/src/binary64/log1p/log1p.c index 6e8f9e3d..cfa89339 100644 --- a/src/binary64/log1p/log1p.c +++ b/src/binary64/log1p/log1p.c @@ -254,11 +254,11 @@ double cr_log1p(double x){ double ln1, ln0, eps; if(__builtin_expect(ax<0x7f60000000000000ul, 1)){ // |x| < 0.0625 double x2 = x*x; - if(__builtin_expect(ax<0x7e60000000000000ul, 1)){ + if(__builtin_expect(ax<0x7e60000000000000ul, 1)){ // |x| < 0x1p-12 ln1 = x; eps = 0x1.6p-64*x; - if(__builtin_expect(ax<0x7d43360000000000ul, 1)){ - if(ax<0x7940000000000000ul){ + 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); } @@ -288,12 +288,13 @@ double cr_log1p(double x){ -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 t.f = fasttwosum(1.0, x, &dt.f); } else { - if(__builtin_expect(ix.u<0x4690000000000000ul, 1)){ + if(__builtin_expect(ix.u<0x4690000000000000ul, 1)){ // x < 0x1p+106 t.f = x; dt.f = 1; } else { - if(__builtin_expect(ix.u<0x7ff0000000000000ul, 1)){ + if(__builtin_expect(ix.u<0x7ff0000000000000ul, 1)){ // x < 0x1p+1024 t.f = x; dt.f = 0; } else { if((ix.u<<1)>0xffe0000000000000ul) return x; // nan diff --git a/src/binary64/log1p/log1p.wc b/src/binary64/log1p/log1p.wc index b9fb025c..eeed92ee 100644 --- a/src/binary64/log1p/log1p.wc +++ b/src/binary64/log1p/log1p.wc @@ -347436,21 +347436,24 @@ -0x1.f8d47a920aa11p-1 -0x1.f88870883b2ccp-1 # threshold values -0x1p+1015 -0x1.0000000000001p+1015 -0x1.fffffffffffffp+1014 -0x1p+999 -0x1.0000000000001p+999 -0x1.fffffffffffffp+998 -0x1.336p+981 -0x1.3360000000001p+981 -0x1.335ffffffffffp+981 -0x1p+917 -0x1.0000000000001p+917 -0x1.fffffffffffffp+916 +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 From ae4fd97fbad686439802f4f352810b055ce1fb58 Mon Sep 17 00:00:00 2001 From: Alexei Sibidanov Date: Thu, 1 Feb 2024 17:02:47 -0800 Subject: [PATCH 10/27] log1p: add comment for fasttwosum usage --- src/binary64/log1p/log1p.c | 6 ++++-- 1 file changed, 4 insertions(+), 2 deletions(-) diff --git a/src/binary64/log1p/log1p.c b/src/binary64/log1p/log1p.c index cfa89339..537004ae 100644 --- a/src/binary64/log1p/log1p.c +++ b/src/binary64/log1p/log1p.c @@ -288,7 +288,9 @@ double cr_log1p(double x){ -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 + // 0.0625 < x < 0x1p+53 or -1 < x < -0.0625 since the first + // argument 1.0 has mantissa 0 then the fasttwosum algorithm + // works well up to 0x1p+53 for the second argument t.f = fasttwosum(1.0, x, &dt.f); } else { if(__builtin_expect(ix.u<0x4690000000000000ul, 1)){ // x < 0x1p+106 @@ -297,7 +299,7 @@ double cr_log1p(double x){ if(__builtin_expect(ix.u<0x7ff0000000000000ul, 1)){ // x < 0x1p+1024 t.f = x; dt.f = 0; } else { - if((ix.u<<1)>0xffe0000000000000ul) return x; // nan + 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 From 75dfec4175e57887f7569f07e48771549f24615b Mon Sep 17 00:00:00 2001 From: Paul Zimmermann Date: Fri, 2 Feb 2024 10:17:45 +0100 Subject: [PATCH 11/27] improve a comment --- src/binary64/log1p/log1p.c | 8 +++++--- 1 file changed, 5 insertions(+), 3 deletions(-) diff --git a/src/binary64/log1p/log1p.c b/src/binary64/log1p/log1p.c index 537004ae..7331cb0f 100644 --- a/src/binary64/log1p/log1p.c +++ b/src/binary64/log1p/log1p.c @@ -288,9 +288,11 @@ double cr_log1p(double x){ -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 since the first - // argument 1.0 has mantissa 0 then the fasttwosum algorithm - // works well up to 0x1p+53 for the second argument + /* 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 From 63b46f5443aef0b55eeab1f79b5b01d4e1d960a1 Mon Sep 17 00:00:00 2001 From: Alexei Sibidanov Date: Thu, 15 Feb 2024 18:56:30 -0800 Subject: [PATCH 12/27] acos: lookup table size optimization using double angle range reduction --- src/binary64/acos/acos.c | 944 ++++++++++---------------------------- src/binary64/acos/acos.wc | 1 + 2 files changed, 234 insertions(+), 711 deletions(-) diff --git a/src/binary64/acos/acos.c b/src/binary64/acos/acos.c index 93c97414..cdaa0652 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,254 @@ 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){ + 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){ + 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)){ + if(ax==0x7fe0000000000000ul) return f0h + f0l; + if(ax>0xffe0000000000000ul) return x; // nan + errno = EDOM; + return 0./0.; } - /* 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; + 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 { + 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; } + 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){ + 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); + 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 From d4569546d24d38bec20f026f912cf91f47c00637 Mon Sep 17 00:00:00 2001 From: Alexei Sibidanov Date: Sat, 17 Feb 2024 11:26:09 -0800 Subject: [PATCH 13/27] acos: add comments --- src/binary64/acos/acos.c | 25 ++++++++++++++++++++----- 1 file changed, 20 insertions(+), 5 deletions(-) diff --git a/src/binary64/acos/acos.c b/src/binary64/acos/acos.c index cdaa0652..59533428 100644 --- a/src/binary64/acos/acos.c +++ b/src/binary64/acos/acos.c @@ -89,6 +89,9 @@ static inline double polydd(double xh, double xl, int n, const double c[][2], do static double __attribute__((noinline)) as_acos_refine(double, double); 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}, @@ -161,23 +164,29 @@ double cr_acos (double x){ b64u64_u ix = {.f = x}; u64 ax = ix.u<<1; double t,z,zl,jd,f0h,f0l; - if(ax>0x7fc0000000000000ul){ + 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)){ - if(ax==0x7fe0000000000000ul) return f0h + f0l; + 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.; + return 0./0.; // |x|>1 } + // 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 { + } 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); @@ -186,6 +195,8 @@ double cr_acos (double x){ 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]))); @@ -199,6 +210,9 @@ double cr_acos (double x){ } 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; @@ -209,6 +223,7 @@ double as_acos_refine(double x, double phi){ 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}, From e80706d2be606ab5fd98cf41e14887e97dfaf25d Mon Sep 17 00:00:00 2001 From: Paul Zimmermann Date: Fri, 22 Mar 2024 10:07:19 +0100 Subject: [PATCH 14/27] added comment --- src/binary64/cbrt/cbrt.c | 4 +++- 1 file changed, 3 insertions(+), 1 deletion(-) 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; From 177b68f0e7962ae6b9ee5c4e5d71953f679868c3 Mon Sep 17 00:00:00 2001 From: Paul Zimmermann Date: Fri, 22 Mar 2024 10:21:12 +0100 Subject: [PATCH 15/27] remove debug stuff --- src/binary80/support/check_worst_uni.c | 12 +++++------- 1 file changed, 5 insertions(+), 7 deletions(-) diff --git a/src/binary80/support/check_worst_uni.c b/src/binary80/support/check_worst_uni.c index 8dc0b70d..85a3f979 100644 --- a/src/binary80/support/check_worst_uni.c +++ b/src/binary80/support/check_worst_uni.c @@ -123,12 +123,12 @@ void doloop(void) { long double *items; - int count, tests = 0, failures = 0, skipped = 0; + int count, tests = 0, failures = 0; readstdin(&items, &count); #ifndef CORE_MATH_NO_OPENMP -#pragma omp parallel for reduction(+: failures,tests,skipped) +#pragma omp parallel for reduction(+: failures,tests) #endif for (int i = 0; i < count; i++) { ref_init(); @@ -139,8 +139,7 @@ doloop(void) long double z2 = cr_function_under_test(x); tests ++; /* Note: the test z1 != z2 would not distinguish +0 and -0. */ - if (z2 == -1) skipped ++; - if (z2 != -1 && is_equal (z1, z2) == 0) { + if (is_equal (z1, z2) == 0) { printf("FAIL x=%La ref=%La z=%La\n", x, z1, z2); fflush(stdout); #ifdef DO_NOT_ABORT @@ -154,8 +153,7 @@ doloop(void) z1 = ref_function_under_test(x); z2 = cr_function_under_test(x); tests ++; - if (z2 == -1) skipped ++; - if (z2 != -1 && is_equal (z1, z2) == 0) { + if (is_equal (z1, z2) == 0) { printf("FAIL x=%La ref=%La z=%La\n", x, z1, z2); fflush(stdout); #ifdef DO_NOT_ABORT @@ -168,7 +166,7 @@ doloop(void) } free(items); - printf("%d tests passed, %d failure(s), %d skipped\n", tests, failures, skipped); + printf("%d tests passed, %d failure(s)\n", tests, failures); } int From 0feec150b9f09aa8d4164827be208715ff38e7cb Mon Sep 17 00:00:00 2001 From: Alexei Sibidanov Date: Sun, 24 Mar 2024 12:32:06 -0700 Subject: [PATCH 16/27] add comments --- src/binary80/exp2/exp2l.c | 34 +++++++++++++++++++++------------- 1 file changed, 21 insertions(+), 13 deletions(-) diff --git a/src/binary80/exp2/exp2l.c b/src/binary80/exp2/exp2l.c index d4477900..cda9a1bc 100644 --- a/src/binary80/exp2/exp2l.c +++ b/src/binary80/exp2/exp2l.c @@ -422,10 +422,12 @@ 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^-85.803. + Returns a correctly rounded approximation to the long double format or + a flag that a more accurate approximation is needed. */ -static long double fast_path (int *H, long double x){ +static long double fast_path (int *needmoreaccuracy, long double x){ + // get current rounding mode unsigned flag = _mm_getcsr(), rm = (flag>>13)&3; b96u96_u v = {.f = x}; @@ -492,6 +494,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 compliment format long ml = (tl.u&~(0xfffl<<52))|1l<<52, sgnl = -(tl.u>>63); ml = (ml^sgnl) - sgnl; int64_t mlt; @@ -506,25 +510,29 @@ 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); + long eps = 0x10e*(mh>>30); // approximaton error 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==0){ // round to nearest mh += (uint64_t)ml>>63; ml <<= 1; - } else if(rm==2) { + } else if(rm==2) { // 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 +779,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; From 2a711cc8d1b4b27a4b007afdc85b787653ff6cb8 Mon Sep 17 00:00:00 2001 From: Paul Zimmermann Date: Mon, 25 Mar 2024 10:24:38 +0100 Subject: [PATCH 17/27] added more worst cases in the subnormal range --- src/binary80/exp2/exp2l.wc | 1457 ++++++++++++++++++++++++++++++++++++ 1 file changed, 1457 insertions(+) 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 From 018a530b288001a0dd1b0cfbd282d6b6305556d4 Mon Sep 17 00:00:00 2001 From: Paul Zimmermann Date: Mon, 25 Mar 2024 10:37:33 +0100 Subject: [PATCH 18/27] fixed typos --- src/binary80/exp2/exp2l.c | 8 ++++---- 1 file changed, 4 insertions(+), 4 deletions(-) diff --git a/src/binary80/exp2/exp2l.c b/src/binary80/exp2/exp2l.c index cda9a1bc..8c86af51 100644 --- a/src/binary80/exp2/exp2l.c +++ b/src/binary80/exp2/exp2l.c @@ -423,8 +423,8 @@ Pacc (long double *h, long double *l, long double x) /* Assume -16446 < x < -0x1.71547652b82fe176p-65 or 0x1.71547652b82fe176p-64 < x < 16384. Calculate an approximation of 2^x with relative error < 2^-85.803. - Returns a correctly rounded approximation to the long double format or - a flag that a more accurate approximation is needed. + 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 *needmoreaccuracy, long double x){ // get current rounding mode @@ -495,7 +495,7 @@ static long double fast_path (int *needmoreaccuracy, 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 compliment format + // 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; @@ -512,7 +512,7 @@ static long double fast_path (int *needmoreaccuracy, long double x){ } // construct the mantissa of the long double number uint64_t mh = ((th.u<<11)|1l<<63); - long eps = 0x10e*(mh>>30); // approximaton error + long eps = 0x10e*(mh>>30); // approximation error mh += mlt; if(__builtin_expect(!(mh>>63),0)){ // the low part is negative and // can unset the msb so shift the From 47ae90a92e868eb1ddca46989826fb240c515437 Mon Sep 17 00:00:00 2001 From: Paul Zimmermann Date: Mon, 25 Mar 2024 10:53:51 +0100 Subject: [PATCH 19/27] fixed approximation error --- src/binary80/exp2/exp2l.c | 6 ++++-- 1 file changed, 4 insertions(+), 2 deletions(-) diff --git a/src/binary80/exp2/exp2l.c b/src/binary80/exp2/exp2l.c index 8c86af51..7a3abbb7 100644 --- a/src/binary80/exp2/exp2l.c +++ b/src/binary80/exp2/exp2l.c @@ -422,7 +422,7 @@ Pacc (long double *h, long double *l, long double x) /* Assume -16446 < x < -0x1.71547652b82fe176p-65 or 0x1.71547652b82fe176p-64 < x < 16384. - Calculate an approximation of 2^x with relative error < 2^-85.803. + 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. */ @@ -512,7 +512,9 @@ static long double fast_path (int *needmoreaccuracy, long double x){ } // construct the mantissa of the long double number uint64_t mh = ((th.u<<11)|1l<<63); - long eps = 0x10e*(mh>>30); // approximation error + /* 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)){ // the low part is negative and // can unset the msb so shift the From ad498e0b97cf67dba646ad58e1773c5c9e244833 Mon Sep 17 00:00:00 2001 From: Paul Zimmermann Date: Thu, 28 Mar 2024 11:05:57 +0100 Subject: [PATCH 20/27] added item --- README.md | 1 + 1 file changed, 1 insertion(+) 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" From f50123b5f6b4decbc087fcd11185f9fc881c9317 Mon Sep 17 00:00:00 2001 From: Paul Zimmermann Date: Thu, 28 Mar 2024 11:25:46 +0100 Subject: [PATCH 21/27] added special checks for atan2f --- src/binary32/atan2/Makefile | 11 ++ src/binary32/atan2/check_special.c | 160 +++++++++++++++++++++++++++++ 2 files changed, 171 insertions(+) create mode 100644 src/binary32/atan2/check_special.c 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..2eb1482e --- /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 10000000 + +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; +} From 6a0aec2bb1ea18bb83dbfcf0ad71b426b1cccc3d Mon Sep 17 00:00:00 2001 From: Paul Zimmermann Date: Fri, 29 Mar 2024 07:30:44 +0100 Subject: [PATCH 22/27] increase number of tests --- src/binary32/atan2/check_special.c | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/src/binary32/atan2/check_special.c b/src/binary32/atan2/check_special.c index 2eb1482e..437ede30 100644 --- a/src/binary32/atan2/check_special.c +++ b/src/binary32/atan2/check_special.c @@ -83,7 +83,7 @@ check (float y, float x) } } -#define N 10000000 +#define N 1000000000 static void check_random (int i) From 47fb1c38f62716bdd405468edbbb6bf85845bcf1 Mon Sep 17 00:00:00 2001 From: Paul Zimmermann Date: Fri, 29 Mar 2024 09:09:11 +0100 Subject: [PATCH 23/27] added cbrtl --- ci.sh | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/ci.sh b/ci.sh index 2bdc3fa0..707501d3 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 cbrtl 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_SPECIAL=(atan2pif hypotf) echo "Reference commit is $LAST_COMMIT" From 4223a19c17260bf09e279dc7adbc467cb40c545b Mon Sep 17 00:00:00 2001 From: Paul Zimmermann Date: Fri, 29 Mar 2024 09:11:58 +0100 Subject: [PATCH 24/27] removed cbrtl (this was an error), added exp2l --- ci.sh | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/ci.sh b/ci.sh index 707501d3..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 cbrtl 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" From 2261959e244d7b85f72091965373a0d7af27e0dc Mon Sep 17 00:00:00 2001 From: Paul Zimmermann Date: Fri, 29 Mar 2024 09:18:07 +0100 Subject: [PATCH 25/27] added missing file --- src/binary80/exp2/function_under_test.h | 2 ++ 1 file changed, 2 insertions(+) create mode 100644 src/binary80/exp2/function_under_test.h 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 From 6c080dfe5d1889be445085d610cd64d83602cf1a Mon Sep 17 00:00:00 2001 From: Paul Zimmermann Date: Fri, 29 Mar 2024 09:31:32 +0100 Subject: [PATCH 26/27] make code more portable --- src/binary80/exp2/exp2l.c | 20 +++++++++++++++++--- 1 file changed, 17 insertions(+), 3 deletions(-) diff --git a/src/binary80/exp2/exp2l.c b/src/binary80/exp2/exp2l.c index 7a3abbb7..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; @@ -428,7 +442,7 @@ Pacc (long double *h, long double *l, long double x) */ static long double fast_path (int *needmoreaccuracy, long double x){ // get current rounding mode - unsigned flag = _mm_getcsr(), rm = (flag>>13)&3; + const unsigned rm = get_rounding_mode (); b96u96_u v = {.f = x}; // compute k = round(2^15*x) @@ -524,10 +538,10 @@ static long double fast_path (int *needmoreaccuracy, long double x){ e--; eps <<= 1; } - if(rm==0){ // round to nearest + if(rm==FE_TONEAREST){ // round to nearest mh += (uint64_t)ml>>63; ml <<= 1; - } else if(rm==2) { // round to +inf + } else if(rm==FE_UPWARD) { // round to +inf mh += 1; ml = -ml; } From 70a8740582485a25c814a9e2280b00ad136544cf Mon Sep 17 00:00:00 2001 From: Paul Zimmermann Date: Fri, 29 Mar 2024 10:00:16 +0100 Subject: [PATCH 27/27] check the long double format --- src/binary80/support/check_worst_uni.c | 19 +++++++++++++++++++ 1 file changed, 19 insertions(+) diff --git a/src/binary80/support/check_worst_uni.c b/src/binary80/support/check_worst_uni.c index 85a3f979..72347ecd 100644 --- a/src/binary80/support/check_worst_uni.c +++ b/src/binary80/support/check_worst_uni.c @@ -169,6 +169,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[]) { @@ -205,5 +222,7 @@ main (int argc, char *argv[]) } } + check_long_double (); + doloop(); }