xmm_power.c   [plain text]


/*
 *  pow.c
 *
 *      by Jeff Kidder.
 *
 *  Copyright (c) 2007, Apple Inc.  All Rights Reserved.
 *
 *  Implementation for C99 compliant float pow(double) 
 *
 *  Minimax polynomial by Ali Sazegari.
 */
 
#include <math.h>
#include <float.h>
#include "fenv.h"
#include <stdint.h>
//#include "required_arithmetic.h"

#ifndef DEBUG
  #define DEBUG 0
#endif 

#if DEBUG
  #include <stdio.h>
#endif

#ifndef ALWAYS_INLINE
  #if DEBUG
        #define ALWAYS_INLINE
  #else
        #define ALWAYS_INLINE __attribute__ ((always_inline))
  #endif
#endif

#include "xmmLibm_Prefix.h"

#define AVOID_64_BIT_INTS defined(__i386__)

//gcc logtable.c -o xlt -I./mpfr/include -L./mpfr/lib -lgmp -lmpfr -framework Accelerate -Wall && ./xlt 
typedef struct logdata_t {double hi; double lo; double inv; double lg1phi; double lg1plo; } logdata_t;

static const int A_ORIGIN = 64;
static const logdata_t A_LOOKUP[] = { //a{hi,lo}, va, lg1pa{hi,lo}: 1/va ~ 1+ahi+alo
    {-0x1.fffffe7fffffap-3, 0x1.8000006p-79, 0x1.555555p+0, -0x1.a8ff95a6bc2f6p-2, -0x1.3d82406f24c25p-59}, // -64 * 0x1p-8 = -0x1p-2
    {-0x1.f8000200a7ff5p-3, -0x1.720e0e2121555p-57, 0x1.539095p+0, -0x1.a152f32d1c481p-2, -0x1.e8bc9082edfep-58}, // -63 * 0x1p-8 = -0x1.f8p-3
    {-0x1.f0000177dfffap-3, -0x1.3df00582ffdebp-57, 0x1.51d07fp+0, -0x1.99b0740f363dap-2, 0x1.0f9d162e39146p-56}, // -62 * 0x1p-8 = -0x1.fp-3
    {-0x1.e7fffe8c47ffap-3, -0x1.db49fab940a0cp-57, 0x1.501501p+0, -0x1.9217ff324952cp-2, -0x1.cbbeaaa56a6a7p-56}, // -61 * 0x1p-8 = -0x1.e8p-3
    {-0x1.dffffde4ffff4p-3, -0x1.adfff013cffa8p-57, 0x1.4e5e0ap+0, -0x1.8a897eb027b02p-2, 0x1.4f8714574779dp-57}, // -60 * 0x1p-8 = -0x1.ep-3
    {-0x1.d7fffde23fff4p-3, -0x1.717fefff03fa8p-57, 0x1.4cab88p+0, -0x1.8304d7103dda3p-2, 0x1.98833591862b5p-56}, // -59 * 0x1p-8 = -0x1.d8p-3
    {-0x1.cfffffe74p-3, 0x1.8c0000063p-61, 0x1.4afd6ap+0, -0x1.7b89f015dd637p-2, 0x1.1d4ce385cfbe7p-57}, // -58 * 0x1p-8 = -0x1.dp-3
    {-0x1.c7fffee1efffdp-3, 0x1.b370049e3e20dp-58, 0x1.49539ep+0, -0x1.7418abe24a63dp-2, 0x1.fa37ab3d61feep-56}, // -57 * 0x1p-8 = -0x1.c8p-3
    {-0x1.bffffda7ffff2p-3, 0x1.00005460001fap-59, 0x1.47ae14p+0, -0x1.6cb0f45c5ddccp-2, 0x1.de975927718f4p-57}, // -56 * 0x1p-8 = -0x1.cp-3
    {-0x1.b7fffd8bdfff1p-3, 0x1.572017f608896p-57, 0x1.460cbcp+0, -0x1.6552b258722e2p-2, -0x1.2f241dca6fc3fp-56}, // -55 * 0x1p-8 = -0x1.b8p-3
    {-0x1.affffe52bfff9p-3, 0x1.02800f24aa04p-58, 0x1.446f86p+0, -0x1.5dfdcd968123p-2, 0x1.efb9d089cf90ap-56}, // -54 * 0x1p-8 = -0x1.bp-3
    {-0x1.a7fffe2a8fff8p-3, 0x1.ec9809ce63f2dp-57, 0x1.42d662p+0, -0x1.56b22cc04de54p-2, 0x1.c9bb0d879afd7p-57}, // -53 * 0x1p-8 = -0x1.a8p-3
    {-0x1.9ffffeb47fffcp-3, 0x1.ab0006d6bc016p-58, 0x1.414141p+0, -0x1.4f6fba00d7b94p-2, -0x1.77a3d5b250693p-56}, // -52 * 0x1p-8 = -0x1.ap-3
    {-0x1.98000019ap-3, 0x1.99fffff998p-61, 0x1.3fb014p+0, -0x1.48365e8072c0dp-2, 0x1.803dc35aa1904p-60}, // -51 * 0x1p-8 = -0x1.98p-3
    {-0x1.900001017fffdp-3, -0x1.f100019257ffcp-57, 0x1.3e22ccp+0, -0x1.4106026313941p-2, 0x1.5bb94c1280f7bp-56}, // -50 * 0x1p-8 = -0x1.9p-3
    {-0x1.87fffe88cfffbp-3, 0x1.403804d08cb11p-57, 0x1.3c995ap+0, -0x1.39de8cc6a56b9p-2, -0x1.c4556357fb55cp-56}, // -49 * 0x1p-8 = -0x1.88p-3
    {-0x1.7ffffec7ffffcp-3, -0x1.5ffffd41ffff8p-57, 0x1.3b13b1p+0, -0x1.32bfed220f8dbp-2, 0x1.a7efa69babda9p-58}, // -48 * 0x1p-8 = -0x1.8p-3
    {-0x1.7800014d17ffcp-3, 0x1.2de3f963db955p-58, 0x1.3991c3p+0, -0x1.2baa0d5b0d6cfp-2, 0x1.19d4b3cacb7eep-56}, // -47 * 0x1p-8 = -0x1.78p-3
    {-0x1.6ffffed21fffdp-3, 0x1.8f90026fcbe07p-57, 0x1.381381p+0, -0x1.249cd1a7c821ap-2, -0x1.82633f48991dp-58}, // -46 * 0x1p-8 = -0x1.7p-3
    {-0x1.67fffeafb7ffcp-3, 0x1.7f2c06ac55c55p-58, 0x1.3698dfp+0, -0x1.1d982b7703222p-2, 0x1.ef3e37d2edb56p-57}, // -45 * 0x1p-8 = -0x1.68p-3
    {-0x1.600001a7ffff9p-3, -0x1.8000069ffffe6p-57, 0x1.3521dp+0, -0x1.169c06a7938bbp-2, 0x1.13c37a49fc23fp-56}, // -44 * 0x1p-8 = -0x1.6p-3
    {-0x1.5800019cafffap-3, 0x1.f94ff3e59ea2fp-58, 0x1.33ae46p+0, -0x1.0fa8496a15078p-2, -0x1.557b896ea3a78p-56}, // -43 * 0x1p-8 = -0x1.58p-3
    {-0x1.500002099fff6p-3, -0x1.1140306cbe714p-59, 0x1.323e35p+0, -0x1.08bce29b7e937p-2, 0x1.ff263e711169p-59}, // -42 * 0x1p-8 = -0x1.5p-3
    {-0x1.47ffff948p-3, 0x1.ae00001aep-57, 0x1.30d19p+0, -0x1.01d9bb7350ffbp-2, 0x1.b68e9421e42b1p-58}, // -41 * 0x1p-8 = -0x1.48p-3
    {-0x1.400000d7ffffep-3, -0x1.400000d7ffffep-57, 0x1.2f684cp+0, -0x1.f5fd8c01b8598p-3, -0x1.2af9dd21de84ap-57}, // -40 * 0x1p-8 = -0x1.4p-3
    {-0x1.37ffffe4ep-3, 0x1.b2000006c8p-61, 0x1.2e025cp+0, -0x1.e857d3a536a7bp-3, -0x1.2ae5ac22439c5p-59}, // -39 * 0x1p-8 = -0x1.38p-3
    {-0x1.300000e79fffep-3, -0x1.3cc00415ee7f7p-59, 0x1.2c9fb5p+0, -0x1.dac22ec6addadp-3, 0x1.237db4a7636b7p-58}, // -38 * 0x1p-8 = -0x1.3p-3
    {-0x1.2800011897ffdp-3, -0x1.87d403993f0b7p-58, 0x1.2b404bp+0, -0x1.cd3c73066548p-3, -0x1.cf4b11e658fe5p-57}, // -37 * 0x1p-8 = -0x1.28p-3
    {-0x1.200002417fff4p-3, -0x1.41001f16abf5dp-58, 0x1.29e413p+0, -0x1.bfc67e497d02cp-3, 0x1.5f07d9233af02p-57}, // -36 * 0x1p-8 = -0x1.2p-3
    {-0x1.17ffff0e47ffep-3, 0x1.0c280484a978ap-59, 0x1.288b01p+0, -0x1.b2602303e0d2dp-3, -0x1.5b9ec49135187p-58}, // -35 * 0x1p-8 = -0x1.18p-3
    {-0x1.100002d17ffeep-3, 0x1.46ffe23b280c1p-57, 0x1.27350cp+0, -0x1.a509500525022p-3, 0x1.7a9c418d8486p-58}, // -34 * 0x1p-8 = -0x1.1p-3
    {-0x1.07ffffcf38p-3, 0x1.557800095648p-59, 0x1.25e227p+0, -0x1.97c1cac2fd722p-3, -0x1.49e502588505cp-57}, // -33 * 0x1p-8 = -0x1.08p-3
    {-0x1.fffffe3fffffcp-4, -0x1.fffffe3fffffcp-58, 0x1.249249p+0, -0x1.8a897f3aa75ccp-3, 0x1.b366c85648a5ap-58}, // -32 * 0x1p-8 = -0x1p-3
    {-0x1.f00005b67ffdbp-4, 0x1.11ff8750b031p-59, 0x1.234568p+0, -0x1.7d604e1d4e346p-3, 0x1.0ce3d95e5651ep-60}, // -31 * 0x1p-8 = -0x1.fp-4
    {-0x1.dfffff1dfffffp-4, -0x1.dfffff1dfffffp-60, 0x1.21fb78p+0, -0x1.70460263cfbd2p-3, 0x1.9fe6887659803p-58}, // -30 * 0x1p-8 = -0x1.ep-4
    {-0x1.d00002d38fff7p-4, 0x1.2d7f1a43efadcp-63, 0x1.20b471p+0, -0x1.633a8e40d66a7p-3, 0x1.8870b46556c8ap-57}, // -29 * 0x1p-8 = -0x1.dp-4
    {-0x1.c00001c7ffffcp-4, -0x1.c00001c7ffffcp-58, 0x1.1f7048p+0, -0x1.563dc4114f416p-3, 0x1.ca52b9f12ee9fp-58}, // -28 * 0x1p-8 = -0x1.cp-4
    {-0x1.b00003cd3fffp-4, 0x1.427fddaa56092p-59, 0x1.1e2ef4p+0, -0x1.494f894c616e5p-3, -0x1.9ae20a276fef6p-58}, // -27 * 0x1p-8 = -0x1.bp-4
    {-0x1.a00001e8bfffcp-4, 0x1.d2ffeec1fa025p-61, 0x1.1cf06bp+0, -0x1.3c6fb7d937a2ap-3, -0x1.fabc7d482f61bp-57}, // -26 * 0x1p-8 = -0x1.ap-4
    {-0x1.8fffffc64p-4, 0x1.ce00000738p-61, 0x1.1bb4a4p+0, -0x1.2f9e32a7954e4p-3, 0x1.11897da40f648p-59}, // -25 * 0x1p-8 = -0x1.9p-4
    {-0x1.7fffff17fffffp-4, -0x1.7fffff17fffffp-60, 0x1.1a7b96p+0, -0x1.22dadb72090e4p-3, 0x1.f4461b11bb8dp-59}, // -24 * 0x1p-8 = -0x1.8p-4
    {-0x1.6fffff8b8p-4, 0x1.d200000e9p-59, 0x1.194538p+0, -0x1.162592bc18896p-3, -0x1.889ff670a2c9ap-57}, // -23 * 0x1p-8 = -0x1.7p-4
    {-0x1.5ffffebe3fffep-4, -0x1.165fff67ec3ffp-58, 0x1.181181p+0, -0x1.097e37d076533p-3, 0x1.0d672c7895724p-59}, // -22 * 0x1p-8 = -0x1.6p-4
    {-0x1.500005ae0ffddp-4, 0x1.281793457ee21p-59, 0x1.16e069p+0, -0x1.f9c966af0bb0bp-4, -0x1.21ffac8a485cp-58}, // -21 * 0x1p-8 = -0x1.5p-4
    {-0x1.40000076p-4, 0x1.d7fffff14p-59, 0x1.15b1e6p+0, -0x1.e0b1af47da109p-4, 0x1.9dab517f95157p-59}, // -20 * 0x1p-8 = -0x1.4p-4
    {-0x1.300001ad8fffdp-4, 0x1.529ff4f9a3e14p-61, 0x1.1485f1p+0, -0x1.c7b52b547832ap-4, 0x1.6baa19b9f9395p-62}, // -19 * 0x1p-8 = -0x1.3p-4
    {-0x1.1ffffef43ffffp-4, 0x1.69c000a96f801p-59, 0x1.135c81p+0, -0x1.aed3900be76fcp-4, 0x1.aa87b52ee52c3p-58}, // -18 * 0x1p-8 = -0x1.2p-4
    {-0x1.0ffff994dffd4p-4, 0x1.03e097afaa813p-59, 0x1.12358ep+0, -0x1.960ca5af96cdp-4, -0x1.29c6aa0b462f4p-58}, // -17 * 0x1p-8 = -0x1.1p-4
    {-0x1.fffffe1fffffep-5, -0x1.fffffe1fffffep-61, 0x1.111111p+0, -0x1.7d6047fba73e7p-4, 0x1.f3c7d0da33a2dp-58}, // -16 * 0x1p-8 = -0x1p-4
    {-0x1.dffffe3c1fffep-5, -0x1.6177ff9cb608p-59, 0x1.0fef01p+0, -0x1.64ce256627e67p-4, -0x1.c92eb2b54a333p-59}, // -15 * 0x1p-8 = -0x1.ep-5
    {-0x1.c00007537ffe4p-5, 0x1.8e3fe47f8c86bp-59, 0x1.0ecf57p+0, -0x1.4c56157db2425p-4, -0x1.072624d45947ep-58}, // -14 * 0x1p-8 = -0x1.cp-5
    {-0x1.a0000d685ffa1p-5, -0x1.3b68a730c6ce3p-59, 0x1.0db20bp+0, -0x1.33f7d811b177p-4, -0x1.a92813604147cp-58}, // -13 * 0x1p-8 = -0x1.ap-5
    {-0x1.8000007ap-5, 0x1.e7fffff86p-61, 0x1.0c9715p+0, -0x1.1bb32abc5a676p-4, -0x1.307117f313841p-58}, // -12 * 0x1p-8 = -0x1.8p-5
    {-0x1.6000070edffe6p-5, 0x1.b67e801af0d88p-63, 0x1.0b7e6fp+0, -0x1.0387f50e8fdd9p-4, 0x1.e09f5e05261b8p-60}, // -11 * 0x1p-8 = -0x1.6p-5
    {-0x1.40000a547ffc8p-5, -0x1.e7404a9c5066fp-59, 0x1.0a6811p+0, -0x1.d6ebe1744ab54p-5, 0x1.6169c1a187949p-61}, // -10 * 0x1p-8 = -0x1.4p-5
    {-0x1.20000d067ffa8p-5, -0x1.420251782705ap-61, 0x1.0953f4p+0, -0x1.a6f9d6f1d16afp-5, 0x1.4703c3ec0059cp-59}, // -9 * 0x1p-8 = -0x1.2p-5
    {-0x1.00000e87fff93p-5, -0x1.000cc587fa037p-63, 0x1.084211p+0, -0x1.7739624188772p-5, 0x1.e1e1fb7ea4b7p-60}, // -8 * 0x1p-8 = -0x1p-5
    {-0x1.c00015a43ff88p-6, 0x1.868f5898382a3p-60, 0x1.073261p+0, -0x1.47aa174242a68p-5, -0x1.78a5b28f384fep-62}, // -7 * 0x1p-8 = -0x1.cp-6
    {-0x1.7ffff4c4fffep-6, 0x1.26801734eb043p-60, 0x1.0624ddp+0, -0x1.184b8600b1067p-5, 0x1.f72dde81305e6p-59}, // -6 * 0x1p-8 = -0x1.8p-6
    {-0x1.3fffe1d9bff18p-6, -0x1.cf9c851ec033fp-61, 0x1.05197fp+0, -0x1.d23acfec2e5e7p-6, -0x1.cc0694e8223dfp-62}, // -5 * 0x1p-8 = -0x1.4p-6
    {-0x1.fffffe08p-7, 0x1.f8000007ep-61, 0x1.041041p+0, -0x1.743ee6f09edf1p-6, 0x1.1ac84c0953b8cp-61}, // -4 * 0x1p-8 = -0x1p-6
    {-0x1.7fffd7f97ff35p-7, -0x1.7c5eff8c5a0eep-61, 0x1.03091bp+0, -0x1.16a200e9b243ap-6, -0x1.9e84c88c2a9fep-60}, // -3 * 0x1p-8 = -0x1.8p-7
    {-0x1.fffff01fffffp-8, -0x1.fffff01fffffp-64, 0x1.020408p+0, -0x1.72c7ae96537f8p-7, -0x1.cf9a702ff830ep-62}, // -2 * 0x1p-8 = -0x1p-7
    {-0x1.fffffe02p-9, 0x1.fe000001fep-65, 0x1.010101p+0, -0x1.720d9a9553bf9p-8, -0x1.bf85dcbd8a866p-62}, // -1 * 0x1p-8 = -0x1p-8
    {0x0p+0, 0x0p+0, 0x1p+0, 0x0p+0, 0x0p+0}, // 0 * 0x1p-8 = 0x0p+0
    {0x1.00000101p-8, 0x1.0100000101p-64, 0x1.fe01fep-1, 0x1.709c4848ff3ddp-8, -0x1.f86284455f0dfp-62}, // 1 * 0x1p-8 = 0x1p-8
    {0x1.0000081000008p-7, 0x1.0000081000008p-63, 0x1.fc07fp-1, 0x1.6fe516f994381p-7, -0x1.7c1ff82f44adcp-61}, // 2 * 0x1p-8 = 0x1p-7
    {0x1.7fffe7774004ap-7, 0x1.7a17c7a45e7ebp-61, 0x1.fa11cbp-1, 0x1.1362fffc7797cp-6, 0x1.f4876a1ea9f9bp-62}, // 3 * 0x1p-8 = 0x1.8p-7
    {0x1.fffffdf800001p-7, -0x1.f80000082p-61, 0x1.f81f82p-1, 0x1.6e7966ead8ac5p-6, -0x1.cba91dae29988p-60}, // 4 * 0x1p-8 = 0x1p-6
    {0x1.3ffff8fda000cp-6, 0x1.829fd69677d47p-63, 0x1.f6310bp-1, 0x1.c93631bd2c4b7p-6, 0x1.8575ca34d0306p-60}, // 5 * 0x1p-8 = 0x1.4p-6
    {0x1.7ffffc6b00003p-6, 0x1.12fffea0f6001p-61, 0x1.f4465ap-1, 0x1.11cd1acadf723p-5, -0x1.efa68b88a0ae7p-64}, // 6 * 0x1p-8 = 0x1.8p-6
    {0x1.c00008bb80013p-6, -0x1.c63ff624547ebp-60, 0x1.f25f64p-1, 0x1.3ed30f682c99bp-5, -0x1.8caa572b44451p-59}, // 7 * 0x1p-8 = 0x1.cp-6
    {0x1.00000084p-5, 0x1.080000042p-60, 0x1.f07c1fp-1, 0x1.6bad38119a13ap-5, -0x1.0f9994f222757p-60}, // 8 * 0x1p-8 = 0x1p-5
    {0x1.1ffff7b800021p-5, 0x1.ffff7b8000212p-61, 0x1.ee9c8p-1, 0x1.985bf0a9f1682p-5, 0x1.9d0544bf2b55bp-61}, // 9 * 0x1p-8 = 0x1.2p-5
    {0x1.4000033f40005p-5, 0x1.2d4007ed6b40cp-61, 0x1.ecc07bp-1, 0x1.c4dfb012d2a7fp-5, -0x1.7579e1c86e5eap-59}, // 10 * 0x1p-8 = 0x1.4p-5
    {0x1.5ffffa438001p-5, -0x1.cd0015b0c3fc4p-60, 0x1.eae808p-1, 0x1.f1389043d4afep-5, 0x1.b8b4ecc2bd1ecp-61}, // 11 * 0x1p-8 = 0x1.6p-5
    {0x1.7ffffb8d00009p-5, 0x1.d17ffafa2d00bp-59, 0x1.e9131bp-1, 0x1.0eb386e9567e7p-4, -0x1.b18d168d9858dp-62}, // 12 * 0x1p-8 = 0x1.8p-5
    {0x1.a000062c60012p-5, 0x1.12d01aa27434ep-60, 0x1.e741aap-1, 0x1.24b5bc1e1dbfcp-4, -0x1.a2efa461c33cfp-61}, // 13 * 0x1p-8 = 0x1.ap-5
    {0x1.bffff838c001dp-5, -0x1.45101a711549ep-59, 0x1.e573adp-1, 0x1.3aa2f88097a88p-4, -0x1.a5adebc35ec9cp-58}, // 14 * 0x1p-8 = 0x1.cp-5
    {0x1.dffff91e80016p-5, 0x1.737fedd48a03bp-59, 0x1.e3a918p-1, 0x1.507b7eafe13b6p-4, -0x1.67c359d084bc1p-58}, // 15 * 0x1p-8 = 0x1.ep-5
    {0x1.fffffde000002p-5, 0x1.fffffde000002p-61, 0x1.e1e1e2p-1, 0x1.663f6e3b3cbb2p-4, 0x1.3e721192791a3p-61}, // 16 * 0x1p-8 = 0x1p-4
    {0x1.0ffffeddf0001p-4, 0x1.a187ff5c45f81p-59, 0x1.e01e02p-1, 0x1.7beee7e3206a7p-4, -0x1.c6054c190ee99p-58}, // 17 * 0x1p-8 = 0x1.1p-4
    {0x1.2000024640005p-4, -0x1.55bffadd637f5p-59, 0x1.de5d6ep-1, 0x1.918a19f536b15p-4, -0x1.336be543a9993p-60}, // 18 * 0x1p-8 = 0x1.2p-4
    {0x1.2ffffe0d90004p-4, -0x1.e25401995c7bdp-58, 0x1.dca01ep-1, 0x1.a7111b55df32fp-4, -0x1.4f1d83f3e7e8cp-60}, // 19 * 0x1p-8 = 0x1.3p-4
    {0x1.400003e88000ep-4, 0x1.568019ad9905dp-59, 0x1.dae607p-1, 0x1.bc842945ace93p-4, -0x1.8fd5b9a815711p-58}, // 20 * 0x1p-8 = 0x1.4p-4
    {0x1.500001d370003p-4, 0x1.4cd0053319f09p-60, 0x1.d92f22p-1, 0x1.d1e350a4f6b57p-4, 0x1.45508587ec271p-60}, // 21 * 0x1p-8 = 0x1.5p-4
    {0x1.600002c860007p-4, 0x1.0bb00922df317p-59, 0x1.d77b65p-1, 0x1.e72ec4ca62caap-4, 0x1.8d32ff20ce97bp-60}, // 22 * 0x1p-8 = 0x1.6p-4
    {0x1.70000045cp-4, 0x1.170000045cp-60, 0x1.d5cac8p-1, 0x1.fc66a14d0527ep-4, -0x1.9476863d87a59p-60}, // 23 * 0x1p-8 = 0x1.7p-4
    {0x1.7ffffe5c00002p-4, 0x1.d7ffff13c0001p-58, 0x1.d41d42p-1, 0x1.08c587b8a8459p-3, -0x1.eaebfe80f652ap-57}, // 24 * 0x1p-8 = 0x1.8p-4
    {0x1.90000266b0005p-4, 0x1.028402df580c6p-58, 0x1.d272cap-1, 0x1.134e1cdc84c46p-3, 0x1.8280d2b9d2e4ep-57}, // 25 * 0x1p-8 = 0x1.9p-4
    {0x1.9fffffa7ep-4, 0x1.b89ffff764ep-60, 0x1.d0cb59p-1, 0x1.1dcd193b9d854p-3, -0x1.9c8f4e7f2e39fp-57}, // 26 * 0x1p-8 = 0x1.ap-4
    {0x1.affffdb850005p-4, -0x1.3094026cbcebbp-58, 0x1.cf26e6p-1, 0x1.284293339b4a1p-3, -0x1.f513c53ec0906p-58}, // 27 * 0x1p-8 = 0x1.bp-4
    {0x1.bffffbb380011p-4, -0x1.5e4010232c7c1p-58, 0x1.cd8569p-1, 0x1.32ae9b5bf73ccp-3, -0x1.ea3729015b5c1p-57}, // 28 * 0x1p-8 = 0x1.cp-4
    {0x1.d00003b8f800cp-4, 0x1.c9f50a67b4b5bp-58, 0x1.cbe6d9p-1, 0x1.3d11494321dc5p-3, 0x1.d20de6a527ce2p-59}, // 29 * 0x1p-8 = 0x1.dp-4
    {0x1.e000035a0000ap-4, 0x1.c0003c54000b5p-61, 0x1.ca4b3p-1, 0x1.476aa1c23e268p-3, 0x1.8bdb8834b12ffp-58}, // 30 * 0x1p-8 = 0x1.ep-4
    {0x1.effffcd8d0009p-4, -0x1.0e480c787d55dp-59, 0x1.c8b266p-1, 0x1.51bab70047027p-3, -0x1.1117308935bc2p-58}, // 31 * 0x1p-8 = 0x1.fp-4
    {0x1.fffffdc000004p-4, 0x1.fffffdc000004p-58, 0x1.c71c72p-1, 0x1.5c01a22e68f24p-3, -0x1.a8e7cd17ca46cp-59}, // 32 * 0x1p-8 = 0x1p-3
    {0x1.08000055ccp-3, 0x1.9789000f1f958p-58, 0x1.c5894dp-1, 0x1.663f701a36449p-3, -0x1.66ef1d80ba98cp-57}, // 33 * 0x1p-8 = 0x1.08p-3
    {0x1.1000009100001p-3, -0x1.bbffffdbcp-57, 0x1.c3f8fp-1, 0x1.70742e079a632p-3, 0x1.bd6b99f1a542fp-59}, // 34 * 0x1p-8 = 0x1.1p-3
    {0x1.17fffdcc30009p-3, -0x1.dce808447fcep-57, 0x1.c26b54p-1, 0x1.7a9fe9b17239p-3, 0x1.5e7a42808635dp-57}, // 35 * 0x1p-8 = 0x1.18p-3
    {0x1.2000012400002p-3, 0x1.2000012400002p-57, 0x1.c0e07p-1, 0x1.84c2be7444b1ap-3, -0x1.95599ba086466p-57}, // 36 * 0x1p-8 = 0x1.2p-3
    {0x1.27ffff8464p-3, 0x1.a12e7fea000c4p-57, 0x1.bf583fp-1, 0x1.8edcade78314dp-3, 0x1.24b65cd1dd74dp-57}, // 37 * 0x1p-8 = 0x1.28p-3
    {0x1.2ffffde1f0008p-3, -0x1.89280e6563c4bp-58, 0x1.bdd2b9p-1, 0x1.98edcdcef3541p-3, 0x1.890aa22cbe631p-57}, // 38 * 0x1p-8 = 0x1.3p-3
    {0x1.380001d628006p-3, -0x1.2b03f6ab91ca2p-58, 0x1.bc4fd6p-1, 0x1.a2f6347eaa238p-3, -0x1.3947af6cfd995p-57}, // 39 * 0x1p-8 = 0x1.38p-3
    {0x1.4000019700004p-3, 0x1.7d0003017c008p-57, 0x1.bacf91p-1, 0x1.acf5e4d722ec2p-3, -0x1.d0389e7ca40dcp-58}, // 40 * 0x1p-8 = 0x1.4p-3
    {0x1.47fffe59b4005p-3, -0x1.3c5f8355c5063p-57, 0x1.b951e3p-1, 0x1.b6ecef68d5468p-3, 0x1.f2fa768fd19b9p-57}, // 41 * 0x1p-8 = 0x1.48p-3
    {0x1.4fffff45c0001p-3, -0x1.7300012303fffp-59, 0x1.b7d6c4p-1, 0x1.c0db6bf6c015p-3, -0x1.a829cc1512df9p-57}, // 42 * 0x1p-8 = 0x1.5p-3
    {0x1.5800014708003p-3, -0x1.a4f3fcf18d5b9p-58, 0x1.b65e2ep-1, 0x1.cac1655b653e1p-3, -0x1.f429423a6ef0ap-61}, // 43 * 0x1p-8 = 0x1.58p-3
    {0x1.600001af40005p-3, -0x1.413ff909b97ecp-58, 0x1.b4e81bp-1, 0x1.d49ee6d60f014p-3, 0x1.95845c18cb6e6p-58}, // 44 * 0x1p-8 = 0x1.6p-3
    {0x1.67fffe37cc005p-3, 0x1.9b767be80c0d8p-57, 0x1.b37485p-1, 0x1.de73fc0b507ddp-3, -0x1.1e79902c3d7fap-58}, // 45 * 0x1p-8 = 0x1.68p-3
    {0x1.70000025cp-3, 0x1.2e000004b8p-60, 0x1.b20364p-1, 0x1.e840bea311339p-3, 0x1.cbfe95c59cb8ap-57}, // 46 * 0x1p-8 = 0x1.7p-3
    {0x1.780000a5b4001p-3, -0x1.2b0c7fce715acp-57, 0x1.b094b3p-1, 0x1.f205345c03233p-3, 0x1.36b400859e299p-60}, // 47 * 0x1p-8 = 0x1.78p-3
    {0x1.7ffffed000002p-3, 0x1.7ffffed000002p-57, 0x1.af286cp-1, 0x1.fbc16a1ed20a6p-3, 0x1.a5e946d48367ep-57}, // 48 * 0x1p-8 = 0x1.8p-3
    {0x1.87ffffd9ep-3, 0x1.30fffffb3cp-60, 0x1.adbe88p-1, 0x1.02baba0dbb1edp-2, 0x1.ad0869df3855cp-56}, // 49 * 0x1p-8 = 0x1.88p-3
    {0x1.8ffffe21e0006p-3, -0x1.4ee0091e983e4p-58, 0x1.ac5702p-1, 0x1.0790ac9a79044p-2, 0x1.3ee2f0e46be64p-57}, // 50 * 0x1p-8 = 0x1.9p-3
    {0x1.97ffffd4d4p-3, 0x1.848bfff92b8ap-60, 0x1.aaf1d3p-1, 0x1.0c62973b4ab8ap-2, -0x1.d1b4e1b85f444p-56}, // 51 * 0x1p-8 = 0x1.98p-3
    {0x1.a00000268p-3, 0x1.34000004dp-60, 0x1.a98ef6p-1, 0x1.11307dc445fecp-2, 0x1.05224944efccp-57}, // 52 * 0x1p-8 = 0x1.ap-3
    {0x1.a800006f0cp-3, 0x1.3f42800e577ccp-57, 0x1.a82e65p-1, 0x1.15fa67ae0dbd4p-2, -0x1.835b07373839fp-56}, // 53 * 0x1p-8 = 0x1.a8p-3
    {0x1.b000027f6000ap-3, 0x1.35b00a9fd762cp-57, 0x1.a6d01ap-1, 0x1.1ac05ca5fe214p-2, -0x1.1c2140fbe02dbp-56}, // 54 * 0x1p-8 = 0x1.bp-3
    {0x1.b80002bbc000cp-3, 0x1.33800dd67c03ep-57, 0x1.a5741p-1, 0x1.1f82610d07e69p-2, -0x1.7119b483d65e3p-56}, // 55 * 0x1p-8 = 0x1.b8p-3
    {0x1.bffffdde00007p-3, 0x1.dbfff977e0017p-57, 0x1.a41a42p-1, 0x1.2440796db68c3p-2, 0x1.8de37e9a6110bp-57}, // 56 * 0x1p-8 = 0x1.cp-3
    {0x1.c80002e76000ep-3, -0x1.a7bfdf3dccf64p-58, 0x1.a2c2a8p-1, 0x1.28fab511c6b5p-2, -0x1.9ec26959b16eep-56}, // 57 * 0x1p-8 = 0x1.c8p-3
    {0x1.cffffd8c0000ap-3, -0x1.8000139ffffb2p-58, 0x1.a16d4p-1, 0x1.2db10e538534dp-2, 0x1.31cb428346b53p-57}, // 58 * 0x1p-8 = 0x1.dp-3
    {0x1.d7fffdbb38008p-3, 0x1.7685f849af1fcp-57, 0x1.a01a02p-1, 0x1.326394e238a67p-2, -0x1.abc179fe7b4a3p-57}, // 59 * 0x1p-8 = 0x1.d8p-3
    {0x1.e00001edc0006p-3, 0x1.be004b571c0ebp-61, 0x1.9ec8e9p-1, 0x1.37124e0ad6db6p-2, -0x1.66636d9999ce2p-56}, // 60 * 0x1p-8 = 0x1.ep-3
    {0x1.e80002d81c00dp-3, 0x1.0c0a3c04f4f04p-59, 0x1.9d79f1p-1, 0x1.3bbd3bb244cfdp-2, -0x1.b12bb7a1584cdp-56}, // 61 * 0x1p-8 = 0x1.e8p-3
    {0x1.efffff92bp-3, 0x1.2c9bfff3154cp-57, 0x1.9c2d15p-1, 0x1.4064637235c04p-2, 0x1.405468a8fd423p-57}, // 62 * 0x1p-8 = 0x1.fp-3
    {0x1.f7fffdccc4008p-3, -0x1.d8a10db7b0748p-58, 0x1.9ae24fp-1, 0x1.4507cea7c86bfp-2, -0x1.ef9753db3d35cp-56}, // 63 * 0x1p-8 = 0x1.f8p-3
    {0x1.fffffd800000ap-3, -0x1.3fffffbp-78, 0x1.99999ap-1, 0x1.49a7834b7d429p-2, -0x1.2a4397d8912bap-56}, // 64 * 0x1p-8 = 0x1p-2
    {0x1.03ffff851e001p-2, -0x1.0f57c048081a2p-56, 0x1.9852f1p-1, 0x1.4e4387812d616p-2, -0x1.4aada8ecbe851p-56}, // 65 * 0x1p-8 = 0x1.04p-2
    {0x1.07fffe6d80008p-2, -0x1.1c0013a73ff9ep-57, 0x1.970e5p-1, 0x1.52dbddf71fd7ap-2, -0x1.d9b1af94a58afp-56}, // 66 * 0x1p-8 = 0x1.08p-2
    {0x1.0bffff2e8e002p-2, 0x1.f3fafa7ef2d06p-58, 0x1.95cbb1p-1, 0x1.577090c3bac8p-2, 0x1.35997fa38deabp-56}, // 67 * 0x1p-8 = 0x1.0cp-2
    {0x1.0fffff5e00001p-2, 0x1.0fffff5e00001p-56, 0x1.948b1p-1, 0x1.5c01a2e7132d6p-2, -0x1.ebb9c6fdca778p-57}, // 68 * 0x1p-8 = 0x1.1p-2
    {0x1.13ffffebbp-2, 0x1.44fffffaecp-60, 0x1.934c68p-1, 0x1.608f1b2b7f437p-2, 0x1.1c6a1e011a9d3p-56}, // 69 * 0x1p-8 = 0x1.14p-2
    {0x1.17fffebf18005p-2, -0x1.06e8136f4ce33p-58, 0x1.920fb5p-1, 0x1.6518fcdae8962p-2, 0x1.a0f56285014a5p-58}, // 70 * 0x1p-8 = 0x1.18p-2
    {0x1.1c000068be001p-2, -0x1.e7323fd503862p-56, 0x1.90d4f1p-1, 0x1.699f52bf1a597p-2, 0x1.c7e9aa36e3377p-58}, // 71 * 0x1p-8 = 0x1.1cp-2
    {0x1.1fffffeb8p-2, 0x1.47fffffaep-60, 0x1.8f9c19p-1, 0x1.6e221cc2bb868p-2, 0x1.edf2c59ace244p-60}, // 72 * 0x1p-8 = 0x1.2p-2
    {0x1.23fffef4b0003p-2, 0x1.930ffd3e20c09p-56, 0x1.8e6528p-1, 0x1.72a16250a7782p-2, 0x1.21efbc62ffae4p-56}, // 73 * 0x1p-8 = 0x1.24p-2
    {0x1.27ffff6a78001p-2, 0x1.e0cffc2988707p-59, 0x1.8d3019p-1, 0x1.771d2b00956e3p-2, -0x1.6e767d0931aecp-56}, // 74 * 0x1p-8 = 0x1.28p-2
    {0x1.2c000014bp-2, 0x1.4b0000052cp-60, 0x1.8bfce8p-1, 0x1.7b957adc2ff3bp-2, -0x1.4c06dd77b651ap-56}, // 75 * 0x1p-8 = 0x1.2cp-2
    {0x1.2fffffe0ep-2, 0x1.757ffff73fp-59, 0x1.8acb91p-1, 0x1.800a560ec1da3p-2, -0x1.0b9e56cf905cep-56}, // 76 * 0x1p-8 = 0x1.3p-2
    {0x1.3400014532005p-2, -0x1.3695d93bd3959p-59, 0x1.899c0fp-1, 0x1.847bc4a632949p-2, 0x1.52bd8b4db8954p-56}, // 77 * 0x1p-8 = 0x1.34p-2
    {0x1.3800002488p-2, 0x1.ff70000dfc1p-59, 0x1.886e5fp-1, 0x1.88e9c756705f5p-2, -0x1.06c488ef0896dp-56}, // 78 * 0x1p-8 = 0x1.38p-2
    {0x1.3bffff4e08001p-2, 0x1.e8bbff3717082p-56, 0x1.87427cp-1, 0x1.8d54667727585p-2, -0x1.0da1847e392aap-56}, // 79 * 0x1p-8 = 0x1.3cp-2
    {0x1.3ffffe5c00008p-2, 0x1.9fffeb7e00067p-57, 0x1.861862p-1, 0x1.91bba6c447dcfp-2, -0x1.fc48be2eed2eap-57}, // 80 * 0x1p-8 = 0x1.4p-2
    {0x1.44000088e8001p-2, -0x1.0c37ff4b3daffp-57, 0x1.84f00cp-1, 0x1.961f90e87e59dp-2, 0x1.0459ae579f766p-57}, // 81 * 0x1p-8 = 0x1.44p-2
    {0x1.47fffed840004p-2, 0x1.63ffe3b220063p-59, 0x1.83c978p-1, 0x1.9a80224eb84b9p-2, -0x1.bcddc6a14952cp-58}, // 82 * 0x1p-8 = 0x1.48p-2
    {0x1.4c000054cp-2, 0x1.530000153p-56, 0x1.82a4ap-1, 0x1.9edd67b6077b9p-2, 0x1.e66b4be819a59p-62}, // 83 * 0x1p-8 = 0x1.4cp-2
    {0x1.4ffffe41c0009p-2, 0x1.367fe7fa1e07ep-57, 0x1.818182p-1, 0x1.a3375ec3372a1p-2, -0x1.995570a48531ep-57}, // 84 * 0x1p-8 = 0x1.5p-2
    {0x1.540000155p-2, 0x1.5500000554p-60, 0x1.806018p-1, 0x1.a78e14869136bp-2, -0x1.5f8c8621ab322p-56}, // 85 * 0x1p-8 = 0x1.54p-2
    {0x1.57ffff5500001p-2, 0x1.57ffff5500001p-56, 0x1.7f406p-1, 0x1.abe186df47b97p-2, 0x1.234b98e55c106p-60}, // 86 * 0x1p-8 = 0x1.58p-2
    {0x1.5c00004db6p-2, 0x1.19b3c00ff4ae6p-56, 0x1.7e2255p-1, 0x1.b031bf51b3661p-2, 0x1.e098e06ca2c7fp-56}, // 87 * 0x1p-8 = 0x1.5cp-2
    {0x1.60000056p-2, 0x1.580000158p-56, 0x1.7d05f4p-1, 0x1.b47ebfcfdd47ap-2, 0x1.d1fbd4b1ef502p-58}, // 88 * 0x1p-8 = 0x1.6p-2
    {0x1.6400007eae001p-2, -0x1.17c1bfbbae492p-56, 0x1.7beb39p-1, 0x1.b8c88e47256b1p-2, 0x1.063a29db687f8p-57}, // 89 * 0x1p-8 = 0x1.64p-2
    {0x1.67fffe5fb8008p-2, -0x1.652c12d491be5p-57, 0x1.7ad221p-1, 0x1.bd0f2ce21f64fp-2, 0x1.0111bb25b7302p-57}, // 90 * 0x1p-8 = 0x1.68p-2
    {0x1.6bffff03e2003p-2, -0x1.1a468428ba31p-57, 0x1.79baa7p-1, 0x1.c152a5b5f5508p-2, -0x1.dc436fa3a276ep-57}, // 91 * 0x1p-8 = 0x1.6cp-2
    {0x1.70000057p-2, 0x1.5c000015cp-56, 0x1.78a4c8p-1, 0x1.c592fb2eead3p-2, -0x1.0eb98c5df43eap-59}, // 92 * 0x1p-8 = 0x1.7p-2
    {0x1.7400005f6ep-2, 0x1.a181401c8a55ep-56, 0x1.779081p-1, 0x1.c9d02fd1a193ap-2, -0x1.2d7ff6376746bp-56}, // 93 * 0x1p-8 = 0x1.74p-2
    {0x1.780000fb90003p-2, -0x1.660ffbf056df4p-57, 0x1.767dcep-1, 0x1.ce0a4a2d1a3cfp-2, -0x1.c50ac20cc5c35p-62}, // 94 * 0x1p-8 = 0x1.78p-2
    {0x1.7c000078a8001p-2, -0x1.6863ffc6f898p-56, 0x1.756cacp-1, 0x1.d2414cffb4308p-2, 0x1.c14cf0a11cb4dp-56}, // 95 * 0x1p-8 = 0x1.7cp-2
    {0x1.8000010800003p-2, 0x1.800009480001cp-58, 0x1.745d17p-1, 0x1.d6753f182df9cp-2, 0x1.f98007f0a5227p-56}, // 96 * 0x1p-8 = 0x1.8p-2
    {0x1.8400013fe8005p-2, -0x1.e15bfbe50ed71p-56, 0x1.734f0cp-1, 0x1.daa6236f1986fp-2, 0x1.e7a7aa5b58758p-59}, // 97 * 0x1p-8 = 0x1.84p-2
    {0x1.87ffffd3cp-2, 0x1.61fffff4fp-58, 0x1.724288p-1, 0x1.ded3fd15f8d6p-2, -0x1.2caa8abe0356cp-56}, // 98 * 0x1p-8 = 0x1.88p-2
    {0x1.8bffff6d02001p-2, -0x1.916a03267286bp-59, 0x1.713787p-1, 0x1.e2fed337aa309p-2, -0x1.5db766d2b662ap-56}, // 99 * 0x1p-8 = 0x1.8cp-2
    {0x1.8fffff0b40003p-2, -0x1.7bc001cebaffbp-56, 0x1.702e06p-1, 0x1.e726a9208b3bep-2, -0x1.23b4c757e83b3p-57}, // 100 * 0x1p-8 = 0x1.9p-2
    {0x1.940001b04e008p-2, 0x1.6fce93cf5909cp-57, 0x1.6f2601p-1, 0x1.eb4b863c52047p-2, 0x1.1bc6713d1d5cdp-58}, // 101 * 0x1p-8 = 0x1.94p-2
    {0x1.97fffed788004p-2, -0x1.4f94065a865abp-57, 0x1.6e1f77p-1, 0x1.ef6d6600b4303p-2, -0x1.416600fbb0053p-56}, // 102 * 0x1p-8 = 0x1.98p-2
    {0x1.9c0001997c007p-2, 0x1.31170852ff916p-56, 0x1.6d1a62p-1, 0x1.f38c582110ab4p-2, -0x1.0b8ee83775524p-59}, // 103 * 0x1p-8 = 0x1.9cp-2
    {0x1.a00001ab80008p-2, -0x1.15ffda5287f4dp-58, 0x1.6c16c1p-1, 0x1.f7a8584344b9bp-2, 0x1.b27adfaae2d4ap-61}, // 104 * 0x1p-8 = 0x1.ap-2
    {0x1.a3fffeaabe005p-2, 0x1.4c31d9e17e38p-59, 0x1.6b1491p-1, 0x1.fbc16a3304a8fp-2, 0x1.49b0116ffdab6p-58}, // 105 * 0x1p-8 = 0x1.a4p-2
    {0x1.a8000054d8p-2, 0x1.3e2a0012a476p-56, 0x1.6a13cdp-1, 0x1.ffd799fecfc57p-2, -0x1.9db596f39084cp-56}, // 106 * 0x1p-8 = 0x1.a8p-2
    {0x1.abfffea058005p-2, 0x1.4aabfad7ea594p-56, 0x1.691474p-1, 0x1.01f571c44164cp-1, 0x1.2eeb40ee79da5p-55}, // 107 * 0x1p-8 = 0x1.acp-2
    {0x1.b00001a4e0008p-2, -0x1.95cff7354e1d7p-56, 0x1.681681p-1, 0x1.03fda98efe6c8p-1, -0x1.8603949cae8fp-55}, // 108 * 0x1p-8 = 0x1.bp-2
    {0x1.b4000186aa007p-2, -0x1.dde0b901dea18p-56, 0x1.6719f3p-1, 0x1.06047264cb1e9p-1, 0x1.3f3fe82b9480ap-58}, // 109 * 0x1p-8 = 0x1.b4p-2
    {0x1.b7fffe8c48006p-2, -0x1.9e4817f6cfb1fp-58, 0x1.661ec7p-1, 0x1.0809ce6c6a1fdp-1, 0x1.bce3988585c83p-55}, // 110 * 0x1p-8 = 0x1.b8p-2
    {0x1.bc00015810005p-2, 0x1.478025ccc208ep-59, 0x1.6524f8p-1, 0x1.0a0dc3fcadb74p-1, 0x1.c438c2e4a4e9fp-55}, // 111 * 0x1p-8 = 0x1.bcp-2
    {0x1.bffffe3400009p-2, -0x1.0000b3afffc7ep-60, 0x1.642c86p-1, 0x1.0c104f268ee09p-1, 0x1.7991c3b3db30ap-55}, // 112 * 0x1p-8 = 0x1.cp-2
    {0x1.c3fffe102800ap-2, 0x1.a4a3f202b0ecbp-56, 0x1.63356cp-1, 0x1.0e11765cb301cp-1, -0x1.2aaa537074de6p-55}, // 113 * 0x1p-8 = 0x1.c4p-2
    {0x1.c80001d448009p-2, 0x1.0ab20bb86255bp-56, 0x1.623fa7p-1, 0x1.10113bfef401bp-1, -0x1.7e0f121061ab1p-56}, // 114 * 0x1p-8 = 0x1.c8p-2
    {0x1.cbfffdf36200cp-2, -0x1.a28950640a751p-56, 0x1.614b37p-1, 0x1.120f9c34c0c9p-1, -0x1.dfe1162f7b692p-55}, // 115 * 0x1p-8 = 0x1.ccp-2
    {0x1.d00000174p-2, 0x1.74000005dp-60, 0x1.605816p-1, 0x1.140c9fb5a8f7fp-1, -0x1.b8e77375e280ep-56}, // 116 * 0x1p-8 = 0x1.dp-2
    {0x1.d400011aaa003p-2, 0x1.634d428950232p-56, 0x1.5f6643p-1, 0x1.160844d54f014p-1, 0x1.8905ac4825bc1p-56}, // 117 * 0x1p-8 = 0x1.d4p-2
    {0x1.d7fffe152000ap-2, 0x1.117fcb2642115p-58, 0x1.5e75bcp-1, 0x1.18028c04ca092p-1, 0x1.9995c81c00c2dp-55}, // 118 * 0x1p-8 = 0x1.d8p-2
    {0x1.dc00010d88003p-2, 0x1.b9c022cf60864p-60, 0x1.5d867cp-1, 0x1.19fb7c13ec9cbp-1, -0x1.d0bd1c8ee7f6dp-55}, // 119 * 0x1p-8 = 0x1.dcp-2
    {0x1.dffffece80004p-2, -0x1.f2000c9ad7fd7p-58, 0x1.5c9883p-1, 0x1.1bf3115352b0ep-1, -0x1.089d86505232dp-55}, // 120 * 0x1p-8 = 0x1.ep-2
    {0x1.e40001b3e8008p-2, -0x1.feefdb93b1558p-58, 0x1.5babccp-1, 0x1.1de952af508efp-1, -0x1.f26b3411a7b5dp-55}, // 121 * 0x1p-8 = 0x1.e4p-2
    {0x1.e7fffea388005p-2, 0x1.3e9fb5f691311p-60, 0x1.5ac057p-1, 0x1.1fde3c86ab23fp-1, -0x1.2f6561c930d55p-56}, // 122 * 0x1p-8 = 0x1.e8p-2
    {0x1.ec00004ff2p-2, 0x1.0dd0c00e3a822p-56, 0x1.59d61fp-1, 0x1.21d1d5e261422p-1, -0x1.2a954f2219ae1p-57}, // 123 * 0x1p-8 = 0x1.ecp-2
    {0x1.f0000023ap-2, 0x1.ab80000a05p-59, 0x1.58ed23p-1, 0x1.23c41d53c2721p-1, -0x1.b5408d57adfdep-56}, // 124 * 0x1p-8 = 0x1.fp-2
    {0x1.f400005f4p-2, 0x1.7d000017dp-56, 0x1.58056p-1, 0x1.25b515b99e5f1p-1, 0x1.30c342a2944b9p-57}, // 125 * 0x1p-8 = 0x1.f4p-2
    {0x1.f7fffef960003p-2, -0x1.6e4003e10cff5p-57, 0x1.571ed4p-1, 0x1.27a4bfd967b6ep-1, -0x1.2ebcc9e150d9dp-57}, // 126 * 0x1p-8 = 0x1.f8p-2
    {0x1.fbfffe7508006p-2, 0x1.74fbf96fd709bp-56, 0x1.56397cp-1, 0x1.29931ea921c92p-1, -0x1.3ed67a542f9b6p-55}, // 127 * 0x1p-8 = 0x1.fcp-2
    {0x1.000000c000003p-1, 0x1.8000006p-78, 0x1.555555p-1, 0x1.2b80352ca1e85p-1, -0x1.3d82406f24c25p-59}, // 128 * 0x1p-8 = 0x1p-1
};

static const int B_ORIGIN = 170;
static const logdata_t B_LOOKUP[] = { //b{hi,lo}, vb, lg1pb{hi,lo}: 1/vb ~ 1+bhi+blo
    {-0x1.540014ec115e4p-8, -0x1.feccae49893f5p-62, 0x1.0155c6p+0, -0x1.ebcb28ccb7d07p-8, -0x1.529c5874e9aefp-62}, // -170 * 0x1p-15 = -0x1.54p-8
    {-0x1.52006aa07d176p-8, 0x1.0f47cf633c3d7p-62, 0x1.0153c1p+0, -0x1.e8e524ed8e1fep-8, -0x1.029055e430fe6p-62}, // -169 * 0x1p-15 = -0x1.52p-8
    {-0x1.4fffbaeb22ed4p-8, -0x1.93a49d737bf67p-63, 0x1.0151bbp+0, -0x1.e5fdabcbdc26dp-8, -0x1.a86c6b5c667eap-63}, // -168 * 0x1p-15 = -0x1.5p-8
    {-0x1.4e00008b4958p-8, 0x1.30b0707f595f8p-66, 0x1.014fb6p+0, -0x1.e3179c441682bp-8, -0x1.6a87d0f11e27ap-65}, // -167 * 0x1p-15 = -0x1.4ep-8
    {-0x1.4c003e230180dp-8, -0x1.d771875d6ce1cp-62, 0x1.014db1p+0, -0x1.e03186e950e0cp-8, -0x1.e7115be6b3982p-62}, // -166 * 0x1p-15 = -0x1.4cp-8
    {-0x1.4a0073b21afb7p-8, -0x1.60d73ca3fb3cp-63, 0x1.014bacp+0, -0x1.dd4b6bbb73d94p-8, -0x1.2a48f2a8de535p-62}, // -165 * 0x1p-15 = -0x1.4ap-8
    {-0x1.47ffa3c6c15eap-8, 0x1.fcee8771439cbp-63, 0x1.0149a6p+0, -0x1.da63db3f261a7p-8, 0x1.8717493fc30afp-64}, // -164 * 0x1p-15 = -0x1.48p-8
    {-0x1.45ffc94011984p-8, 0x1.212df869c7a77p-62, 0x1.0147a1p+0, -0x1.d77db467f19b3p-8, 0x1.a98be598bed68p-67}, // -163 * 0x1p-15 = -0x1.46p-8
    {-0x1.43ffe6b031bd8p-8, 0x1.ef075dfd304b6p-63, 0x1.01459cp+0, -0x1.d49787bd5f6ffp-8, -0x1.a9bc11bf1fe42p-62}, // -162 * 0x1p-15 = -0x1.44p-8
    {-0x1.41fffc16f15bfp-8, -0x1.4450ee973a761p-65, 0x1.014397p+0, -0x1.d1b1553f582ecp-8, 0x1.43c4e5abbb697p-62}, // -161 * 0x1p-15 = -0x1.42p-8
    {-0x1.400009741fffap-8, -0x1.8c3400d54c12p-62, 0x1.014192p+0, -0x1.cecb1cedc46cep-8, -0x1.d8b692e1c94d3p-62}, // -160 * 0x1p-15 = -0x1.4p-8
    {-0x1.3e000ec78d332p-8, -0x1.20163d9cf975bp-62, 0x1.013f8dp+0, -0x1.cbe4dec88cbf6p-8, 0x1.9dc91f7b3614bp-62}, // -159 * 0x1p-15 = -0x1.3ep-8
    {-0x1.3c000c11087f7p-8, 0x1.2743848903ed6p-63, 0x1.013d88p+0, -0x1.c8fe9acf99ba6p-8, -0x1.bcace193c3eafp-64}, // -158 * 0x1p-15 = -0x1.3cp-8
    {-0x1.3a000150616cp-8, 0x1.bc20a095b59cfp-64, 0x1.013b83p+0, -0x1.c6185102d3f1cp-8, -0x1.909baf9b77dfcp-63}, // -157 * 0x1p-15 = -0x1.3ap-8
    {-0x1.37ffee85677edp-8, 0x1.7c8b2e879b4c6p-63, 0x1.01397ep+0, -0x1.c332016223f8bp-8, -0x1.cf106247d2e18p-63}, // -156 * 0x1p-15 = -0x1.38p-8
    {-0x1.35ffd3afea3c5p-8, 0x1.3d6a41e2bc68fp-62, 0x1.013779p+0, -0x1.c04babed7261ep-8, 0x1.0928f24974b97p-62}, // -155 * 0x1p-15 = -0x1.36p-8
    {-0x1.33ffb0cfb9276p-8, -0x1.c77da6f08ffd3p-63, 0x1.013574p+0, -0x1.bd6550a4a7bf5p-8, -0x1.cf2ea46b359a8p-62}, // -154 * 0x1p-15 = -0x1.34p-8
    {-0x1.31ff85e4a3c18p-8, 0x1.02239f5a746e2p-62, 0x1.01336fp+0, -0x1.ba7eef87aca2bp-8, -0x1.eebd4a898a2ddp-63}, // -153 * 0x1p-15 = -0x1.32p-8
    {-0x1.3000508fe2e68p-8, -0x1.e08ccf62117b3p-62, 0x1.01316bp+0, -0x1.b799f8344be5ep-8, -0x1.98e58512baac1p-63}, // -152 * 0x1p-15 = -0x1.3p-8
    {-0x1.2e0015926f163p-8, 0x1.c0bfba4622c4ep-63, 0x1.012f66p+0, -0x1.b4b38b718c858p-8, -0x1.b9f30101e2686p-64}, // -151 * 0x1p-15 = -0x1.2ep-8
    {-0x1.2bffd2898587ep-8, -0x1.d06f4d281b9b5p-63, 0x1.012d61p+0, -0x1.b1cd18da5667fp-8, -0x1.c7eb81e38d75ep-62}, // -150 * 0x1p-15 = -0x1.2cp-8
    {-0x1.29ff8774f5b7p-8, 0x1.41395e8df23b1p-62, 0x1.012b5cp+0, -0x1.aee6a06e921cap-8, 0x1.c537fc230a8d1p-63}, // -149 * 0x1p-15 = -0x1.2ap-8
    {-0x1.28003205e5f63p-8, 0x1.a8639298b2748p-64, 0x1.012958p+0, -0x1.ac0191d7954bp-8, 0x1.37a742b6f8924p-62}, // -148 * 0x1p-15 = -0x1.28p-8
    {-0x1.25ffd6dd74256p-8, 0x1.dabb68204013bp-63, 0x1.012753p+0, -0x1.a91b0dc5517c5p-8, 0x1.c2da8e49db20cp-62}, // -147 * 0x1p-15 = -0x1.26p-8
    {-0x1.2400716217bd9p-8, 0x1.47d7d0d265c0ap-64, 0x1.01254fp+0, -0x1.a635f38d6b455p-8, -0x1.d96d2999d57b9p-64}, // -146 * 0x1p-15 = -0x1.24p-8
    {-0x1.220006250227ep-8, 0x1.7b1a537d7c398p-62, 0x1.01234ap+0, -0x1.a34f63d44a587p-8, -0x1.e98cc82fded6ap-62}, // -145 * 0x1p-15 = -0x1.22p-8
    {-0x1.1fff92db53d14p-8, -0x1.95e23e31cf01ep-63, 0x1.012145p+0, -0x1.a068ce4626198p-8, 0x1.217488a6c409ap-62}, // -144 * 0x1p-15 = -0x1.2p-8
    {-0x1.1e00154a1c824p-8, 0x1.cead66207aa84p-62, 0x1.011f41p+0, -0x1.9d83a29ac1a34p-8, -0x1.7ad7d5fd429d2p-62}, // -143 * 0x1p-15 = -0x1.1ep-8
    {-0x1.1bff91eaa7907p-8, -0x1.39ff94df5c71cp-62, 0x1.011d3cp+0, -0x1.9a9d016533ca1p-8, 0x1.32f79d1a3a482p-62}, // -142 * 0x1p-15 = -0x1.1cp-8
    {-0x1.1a00044b3fdffp-8, 0x1.4241bad812449p-63, 0x1.011b38p+0, -0x1.97b7ca17fc46p-8, -0x1.4a03b6f5dd193p-63}, // -141 * 0x1p-15 = -0x1.1ap-8
    {-0x1.18006ea674cffp-8, -0x1.ffa2ce5e68743p-62, 0x1.011934p+0, -0x1.94d28cfb29357p-8, -0x1.6f07d9f9e4dfdp-62}, // -140 * 0x1p-15 = -0x1.18p-8
    {-0x1.15ffd326e8d42p-8, 0x1.f4c6cf637a824p-63, 0x1.01172fp+0, -0x1.91ebda4b3f213p-8, 0x1.573e403234d26p-63}, // -139 * 0x1p-15 = -0x1.16p-8
    {-0x1.14002d72cb27ep-8, -0x1.6d2ff5c4049f1p-62, 0x1.01152bp+0, -0x1.8f06918c0cd64p-8, 0x1.7391494fb5bc6p-63}, // -138 * 0x1p-15 = -0x1.14p-8
    {-0x1.11ff81db93d99p-8, -0x1.54931b6bb53a5p-62, 0x1.011326p+0, -0x1.8c1fd333cf0c7p-8, -0x1.8a40419b19efbp-62}, // -137 * 0x1p-15 = -0x1.12p-8
    {-0x1.0fffcc1761f57p-8, 0x1.bd2de6eca4f8ap-64, 0x1.011122p+0, -0x1.893a7ed1e006ep-8, 0x1.870dd5cd2f64cp-64}, // -136 * 0x1p-15 = -0x1.1p-8
    {-0x1.0e000e4cdaf73p-8, -0x1.5433e5324ae6dp-63, 0x1.010f1ep+0, -0x1.8655249fe0b73p-8, 0x1.1306b3c97afa1p-63}, // -135 * 0x1p-15 = -0x1.0ep-8
    {-0x1.0c00487bce8b6p-8, -0x1.234bdbb46f16fp-62, 0x1.010d1ap+0, -0x1.836fc49db9c74p-8, -0x1.03637ba59431ap-63}, // -134 * 0x1p-15 = -0x1.0cp-8
    {-0x1.0a007aa40c5dp-8, -0x1.eefd92fde68ebp-64, 0x1.010b16p+0, -0x1.808a5ecb53e07p-8, 0x1.e7bb01c9b38bfp-63}, // -133 * 0x1p-15 = -0x1.0ap-8
    {-0x1.07ffa6d45420dp-8, -0x1.c83067998b2dcp-66, 0x1.010911p+0, -0x1.7da3835100a94p-8, -0x1.b6a12ab73c0a1p-62}, // -132 * 0x1p-15 = -0x1.08p-8
    {-0x1.05ffc8ea99c82p-8, 0x1.985ec9e1c8ca4p-62, 0x1.01070dp+0, -0x1.7abe11daf456ap-8, -0x1.e849a18d29e5cp-64}, // -131 * 0x1p-15 = -0x1.06p-8
    {-0x1.03ffe2f9988cbp-8, -0x1.18b0b1fc537dp-63, 0x1.010509p+0, -0x1.77d89a9462fa2p-8, -0x1.7f41cb463e913p-62}, // -130 * 0x1p-15 = -0x1.04p-8
    {-0x1.01fff50120138p-8, -0x1.a79b05e304355p-62, 0x1.010305p+0, -0x1.74f31d7d353afp-8, -0x1.b15641a138382p-64}, // -129 * 0x1p-15 = -0x1.02p-8
    {-0x1.fffffe02p-9, 0x1.fe000001fep-65, 0x1.010101p+0, -0x1.720d9a9553bf9p-8, -0x1.bf85dcbd8a866p-62}, // -128 * 0x1p-15 = -0x1p-8
    {-0x1.fc0001f20fe8p-9, 0x1.e663888e2502dp-65, 0x1.00fefdp+0, -0x1.6f2811dca72e2p-8, 0x1.31fd9a7343c6cp-62}, // -127 * 0x1p-15 = -0x1.fcp-9
    {-0x1.f7fff5d20f1fdp-9, 0x1.00aeae626f7c8p-63, 0x1.00fcf9p+0, -0x1.6c428353182bfp-8, -0x1.c2d80dc3be2c9p-62}, // -126 * 0x1p-15 = -0x1.f8p-9
    {-0x1.f3ffd9a19ce52p-9, 0x1.72d845e2c5a8fp-64, 0x1.00faf5p+0, -0x1.695ceef88f5e1p-8, -0x1.9dd67838d6355p-62}, // -125 * 0x1p-15 = -0x1.f4p-9
    {-0x1.efffad605872ap-9, 0x1.265617822dc22p-64, 0x1.00f8f1p+0, -0x1.667754ccf568ep-8, 0x1.cd8a71277c813p-62}, // -124 * 0x1p-15 = -0x1.fp-9
    {-0x1.ebff710de0fffp-9, -0x1.8367f374d15bbp-66, 0x1.00f6edp+0, -0x1.6391b4d032f01p-8, -0x1.35d7f5f9f0eccp-65}, // -123 * 0x1p-15 = -0x1.ecp-9
    {-0x1.e7ff24a9d5c1bp-9, 0x1.47109a7ea2afbp-68, 0x1.00f4e9p+0, -0x1.60ac0f023097p-8, -0x1.e43f527d44679p-63}, // -122 * 0x1p-15 = -0x1.e8p-9
    {-0x1.e400c46d9fe46p-9, 0x1.c34aedb5f869bp-64, 0x1.00f2e6p+0, -0x1.5dc7d35a2ba4ep-8, -0x1.712f884949123p-62}, // -121 * 0x1p-15 = -0x1.e4p-9
    {-0x1.e00057ed43f0ep-9, 0x1.f15578d147249p-63, 0x1.00f0e2p+0, -0x1.5ae221ec466a2p-8, -0x1.1a15ac97b3c44p-63}, // -120 * 0x1p-15 = -0x1.ep-9
    {-0x1.dbffdb5a31ed6p-9, 0x1.f941ceaacbfe4p-65, 0x1.00eedep+0, -0x1.57fc6aacdb413p-8, -0x1.ccdd271019a7fp-62}, // -119 * 0x1p-15 = -0x1.dcp-9
    {-0x1.d7ff4eb409026p-9, -0x1.10c0c6054a7edp-64, 0x1.00ecdap+0, -0x1.5516ad9bd2cb3p-8, -0x1.f4588de1ad38p-62}, // -118 * 0x1p-15 = -0x1.d8p-9
    {-0x1.d400ae5414bc7p-9, 0x1.a71deb4ccb30cp-65, 0x1.00ead7p+0, -0x1.52325abbf500dp-8, -0x1.e1983b9964fcep-63}, // -117 * 0x1p-15 = -0x1.d4p-9
    {-0x1.d000018e958p-9, 0x1.3764cbff0cb94p-65, 0x1.00e8d3p+0, -0x1.4f4c920a4ef74p-8, -0x1.e1b5e8b410a84p-64}, // -116 * 0x1p-15 = -0x1.dp-9
    {-0x1.cbff44b4dcf34p-9, 0x1.331bdca43d086p-65, 0x1.00e6cfp+0, -0x1.4c66c386c58c2p-8, -0x1.124b274c37dafp-64}, // -115 * 0x1p-15 = -0x1.ccp-9
    {-0x1.c800743821658p-9, -0x1.bdb923ec78c4p-63, 0x1.00e4ccp+0, -0x1.49825f3cc8db3p-8, -0x1.04107e1153097p-62}, // -114 * 0x1p-15 = -0x1.c8p-9
    {-0x1.c3ff973cce2a8p-9, 0x1.49f5b34fbf82ap-64, 0x1.00e2c8p+0, -0x1.469c851815d16p-8, 0x1.d7894fdf56dcfp-66}, // -113 * 0x1p-15 = -0x1.c4p-9
    {-0x1.c000a6ada7c99p-9, 0x1.3cf79b6d759dep-64, 0x1.00e0c5p+0, -0x1.43b8153285f6fp-8, 0x1.358b31a848ca2p-62}, // -112 * 0x1p-15 = -0x1.cp-9
    {-0x1.bbffa98f36f96p-9, 0x1.2bcb7b8679427p-63, 0x1.00dec1p+0, -0x1.40d22f6c4bf3ep-8, 0x1.5a879c7800e56p-64}, // -111 * 0x1p-15 = -0x1.bcp-9
    {-0x1.b80098ec23923p-9, 0x1.01123d8795d0ap-63, 0x1.00dcbep+0, -0x1.3dedb3eacbc18p-8, 0x1.b0e64f24676a1p-64}, // -110 * 0x1p-15 = -0x1.b8p-9
    {-0x1.b3ff7ba9122dbp-9, 0x1.0da28fa98d3c9p-64, 0x1.00dabap+0, -0x1.3b07c282ad665p-8, -0x1.634d7f2b8b24cp-64}, // -109 * 0x1p-15 = -0x1.b4p-9
    {-0x1.b0004af08f75p-9, 0x1.439116487be9ap-65, 0x1.00d8b7p+0, -0x1.38233b64dfa94p-8, 0x1.982f74c31560ep-64}, // -108 * 0x1p-15 = -0x1.bp-9
    {-0x1.abff0d875a64dp-9, 0x1.1da7ca00d112bp-63, 0x1.00d6b3p+0, -0x1.353d3e5a7f92ap-8, -0x1.10c62c49e2fa1p-62}, // -107 * 0x1p-15 = -0x1.acp-9
    {-0x1.a7ffbcb7e5f72p-9, -0x1.3e9154a1ffa8fp-65, 0x1.00d4bp+0, -0x1.3258aba00713bp-8, -0x1.6576c1eee2a93p-62}, // -106 * 0x1p-15 = -0x1.a8p-9
    {-0x1.a4005be063d77p-9, -0x1.7231ad147342ap-63, 0x1.00d2adp+0, -0x1.2f7413188758ep-8, 0x1.64b9181d3c228p-62}, // -105 * 0x1p-15 = -0x1.a4p-9
    {-0x1.a000eb007393dp-9, 0x1.354deb4b14bf5p-63, 0x1.00d0aap+0, -0x1.2c8f74c3e91e3p-8, -0x1.6ac95ada8cf5fp-62}, // -104 * 0x1p-15 = -0x1.ap-9
    {-0x1.9bff6d4e6a05dp-9, -0x1.a3643d639a0b7p-63, 0x1.00cea6p+0, -0x1.29a96076d1119p-8, 0x1.89adb4b4205a5p-63}, // -103 * 0x1p-15 = -0x1.9cp-9
    {-0x1.97ffdc54835d8p-9, -0x1.d7fe34e6fc3ffp-65, 0x1.00cca3p+0, -0x1.26c4b684cdb0cp-8, 0x1.7437881e837d2p-62}, // -102 * 0x1p-15 = -0x1.98p-9
    {-0x1.94003b510cf92p-9, 0x1.2ad07cbb46458p-63, 0x1.00caap+0, -0x1.23e006c565f5bp-8, 0x1.72e0d995ddf6dp-63}, // -101 * 0x1p-15 = -0x1.94p-9
    {-0x1.90008a43a65a9p-9, 0x1.e18bcb764fca2p-64, 0x1.00c89dp+0, -0x1.20fb5138829a6p-8, 0x1.eaf265fa527c4p-62}, // -100 * 0x1p-15 = -0x1.9p-9
    {-0x1.8c00c92bef00bp-9, -0x1.eae0b6e75b087p-63, 0x1.00c69ap+0, -0x1.1e1695de0c582p-8, -0x1.3d57f1f088769p-63}, // -99 * 0x1p-15 = -0x1.8cp-9
    {-0x1.8800f80986678p-9, 0x1.6034a7f05cea1p-63, 0x1.00c497p+0, -0x1.1b31d4b5ebe7ep-8, -0x1.87958a7341c31p-62}, // -98 * 0x1p-15 = -0x1.88p-9
    {-0x1.83ff19e2e6304p-9, -0x1.4f73d99596b2ep-63, 0x1.00c293p+0, -0x1.184b9d8375c28p-8, 0x1.bb613de7ce4cbp-62}, // -97 * 0x1p-15 = -0x1.84p-9
    {-0x1.7fff28a1ffa52p-9, -0x1.15f66ad543f51p-63, 0x1.00c09p+0, -0x1.1566d0bcd8805p-8, 0x1.e0f078be4b2d8p-62}, // -96 * 0x1p-15 = -0x1.8p-9
    {-0x1.7bff2755460c1p-9, 0x1.2149dfd62ec05p-63, 0x1.00be8dp+0, -0x1.1281fe284b2bcp-8, -0x1.5c0f51ed16ea2p-62}, // -95 * 0x1p-15 = -0x1.7cp-9
    {-0x1.77ff15fc58d4cp-9, 0x1.072a0f4020af7p-63, 0x1.00bc8ap+0, -0x1.0f9d25c5b67bap-8, 0x1.8994be2a0e53ep-62}, // -94 * 0x1p-15 = -0x1.78p-9
    {-0x1.7400f1afe5cd9p-9, -0x1.a2d9af52f8935p-63, 0x1.00ba88p+0, -0x1.0cb9b7dd2223fp-8, 0x1.51f85647d7e8fp-62}, // -93 * 0x1p-15 = -0x1.74p-9
    {-0x1.7000c0456a379p-9, -0x1.f6fe001df468cp-63, 0x1.00b885p+0, -0x1.09d4d3e11baadp-8, -0x1.481f798d26cf1p-67}, // -92 * 0x1p-15 = -0x1.7p-9
    {-0x1.6c007ecd99708p-9, -0x1.0c304d786511p-64, 0x1.00b682p+0, -0x1.06efea16c8025p-8, -0x1.8be819d261b66p-62}, // -91 * 0x1p-15 = -0x1.6cp-9
    {-0x1.68002d4812dcp-9, 0x1.02130a951ce7bp-63, 0x1.00b47fp+0, -0x1.040afa7e0fdefp-8, -0x1.95af21b72e885p-62}, // -90 * 0x1p-15 = -0x1.68p-9
    {-0x1.63ffcbb475daap-9, -0x1.38dc7f24cad52p-63, 0x1.00b27cp+0, -0x1.01260516dbf4ap-8, 0x1.05b02149895fcp-63}, // -89 * 0x1p-15 = -0x1.64p-9
    {-0x1.5fff5a1261ca1p-9, -0x1.3649b6a994141p-63, 0x1.00b079p+0, -0x1.fc8213c229ed6p-9, 0x1.d954b8288a764p-64}, // -88 * 0x1p-15 = -0x1.6p-9
    {-0x1.5c00d5aa62deap-9, 0x1.d052a7fb670a2p-63, 0x1.00ae77p+0, -0x1.f6baf26c253fbp-9, 0x1.3effcb2430d22p-64}, // -87 * 0x1p-15 = -0x1.5cp-9
    {-0x1.580043f23a76fp-9, -0x1.654622fcb65bp-63, 0x1.00ac74p+0, -0x1.f0f0e4cb85497p-9, 0x1.790485c704bc4p-65}, // -86 * 0x1p-15 = -0x1.58p-9
    {-0x1.53ffa22a7936cp-9, -0x1.10f4e4e3e79f9p-64, 0x1.00aa71p+0, -0x1.eb26cb8d3370ep-9, -0x1.4ea8f48d27c99p-68}, // -85 * 0x1p-15 = -0x1.54p-9
    {-0x1.5000edb39b116p-9, 0x1.d092a653433dcp-64, 0x1.00a86fp+0, -0x1.e55f87752efb1p-9, 0x1.c65f26750c3c8p-63}, // -84 * 0x1p-15 = -0x1.5p-9
    {-0x1.4c002bd3825c4p-9, 0x1.674bed302ab4p-64, 0x1.00a66cp+0, -0x1.df955700b3ed8p-9, 0x1.f6c14de3e616bp-63}, // -83 * 0x1p-15 = -0x1.4cp-9
    {-0x1.47ff59e2aeeap-9, 0x1.e844eb94d00abp-63, 0x1.00a469p+0, -0x1.d9cb1aedfb38ap-9, 0x1.409622fa3ec2ap-64}, // -82 * 0x1p-15 = -0x1.48p-9
    {-0x1.440075598e1d1p-9, 0x1.a36a49fd69de1p-63, 0x1.00a267p+0, -0x1.d403b41254c17p-9, -0x1.2bf6856ac2e2ap-63}, // -81 * 0x1p-15 = -0x1.44p-9
    {-0x1.3fff834e1fe19p-9, 0x1.6d376eb12a088p-65, 0x1.00a064p+0, -0x1.ce3960c85b894p-9, -0x1.2a30252bab452p-63}, // -80 * 0x1p-15 = -0x1.4p-9
    {-0x1.3c007eb998f09p-9, 0x1.04560f39a895ep-65, 0x1.009e62p+0, -0x1.c871e2c0a1f71p-9, -0x1.63e280fe28547p-65}, // -79 * 0x1p-15 = -0x1.3cp-9
    {-0x1.37ff6c920db57p-9, -0x1.2bfe799a76bf5p-64, 0x1.009c5fp+0, -0x1.c2a7783eae0bdp-9, -0x1.33688a6a0ec66p-63}, // -78 * 0x1p-15 = -0x1.38p-9
    {-0x1.340047f09f1dep-9, 0x1.c588e6e25ff21p-65, 0x1.009a5dp+0, -0x1.bcdfe30a27871p-9, 0x1.91aebc6c6eaacp-66}, // -77 * 0x1p-15 = -0x1.34p-9
    {-0x1.2fff15ab74948p-9, -0x1.ae95bfb586d22p-66, 0x1.00985ap+0, -0x1.b715614f7eb05p-9, 0x1.0402e54a14afep-65}, // -76 * 0x1p-15 = -0x1.3p-9
    {-0x1.2bffd0fb9cbbbp-9, 0x1.ebb17cfbc1861p-64, 0x1.009658p+0, -0x1.b14db4ed7158bp-9, -0x1.b2029f221ad61p-64}, // -75 * 0x1p-15 = -0x1.2cp-9
    {-0x1.28007c47fca1cp-9, -0x1.ce48e2908854ap-64, 0x1.009456p+0, -0x1.ab85fcf73d0e3p-9, -0x1.764c4a765b8a4p-63}, // -74 * 0x1p-15 = -0x1.28p-9
    {-0x1.23ff19d78db05p-9, 0x1.7cf03380bfdfdp-65, 0x1.009253p+0, -0x1.a5bb58690b41cp-9, -0x1.942799dc997c7p-63}, // -73 * 0x1p-15 = -0x1.24p-9
    {-0x1.1fffa51341efdp-9, -0x1.3d6c3ead7e93ep-65, 0x1.009051p+0, -0x1.9ff38944395adp-9, 0x1.6af69dcd18f29p-64}, // -72 * 0x1p-15 = -0x1.2p-9
    {-0x1.1c00204a0cf5fp-9, -0x1.6478931d30692p-63, 0x1.008e4fp+0, -0x1.9a2bae8ab539ep-9, -0x1.373a4b8968074p-63}, // -71 * 0x1p-15 = -0x1.1cp-9
    {-0x1.18008b7b8e79fp-9, 0x1.21dc70434d6d7p-63, 0x1.008c4dp+0, -0x1.9463c83c50779p-9, 0x1.23755eb9b6477p-65}, // -70 * 0x1p-15 = -0x1.18p-9
    {-0x1.1400e6a7662fep-9, 0x1.7cbf912f9ccc8p-66, 0x1.008a4bp+0, -0x1.8e9bd658dcab3p-9, -0x1.6c3024e887bcfp-63}, // -69 * 0x1p-15 = -0x1.14p-9
    {-0x1.0fff33eca3ae8p-9, 0x1.5dcfc73bb83d5p-64, 0x1.008848p+0, -0x1.88d0f7bfa8ccdp-9, -0x1.6a4b439bc0a37p-63}, // -68 * 0x1p-15 = -0x1.1p-9
    {-0x1.0bff6f040b86ep-9, 0x1.df1557d430ea6p-64, 0x1.008646p+0, -0x1.8308eeabc6b1cp-9, -0x1.a59faf4522eefp-63}, // -67 * 0x1p-15 = -0x1.0cp-9
    {-0x1.07ff9a14a86bbp-9, 0x1.104a01838fc2fp-63, 0x1.008444p+0, -0x1.7d40da024a355p-9, 0x1.4056394cb8282p-63}, // -66 * 0x1p-15 = -0x1.08p-9
    {-0x1.03ffb51e1a05p-9, -0x1.af5209243541ap-63, 0x1.008242p+0, -0x1.7778b9c304ea7p-9, -0x1.b13b4dd4e19c7p-66}, // -65 * 0x1p-15 = -0x1.04p-9
    {-0x1.ffff803ffffp-10, -0x1.ffff803ffffp-64, 0x1.00804p+0, -0x1.71b08dedc8633p-9, 0x1.f7eccd83c2e4dp-66}, // -64 * 0x1p-15 = -0x1p-9
    {-0x1.f7ff7633f3cd7p-10, 0x1.09b540706314p-64, 0x1.007e3ep+0, -0x1.6be8568266306p-9, -0x1.502131b4fdafcp-63}, // -63 * 0x1p-15 = -0x1.f8p-10
    {-0x1.efff4c174ee05p-10, -0x1.3694973beb87ep-64, 0x1.007c3cp+0, -0x1.66201380afe1ep-9, 0x1.ed90e871b1216p-64}, // -62 * 0x1p-15 = -0x1.fp-10
    {-0x1.e7ff01e95060dp-10, -0x1.690fd4a712338p-64, 0x1.007a3ap+0, -0x1.6057c4e877064p-9, -0x1.45970c611e849p-63}, // -61 * 0x1p-15 = -0x1.e8p-10
    {-0x1.dffe97a93780fp-10, -0x1.d9f44dce16607p-64, 0x1.007838p+0, -0x1.5a8f6ab98d2b4p-9, 0x1.700065234dd49p-63}, // -60 * 0x1p-15 = -0x1.ep-10
    {-0x1.d7fe0d56436ccp-10, 0x1.95a0d24f23292p-64, 0x1.007636p+0, -0x1.54c704f3c3dd4p-9, 0x1.7640c15343ef9p-65}, // -59 * 0x1p-15 = -0x1.d8p-10
    {-0x1.d0015f5086c74p-10, -0x1.ceed9c7de58dfp-66, 0x1.007435p+0, -0x1.4f0174f125349p-9, 0x1.3ba413f5070ffp-64}, // -58 * 0x1p-15 = -0x1.dp-10
    {-0x1.c80094e5941a5p-10, 0x1.c624e916d963ap-69, 0x1.007233p+0, -0x1.4938f802d785cp-9, 0x1.e6c4cf3373071p-65}, // -57 * 0x1p-15 = -0x1.c8p-10
    {-0x1.bfffaa6583f8dp-10, -0x1.380f4994e1c7cp-64, 0x1.007031p+0, -0x1.43706f7d1f1a2p-9, 0x1.ca15f500601a9p-66}, // -56 * 0x1p-15 = -0x1.cp-10
    {-0x1.b7fe9fcf9576bp-10, 0x1.5b85010c21985p-64, 0x1.006e2fp+0, -0x1.3da7db5fcd79dp-9, -0x1.a75f4daee51e1p-63}, // -55 * 0x1p-15 = -0x1.b8p-10
    {-0x1.b00171c3befa4p-10, -0x1.0d9255d37f5a4p-65, 0x1.006c2ep+0, -0x1.37e21d1c01f2fp-9, -0x1.7021c3e81404dp-67}, // -54 * 0x1p-15 = -0x1.bp-10
    {-0x1.a800270fccbe8p-10, -0x1.ed755899255c3p-66, 0x1.006a2cp+0, -0x1.321971d4b8bddp-9, -0x1.65fe3b555c2d4p-63}, // -53 * 0x1p-15 = -0x1.a8p-10
    {-0x1.9ffebc43b9998p-10, 0x1.67056ae5af273p-65, 0x1.00682ap+0, -0x1.2c50baf54afd2p-9, 0x1.445f371f4576fp-64}, // -52 * 0x1p-15 = -0x1.ap-10
    {-0x1.98012e2f68b6bp-10, 0x1.1e521d6d1fceep-67, 0x1.006629p+0, -0x1.268ada002821fp-9, 0x1.6227a24679193p-63}, // -51 * 0x1p-15 = -0x1.98p-10
    {-0x1.8fff8340cdb0cp-10, -0x1.e7062766abe43p-64, 0x1.006427p+0, -0x1.20c20bf5ac5a1p-9, -0x1.0288c235480aep-66}, // -50 * 0x1p-15 = -0x1.9p-10
    {-0x1.8801b52865a51p-10, -0x1.ed9aa986257bcp-64, 0x1.006226p+0, -0x1.1afc13e0a8d59p-9, 0x1.5c45b1b03d85p-71}, // -49 * 0x1p-15 = -0x1.88p-10
    {-0x1.7fffca143ffd3p-10, 0x1.fba80998c55c8p-64, 0x1.006024p+0, -0x1.15332eaa65699p-9, -0x1.e60625ef3c27ep-66}, // -48 * 0x1p-15 = -0x1.8p-10
    {-0x1.7801bbf4bf6f4p-10, 0x1.0555a6d20911fp-66, 0x1.005e23p+0, -0x1.0f6d1f74c7f6ep-9, 0x1.d96948b89040ep-63}, // -47 * 0x1p-15 = -0x1.78p-10
    {-0x1.6fff90b80c33ep-10, -0x1.e3b9facee4514p-65, 0x1.005c21p+0, -0x1.09a423120341p-9, 0x1.5c72fb3e13bd5p-63}, // -46 * 0x1p-15 = -0x1.7p-10
    {-0x1.6801428e719a4p-10, -0x1.91aa97d14d70ap-66, 0x1.005a2p+0, -0x1.03ddfcbb12927p-9, 0x1.46a838e01e676p-64}, // -45 * 0x1p-15 = -0x1.68p-10
    {-0x1.5ffed7262da9dp-10, -0x1.1148571b944fdp-64, 0x1.00581ep+0, -0x1.fc29d25625c88p-10, 0x1.a809ec755c51ap-66}, // -44 * 0x1p-15 = -0x1.6p-10
    {-0x1.580048ef774adp-10, 0x1.d21001d392b7cp-65, 0x1.00561dp+0, -0x1.f09d57642b472p-10, 0x1.6a3f6c51c28cap-64}, // -43 * 0x1p-15 = -0x1.58p-10
    {-0x1.50019ab90e5b1p-10, 0x1.b909f87d5faeep-65, 0x1.00541cp+0, -0x1.e510c5555d8b9p-10, -0x1.ed886f33b3fa1p-64}, // -42 * 0x1p-15 = -0x1.5p-10
    {-0x1.47fecf11cb451p-10, -0x1.4e8bcd3e0f46dp-64, 0x1.00521ap+0, -0x1.d97e58b0bc281p-10, -0x1.70d89c61734e2p-64}, // -41 * 0x1p-15 = -0x1.48p-10
    {-0x1.3fffe0c9c3ff1p-10, 0x1.ebda63b8829a3p-65, 0x1.005019p+0, -0x1.cdf1985ba952fp-10, 0x1.11de0907e9af9p-65}, // -40 * 0x1p-15 = -0x1.4p-10
    {-0x1.3800d27fc954bp-10, 0x1.565fceb609282p-65, 0x1.004e18p+0, -0x1.c264c0e8ad848p-10, 0x1.415244b2e8412p-65}, // -39 * 0x1p-15 = -0x1.38p-10
    {-0x1.3001a4331b136p-10, 0x1.2ee3993810971p-66, 0x1.004c17p+0, -0x1.b6d7d2576c32cp-10, -0x1.783365ce8cbd1p-65}, // -38 * 0x1p-15 = -0x1.3p-10
    {-0x1.27fe5832a4206p-10, -0x1.cae13d3fd1873p-64, 0x1.004a15p+0, -0x1.ab450900b9ad1p-10, -0x1.8132e8db56ee2p-65}, // -37 * 0x1p-15 = -0x1.28p-10
    {-0x1.1ffee9ce53b45p-10, -0x1.af60fb05d2c04p-64, 0x1.004814p+0, -0x1.9fb7ec264ddc8p-10, 0x1.5c8ff88f79e1fp-64}, // -36 * 0x1p-15 = -0x1.2p-10
    {-0x1.17ff5b650e958p-10, -0x1.8489659805e42p-65, 0x1.004613p+0, -0x1.942ab82c86af6p-10, 0x1.5287c3bcfb294p-64}, // -35 * 0x1p-15 = -0x1.18p-10
    {-0x1.0fffacf614794p-10, -0x1.2cecbbf56d97ap-65, 0x1.004412p+0, -0x1.889d6d130793p-10, -0x1.8c240857cf4e9p-66}, // -34 * 0x1p-15 = -0x1.1p-10
    {-0x1.07ffde80a50eep-10, -0x1.cc99e9bb85224p-64, 0x1.004211p+0, -0x1.7d100ad973f29p-10, -0x1.2da85cf4eb57ap-66}, // -33 * 0x1p-15 = -0x1.08p-10
    {-0x1.ffffe007ffff8p-11, -0x1.ffffe007ffff8p-71, 0x1.00401p+0, -0x1.7182917f6f37p-10, 0x1.384f05ed47078p-68}, // -32 * 0x1p-15 = -0x1p-10
    {-0x1.efffc2fec9de3p-11, 0x1.a33f2e2220084p-67, 0x1.003e0fp+0, -0x1.65f501049cc71p-10, -0x1.c65a2fab0be0ep-64}, // -31 * 0x1p-15 = -0x1.fp-11
    {-0x1.dfff65e426f46p-11, -0x1.25c3c60ce026cp-65, 0x1.003c0ep+0, -0x1.5a675968a0077p-10, -0x1.4f0b1baad130ap-64}, // -30 * 0x1p-15 = -0x1.ep-11
    {-0x1.cffec8b69670ap-11, -0x1.35bbbbbceea95p-65, 0x1.003a0dp+0, -0x1.4ed99aab1c5a9p-10, 0x1.11e2a44bfe00dp-64}, // -29 * 0x1p-15 = -0x1.dp-11
    {-0x1.bffdeb7497756p-11, -0x1.cdfabb7f3b611p-65, 0x1.00380cp+0, -0x1.434bc4cbb520ap-10, 0x1.eb530413510f2p-70}, // -28 * 0x1p-15 = -0x1.cp-11
    {-0x1.affcce1ca9192p-11, 0x1.a3dc7574c0537p-65, 0x1.00360bp+0, -0x1.37bdd7ca0db7dp-10, 0x1.54baae9e6d3ddp-64}, // -27 * 0x1p-15 = -0x1.bp-11
    {-0x1.a0036d6da007dp-11, 0x1.dd4475962c718p-65, 0x1.00340bp+0, -0x1.2c3597cb8e8f4p-10, -0x1.38dc1f165312ap-64}, // -26 * 0x1p-15 = -0x1.ap-11
    {-0x1.9001d0054cd6dp-11, 0x1.bcea10e78e1d3p-65, 0x1.00320ap+0, -0x1.20a77c8fdca83p-10, 0x1.7bd0fbd788e32p-64}, // -25 * 0x1p-15 = -0x1.9p-11
    {-0x1.7ffff28287fffp-11, 0x1.b0eea0099a92bp-65, 0x1.003009p+0, -0x1.15194a30d4cdap-10, -0x1.c660f3a4e9f4fp-65}, // -24 * 0x1p-15 = -0x1.8p-11
    {-0x1.6ffdd4e3d0697p-11, 0x1.7528671437257p-67, 0x1.002e08p+0, -0x1.098b00ae1a552p-10, 0x1.af36b1ff765acp-64}, // -23 * 0x1p-15 = -0x1.7p-11
    {-0x1.60037467e281dp-11, -0x1.4ddf532eb95ebp-66, 0x1.002c08p+0, -0x1.fc04c8b6805ep-11, -0x1.5038ae376b2e1p-65}, // -22 * 0x1p-15 = -0x1.6p-11
    {-0x1.5000d6acc1c98p-11, 0x1.16b2df088481p-65, 0x1.002a07p+0, -0x1.e4e7d9372df1ap-11, 0x1.6275688d64fecp-68}, // -21 * 0x1p-15 = -0x1.5p-11
    {-0x1.3ffdf8d12b7c5p-11, 0x1.38841409c600dp-66, 0x1.002806p+0, -0x1.cdcabb6e4a8c1p-11, 0x1.d6c5366f679fcp-66}, // -20 * 0x1p-15 = -0x1.4p-11
    {-0x1.3002d873cdbccp-11, 0x1.ad9931311b8ecp-68, 0x1.002606p+0, -0x1.b6b8f8483cb8ap-11, -0x1.a420a70defa7ep-66}, // -19 * 0x1p-15 = -0x1.3p-11
    {-0x1.1fff7a72ca775p-11, 0x1.aea88be309574p-65, 0x1.002405p+0, -0x1.9f9b7e01254bbp-11, -0x1.c8a232d7c8e17p-65}, // -18 * 0x1p-15 = -0x1.2p-11
    {-0x1.1003da2cf2c4ep-11, -0x1.1c41d9b3ccde4p-67, 0x1.002205p+0, -0x1.88895e899a0e7p-11, -0x1.3415020e9821cp-70}, // -17 * 0x1p-15 = -0x1.1p-11
    {-0x1.fffff801p-12, 0x1.ffc00000ffep-67, 0x1.002004p+0, -0x1.716b87c16a4f1p-11, 0x1.c6eac065f85abp-65}, // -16 * 0x1p-15 = -0x1p-11
    {-0x1.e007b7985d46bp-12, -0x1.08f5ef0a25138p-70, 0x1.001e04p+0, -0x1.5a590bf57ebcep-11, 0x1.151eeb7ec0e04p-65}, // -15 * 0x1p-15 = -0x1.ep-12
    {-0x1.bffefadc92ef6p-12, 0x1.f99c34fd5faa9p-66, 0x1.001c03p+0, -0x1.433ad8a9523d2p-11, 0x1.d2953a8738b2p-68}, // -14 * 0x1p-15 = -0x1.cp-12
    {-0x1.a005ba8afcb2bp-12, -0x1.38e2315c560b3p-66, 0x1.001a03p+0, -0x1.2c28008623486p-11, 0x1.2bb8ac53bf8bap-65}, // -13 * 0x1p-15 = -0x1.ap-12
    {-0x1.7ffbfd6046fe9p-12, -0x1.e4f33d6857bcfp-66, 0x1.001802p+0, -0x1.150970b31577bp-11, -0x1.312211364d9acp-65}, // -12 * 0x1p-15 = -0x1.8p-12
    {-0x1.6001bd19bc4fap-12, 0x1.28162bc81077p-67, 0x1.001602p+0, -0x1.fbec786b7fep-12, 0x1.b62f5eef321d9p-72}, // -11 * 0x1p-15 = -0x1.6p-12
    {-0x1.4006fcf42ef27p-12, 0x1.a7315cd65c872p-67, 0x1.001402p+0, -0x1.cdc5b32b9541cp-12, -0x1.ecbff88929b1bp-67}, // -10 * 0x1p-15 = -0x1.4p-12
    {-0x1.1ffbbf2c931e8p-12, 0x1.2df263c7099d9p-66, 0x1.001201p+0, -0x1.9f877dfd195aep-12, -0x1.743a3a7d1d1c6p-67}, // -9 * 0x1p-15 = -0x1.2p-12
    {-0x1.fffffe002p-13, 0x1.ffe000001ffep-73, 0x1.001001p+0, -0x1.71600000383c6p-12, 0x1.9526447913a46p-67}, // -8 * 0x1p-15 = -0x1p-12
    {-0x1.c0077dd716befp-13, 0x1.61e46020d9d3fp-67, 0x1.000e01p+0, -0x1.433825b9c3cfcp-12, -0x1.14efc90dff243p-67}, // -7 * 0x1p-15 = -0x1.cp-13
    {-0x1.800dfdd80be1ap-13, 0x1.a7c48921cde13p-67, 0x1.000c01p+0, -0x1.150fef284b018p-12, -0x1.469f0e824b16fp-66}, // -6 * 0x1p-15 = -0x1.8p-13
    {-0x1.3ff3807cfb1e3p-13, -0x1.a42f96242296ap-70, 0x1.000ap+0, -0x1.cda08fd39db35p-13, -0x1.a3a134d498d23p-68}, // -5 * 0x1p-15 = -0x1.4p-13
    {-0x1.fff0007ffc002p-14, 0x1.fff0007ffcp-79, 0x1.0008p+0, -0x1.714eb11fa5363p-13, -0x1.d523885ac824cp-67}, // -4 * 0x1p-15 = -0x1p-13
    {-0x1.7ff70035febcp-14, -0x1.e5f49c445666p-68, 0x1.0006p+0, -0x1.14fc19ccfba78p-13, -0x1.b48516b2c97bp-67}, // -3 * 0x1p-15 = -0x1.8p-14
    {-0x1.fff8001fff8p-15, -0x1.fff8001fff8p-71, 0x1.0004p+0, -0x1.715193b17d35dp-14, -0x1.945957f63330ap-69}, // -2 * 0x1p-15 = -0x1p-14
    {-0x1.fffc0007fffp-16, -0x1.fffc0007fffp-76, 0x1.0002p+0, -0x1.715305002e4aep-15, -0x1.19bb4192806b9p-69}, // -1 * 0x1p-15 = -0x1p-15
    {0x0p+0, 0x0p+0, 0x1p+0, 0x0p+0, 0x0p+0}, // 0 * 0x1p-15 = 0x0p+0
    {0x1.000200040008p-15, 0x1.000200040008p-75, 0x1.fffcp-1, 0x1.7155e7a91af62p-15, -0x1.79ddac1de6789p-69}, // 1 * 0x1p-15 = 0x1p-15
    {0x1.00040010004p-14, 0x1.00040010004p-70, 0x1.fff8p-1, 0x1.7157590356aeep-14, -0x1.88fb2ea8bf9eap-70}, // 2 * 0x1p-15 = 0x1p-14
    {0x1.800900360144p-14, 0x1.e60b6444599a2p-68, 0x1.fff4p-1, 0x1.150297c91090ap-13, -0x1.39f3d5431038p-70}, // 3 * 0x1p-15 = 0x1.8p-14
    {0x1.0008004002001p-13, 0x1.0008004002p-78, 0x1.fffp-1, 0x1.715a3bc3593d5p-13, -0x1.5aeaee345d04ep-68}, // 4 * 0x1p-15 = 0x1p-13
    {0x1.3ffc7f3cfa222p-13, 0x1.b61cd8456449dp-67, 0x1.ffec01p-1, 0x1.cd9b82452b0eap-13, 0x1.562dcc044f7b1p-67}, // 5 * 0x1p-15 = 0x1.4p-13
    {0x1.8001ff57f71ffp-13, -0x1.9f277309d0bc4p-67, 0x1.ffe801p-1, 0x1.14fa4bbfda6edp-12, -0x1.296f743dffc8dp-67}, // 6 * 0x1p-15 = 0x1.8p-13
    {0x1.bff87dd6e942fp-13, -0x1.501b1c2b6f43fp-67, 0x1.ffe402p-1, 0x1.431ba7759d6ebp-12, 0x1.96aff97160e09p-67}, // 7 * 0x1p-15 = 0x1.cp-13
    {0x1.fffffdffep-13, 0x1.000fffffefffp-72, 0x1.ffe002p-1, 0x1.7148eab8c7863p-12, 0x1.8d1a70a989346p-66}, // 8 * 0x1p-15 = 0x1p-12
    {0x1.1ffc3e0c6281ep-12, -0x1.5c9934bacf538p-66, 0x1.ffdc03p-1, 0x1.9f6afee927edap-12, 0x1.1a07a42134f5bp-67}, // 9 * 0x1p-15 = 0x1.2p-12
    {0x1.4000fe33da8fcp-12, 0x1.5ce557df8572ap-66, 0x1.ffd803p-1, 0x1.cd98fad7fc194p-12, 0x1.4a28b4d5b941fp-66}, // 10 * 0x1p-15 = 0x1.4p-12
    {0x1.5ffe3d1943b1ap-12, -0x1.43bf0fe3df757p-68, 0x1.ffd404p-1, 0x1.fbbbc788bd7dbp-12, -0x1.a1ecb71fc14d1p-66}, // 11 * 0x1p-15 = 0x1.6p-12
    {0x1.8003fd5fb8feap-12, -0x1.e4ecc26860443p-66, 0x1.ffd004p-1, 0x1.14f53e1480736p-11, -0x1.be81d6fe3c64bp-67}, // 12 * 0x1p-15 = 0x1.8p-12
    {0x1.a0023c2a16afep-12, 0x1.29203e5f85179p-66, 0x1.ffcc05p-1, 0x1.2c0700aff3916p-11, -0x1.7e0b0a3055e38p-65}, // 13 * 0x1p-15 = 0x1.ap-12
    {0x1.c000fadb6d0f6p-12, -0x1.264bb4d4e42a7p-66, 0x1.ffc806p-1, 0x1.4318f1683f912p-11, -0x1.41125302f1e13p-66}, // 14 * 0x1p-15 = 0x1.cp-12
    {0x1.e0003976bb20dp-12, -0x1.b6c63d3b7721ap-68, 0x1.ffc407p-1, 0x1.5a2b103e1cccdp-11, -0x1.9c7a50b63aa7ep-68}, // 15 * 0x1p-15 = 0x1.ep-12
    {0x1.fffff7ffp-12, 0x1.001fffff7ffp-66, 0x1.ffc008p-1, 0x1.713d5d3243a2ep-11, 0x1.cffa276bae12fp-65}, // 16 * 0x1p-15 = 0x1p-11
    {0x1.10001b3b9d706p-11, -0x1.ac15ab5a607dcp-66, 0x1.ffbc09p-1, 0x1.884fd8456c763p-11, -0x1.15393c2de35d6p-68}, // 17 * 0x1p-15 = 0x1.1p-11
    {0x1.20007a7135875p-11, 0x1.f77da3d595d5ep-68, 0x1.ffb80ap-1, 0x1.9f6281784fadcp-11, 0x1.b945ee8a950fp-66}, // 18 * 0x1p-15 = 0x1.2p-11
    {0x1.300119a1c7f6bp-11, 0x1.34c29c41034b1p-65, 0x1.ffb40bp-1, 0x1.b67558cba5b51p-11, 0x1.9b0f7d5ba9b96p-68}, // 19 * 0x1p-15 = 0x1.3p-11
    {0x1.4001f8ced47c6p-11, -0x1.6332077dff83p-65, 0x1.ffb00cp-1, 0x1.cd885e4026fbdp-11, 0x1.cd357e7f321a1p-65}, // 20 * 0x1p-15 = 0x1.4p-11
    {0x1.4fff16a9be3a9p-11, 0x1.684120d59b25ap-67, 0x1.ffac0ep-1, 0x1.e495cb9252742p-11, 0x1.4073ecda6d7b7p-65}, // 21 * 0x1p-15 = 0x1.5p-11
    {0x1.600075c43a46cp-11, 0x1.1d2c5343832a1p-65, 0x1.ffa80fp-1, 0x1.fba92d3fc7f97p-11, -0x1.d0c0c2d8d7106p-65}, // 22 * 0x1p-15 = 0x1.6p-11
    {0x1.6ffe136f8e666p-11, 0x1.159ec14ef6c54p-66, 0x1.ffa411p-1, 0x1.095b7b5aa1f56p-10, -0x1.db7ef19c74ad4p-64}, // 23 * 0x1p-15 = 0x1.7p-11
    {0x1.7ffff27d78001p-11, 0x1.b3115ff661d2bp-65, 0x1.ffa012p-1, 0x1.14e55a4f47745p-10, 0x1.3953723c61a5cp-64}, // 24 * 0x1p-15 = 0x1.8p-11
    {0x1.8ffe0fff33381p-11, -0x1.c39c4ae285513p-65, 0x1.ff9c14p-1, 0x1.206c6d1d1df2fp-10, 0x1.dc61965f32a93p-65}, // 25 * 0x1p-15 = 0x1.9p-11
    {0x1.a0006f0688c6p-11, 0x1.ce4e54f30ae24p-66, 0x1.ff9815p-1, 0x1.2bf67a311edcbp-10, -0x1.5801b43c1ca0dp-64}, // 26 * 0x1p-15 = 0x1.ap-11
    {0x1.afff0c64a82cfp-11, 0x1.f6b790232870fp-66, 0x1.ff9417p-1, 0x1.377dbb137e3cp-10, 0x1.f0791610bacfp-66}, // 27 * 0x1p-15 = 0x1.bp-11
    {0x1.c001eb6b6875dp-11, 0x1.c0567de77cbc7p-68, 0x1.ff9018p-1, 0x1.4307f6484b502p-10, -0x1.c3e70188b37e3p-64}, // 28 * 0x1p-15 = 0x1.cp-11
    {0x1.d00108abe9823p-11, -0x1.aebfb9904e456p-66, 0x1.ff8c1ap-1, 0x1.4e8f6540a3fc3p-10, -0x1.f1b9086283c46p-64}, // 29 * 0x1p-15 = 0x1.dp-11
    {0x1.e00065d7d9051p-11, -0x1.5d5f8f4a5b976p-68, 0x1.ff881cp-1, 0x1.5a16eb41a0f0ep-10, 0x1.f9d41d99af255p-64}, // 30 * 0x1p-15 = 0x1.ep-11
    {0x1.f00002f0b62p-11, 0x1.1462dfc0657c5p-67, 0x1.ff841ep-1, 0x1.659e884b9e38cp-10, 0x1.1a03298288426p-66}, // 31 * 0x1p-15 = 0x1.fp-11
    {0x1.ffffdff800008p-11, 0x1.ffffdff800008p-71, 0x1.ff802p-1, 0x1.71263c5ef7e04p-10, 0x1.288c11a74fc32p-64}, // 32 * 0x1p-15 = 0x1p-10
    {0x1.07fffe779afp-10, 0x1.2c6d603f8cfe2p-67, 0x1.ff7c22p-1, 0x1.7cae077c09f63p-10, -0x1.3afdeb3cf5486p-64}, // 33 * 0x1p-15 = 0x1.08p-10
    {0x1.10002cebeb81fp-10, 0x1.fdae868575fdfp-64, 0x1.ff7824p-1, 0x1.8835e9a3308b5p-10, 0x1.360a818e955aep-64}, // 34 * 0x1p-15 = 0x1.1p-10
    {0x1.18007b59b15edp-10, 0x1.f13d75e6ad534p-64, 0x1.ff7426p-1, 0x1.93bde2d4c7b2dp-10, -0x1.70c8c3a9c376cp-64}, // 35 * 0x1p-15 = 0x1.18p-10
    {0x1.2000e9c1ac355p-10, -0x1.3b2dac38de8a2p-65, 0x1.ff7028p-1, 0x1.9f45f3112b81cp-10, -0x1.1e2ccb3307d2cp-64}, // 36 * 0x1p-15 = 0x1.2p-10
    {0x1.27ff76fc707a5p-10, -0x1.72c68e4171f87p-70, 0x1.ff6c2bp-1, 0x1.aacb36da463f7p-10, -0x1.a3d5e7a67d81dp-64}, // 37 * 0x1p-15 = 0x1.28p-10
    {0x1.3000255311616p-10, -0x1.07f200a56c0d9p-64, 0x1.ff682dp-1, 0x1.b653752791d5ep-10, 0x1.49eeaee3e7e22p-64}, // 38 * 0x1p-15 = 0x1.3p-10
    {0x1.3800f3a62641ep-10, 0x1.e46064e7e564ap-64, 0x1.ff642fp-1, 0x1.c1dbca80be495p-10, -0x1.2bad1331ec7f7p-64}, // 39 * 0x1p-15 = 0x1.38p-10
    {0x1.3fffe0b63c00fp-10, 0x1.1c12ce2294ad1p-64, 0x1.ff6032p-1, 0x1.cd61535665a58p-10, -0x1.e3b9cbe22421ep-65}, // 40 * 0x1p-15 = 0x1.4p-10
    {0x1.4800eefc7497bp-10, 0x1.301f5325738d3p-64, 0x1.ff5c34p-1, 0x1.d8e9d6c2a2198p-10, -0x1.020e70a4fe47p-65}, // 41 * 0x1p-15 = 0x1.48p-10
    {0x1.50001bf12820cp-10, 0x1.7838fa4800bd8p-65, 0x1.ff5837p-1, 0x1.e46f8da086d2ep-10, -0x1.3b01368943604p-65}, // 42 * 0x1p-15 = 0x1.5p-10
    {0x1.57ff68d548c65p-10, -0x1.a8742af1442f9p-64, 0x1.ff543ap-1, 0x1.eff55b8031c2ap-10, 0x1.ba7b9ae7bd98bp-64}, // 43 * 0x1p-15 = 0x1.58p-10
    {0x1.6000d709d22d2p-10, -0x1.c82f0ab62b5d9p-64, 0x1.ff503cp-1, 0x1.fb7e2408d562ep-10, -0x1.5dcbd30b0022cp-64}, // 44 * 0x1p-15 = 0x1.6p-10
    {0x1.680063d70d51cp-10, -0x1.da2a40827aef3p-64, 0x1.ff4c3fp-1, 0x1.03820ff972b21p-9, 0x1.3dda8489194dfp-65}, // 45 * 0x1p-15 = 0x1.68p-10
    {0x1.70001095f3c04p-10, 0x1.2b39520716f95p-64, 0x1.ff4842p-1, 0x1.0945196fe7ae9p-9, -0x1.92d80f790e27dp-64}, // 46 * 0x1p-15 = 0x1.7p-10
    {0x1.77ffdd4744d93p-10, -0x1.8460e33c618c3p-65, 0x1.ff4445p-1, 0x1.0f082e67f79acp-9, -0x1.2d7918e1c1793p-63}, // 47 * 0x1p-15 = 0x1.78p-10
    {0x1.7fffc9ebc002ep-10, -0x1.7ba8099ffaa38p-64, 0x1.ff4048p-1, 0x1.14cb4ee1d06b9p-9, -0x1.3d0449b698d96p-63}, // 48 * 0x1p-15 = 0x1.8p-10
    {0x1.87ffd68424a9bp-10, -0x1.3533d48c46104p-65, 0x1.ff3c4bp-1, 0x1.1a8e7adda017p-9, -0x1.05480904c87d1p-64}, // 49 * 0x1p-15 = 0x1.88p-10
    {0x1.90000311324p-10, 0x1.2c953c80e6224p-65, 0x1.ff384ep-1, 0x1.2051b25b94943p-9, -0x1.b10b812d27a9bp-63}, // 50 * 0x1p-15 = 0x1.9p-10
    {0x1.98004f93a83e3p-10, -0x1.ac0592817deabp-65, 0x1.ff3451p-1, 0x1.2614f55bdbdb3p-9, 0x1.5f1b3571315bp-63}, // 51 * 0x1p-15 = 0x1.98p-10
    {0x1.a000bc0c46228p-10, -0x1.5ff9036a88b81p-64, 0x1.ff3054p-1, 0x1.2bd843dea3e56p-9, -0x1.3aaab92869c01p-65}, // 52 * 0x1p-15 = 0x1.ap-10
    {0x1.a7ff46d373617p-10, -0x1.7cfcbf2bb73e6p-66, 0x1.ff2c58p-1, 0x1.319a2bf6b7476p-9, 0x1.87699b4e05189p-63}, // 53 * 0x1p-15 = 0x1.a8p-10
    {0x1.affff3329ba03p-10, -0x1.c5ed5170ad8fbp-64, 0x1.ff285bp-1, 0x1.375d917c27e0bp-9, 0x1.f5df5dccce818p-65}, // 54 * 0x1p-15 = 0x1.bp-10
    {0x1.b800bf8a2a33cp-10, 0x1.1fbb5daedaefp-64, 0x1.ff245ep-1, 0x1.3d210284a323cp-9, -0x1.f578a6f395acdp-64}, // 55 * 0x1p-15 = 0x1.b8p-10
    {0x1.bfffaa1a7c073p-10, 0x1.683d25ccd5612p-66, 0x1.ff2062p-1, 0x1.42e30d1a4b89ep-9, 0x1.c35ac071e3f6p-63}, // 56 * 0x1p-15 = 0x1.cp-10
    {0x1.c800b65d11787p-10, -0x1.1493791cd773cp-64, 0x1.ff1c65p-1, 0x1.48a6952683107p-9, -0x1.d37a56220787dp-68}, // 57 * 0x1p-15 = 0x1.c8p-10
    {0x1.cfffe0c9e1e0fp-10, 0x1.8dc34eed35cccp-65, 0x1.ff1869p-1, 0x1.4e68b6ba7e475p-9, -0x1.89323eb9ff693p-63}, // 58 * 0x1p-15 = 0x1.dp-10
    {0x1.d7ff2b220f043p-10, -0x1.118eeba3b048fp-64, 0x1.ff146dp-1, 0x1.542ae3cc7690dp-9, -0x1.ab0ef1276d28p-66}, // 59 * 0x1p-15 = 0x1.d8p-10
    {0x1.e0009746c8165p-10, -0x1.4ffeb5e58bcf5p-66, 0x1.ff107p-1, 0x1.59ee8e5e2f905p-9, 0x1.f466a629b4413p-63}, // 60 * 0x1p-15 = 0x1.ep-10
    {0x1.e800217fef612p-10, -0x1.fda2bc16c43c6p-64, 0x1.ff0c74p-1, 0x1.5fb0d26f8e1c8p-9, 0x1.971f054294b07p-63}, // 61 * 0x1p-15 = 0x1.e8p-10
    {0x1.efffcba6b102bp-10, -0x1.0c5a0cb90ea7cp-64, 0x1.ff0878p-1, 0x1.657321ff7367fp-9, -0x1.13863f56c3cbap-63}, // 62 * 0x1p-15 = 0x1.fp-10
    {0x1.f7ff95bbcc2bp-10, 0x1.b86e5ba661b1dp-66, 0x1.ff047cp-1, 0x1.6b357d0e0d55p-9, 0x1.570efd19d249fp-63}, // 63 * 0x1p-15 = 0x1.f8p-10
    {0x1.ffff7fc0001p-10, 0x1.ffff7fc0001p-64, 0x1.ff008p-1, 0x1.70f7e39b89c76p-9, 0x1.d4c4a05fc792p-64}, // 64 * 0x1p-15 = 0x1p-9
    {0x1.03ffc4da05f6dp-9, 0x1.cce7f6f79c117p-65, 0x1.fefc84p-1, 0x1.76ba55a816a3bp-9, -0x1.92f8c9f16636dp-63}, // 65 * 0x1p-15 = 0x1.04p-9
    {0x1.07ffd9cc5782ep-9, -0x1.f1d10b8e6e5f1p-63, 0x1.fef888p-1, 0x1.7c7cd333e1cf9p-9, -0x1.4a74c729efcc7p-64}, // 66 * 0x1p-15 = 0x1.08p-9
    {0x1.0bfffeb7545p-9, 0x1.a51bf97ef23a1p-66, 0x1.fef48cp-1, 0x1.823f5c3f1931dp-9, 0x1.e6be82f9936a4p-63}, // 67 * 0x1p-15 = 0x1.0cp-9
    {0x1.1000339b5c053p-9, 0x1.c1030b552a0e6p-66, 0x1.fef09p-1, 0x1.8801f0c9eab26p-9, 0x1.fb21627ede9cap-64}, // 68 * 0x1p-15 = 0x1.1p-9
    {0x1.14007878ce4c5p-9, -0x1.a09be39ba21a6p-63, 0x1.feec94p-1, 0x1.8dc490d4843a2p-9, 0x1.1df60724d15b3p-65}, // 69 * 0x1p-15 = 0x1.14p-9
    {0x1.17ffcc37bdf54p-9, -0x1.8a096f691bb04p-63, 0x1.fee899p-1, 0x1.9385ca40a2f84p-9, 0x1.b2d801a1718c5p-64}, // 70 * 0x1p-15 = 0x1.18p-9
    {0x1.1c00310521d0bp-9, -0x1.1d7bfb3ad6193p-65, 0x1.fee49dp-1, 0x1.99488148735bdp-9, 0x1.4bca52ef093abp-63}, // 71 * 0x1p-15 = 0x1.1cp-9
    {0x1.1fffa4acbe104p-9, 0x1.016c3b6e2f2cbp-65, 0x1.fee0a2p-1, 0x1.9f09d1ac5f8c3p-9, -0x1.178499ab07001p-63}, // 72 * 0x1p-15 = 0x1.2p-9
    {0x1.2400296b91eb5p-9, 0x1.fa355249a451dp-63, 0x1.fedca6p-1, 0x1.a4cc9fb21e4e2p-9, -0x1.f6c361e551821p-63}, // 73 * 0x1p-15 = 0x1.24p-9
    {0x1.27ffbcfd58d8cp-9, 0x1.157f10c7c3624p-68, 0x1.fed8abp-1, 0x1.aa8e070e8f496p-9, 0x1.ddf7110a08fbap-64}, // 74 * 0x1p-15 = 0x1.28p-9
    {0x1.2c0061af1b36ap-9, -0x1.f3ff38a575161p-63, 0x1.fed4afp-1, 0x1.b050ec12f3f4cp-9, 0x1.9f4f4b855ee07p-63}, // 75 * 0x1p-15 = 0x1.2cp-9
    {0x1.3000152c8b00ep-9, -0x1.660f1b16c5ff9p-67, 0x1.fed0b4p-1, 0x1.b6126a68a11c6p-9, -0x1.111e0077b33e7p-63}, // 76 * 0x1p-15 = 0x1.3p-9
    {0x1.33ffd89e5d7fp-9, 0x1.683f53ed9b1bfp-63, 0x1.feccb9p-1, 0x1.bbd3f439bfe2ap-9, 0x1.129f92e605dffp-63}, // 77 * 0x1p-15 = 0x1.34p-9
    {0x1.37ffac04f22dcp-9, -0x1.ff31042b59debp-65, 0x1.fec8bep-1, 0x1.c19589867e17bp-9, -0x1.990d948d9f518p-63}, // 78 * 0x1p-15 = 0x1.38p-9
    {0x1.3bff8f60a88cbp-9, 0x1.a9c8e5d3d5357p-63, 0x1.fec4c3p-1, 0x1.c7572a4f098c8p-9, 0x1.d45d2d574df26p-63}, // 79 * 0x1p-15 = 0x1.3cp-9
    {0x1.3fff82b1e01e9p-9, 0x1.e4b221ffaa82bp-63, 0x1.fec0c8p-1, 0x1.cd18d69390137p-9, -0x1.2e623eb44a04bp-63}, // 80 * 0x1p-15 = 0x1.4p-9
    {0x1.43ff85f8f869p-9, 0x1.7eec78527601bp-64, 0x1.febccdp-1, 0x1.d2da8e543f7f9p-9, 0x1.65d0701b3da64p-63}, // 81 * 0x1p-15 = 0x1.44p-9
    {0x1.47ff993650f49p-9, 0x1.5edc71502ce2ep-63, 0x1.feb8d2p-1, 0x1.d89c519145a56p-9, -0x1.d56cec800da7fp-63}, // 82 * 0x1p-15 = 0x1.48p-9
    {0x1.4bffbc6a494cep-9, 0x1.8559d0be24239p-63, 0x1.feb4d7p-1, 0x1.de5e204ad05a2p-9, -0x1.b1d7a3b123d4ep-63}, // 83 * 0x1p-15 = 0x1.4cp-9
    {0x1.4fffef9541008p-9, 0x1.9a7ef2ecdf10ap-63, 0x1.feb0dcp-1, 0x1.e41ffa810d745p-9, -0x1.a993481e299bdp-65}, // 84 * 0x1p-15 = 0x1.5p-9
    {0x1.540032b797a1p-9, 0x1.64cc12b8c075ap-64, 0x1.feace1p-1, 0x1.e9e1e0342acb8p-9, 0x1.7b883d781fdd4p-65}, // 85 * 0x1p-15 = 0x1.54p-9
    {0x1.57ff8479392dcp-9, -0x1.a4e312ac18b3fp-63, 0x1.fea8e7p-1, 0x1.efa25f17bb226p-9, 0x1.c71d718c58d2ap-67}, // 86 * 0x1p-15 = 0x1.58p-9
    {0x1.5bffe78769513p-9, -0x1.581c4c9f08c6bp-63, 0x1.fea4ecp-1, 0x1.f5645bc23f8e1p-9, 0x1.cee36238719a1p-64}, // 87 * 0x1p-15 = 0x1.5cp-9
    {0x1.60005a8e171p-9, -0x1.b7efa5ad99dd9p-63, 0x1.fea0f1p-1, 0x1.fb2663ea2db85p-9, -0x1.552e795894889p-63}, // 88 * 0x1p-15 = 0x1.6p-9
    {0x1.63ffdc2925e68p-9, 0x1.f28eb6b7323b9p-67, 0x1.fe9cf7p-1, 0x1.0073829d38167p-8, -0x1.c5c6221acedf4p-67}, // 89 * 0x1p-15 = 0x1.64p-9
    {0x1.68006f1dea581p-9, -0x1.b73ff0c3d12ebp-64, 0x1.fe98fcp-1, 0x1.0354922d6c2aep-8, -0x1.62a9bee9f7522p-63}, // 90 * 0x1p-15 = 0x1.68p-9
    {0x1.6c00109fc9389p-9, -0x1.8ce1845671c55p-63, 0x1.fe9502p-1, 0x1.0634ee4f15805p-8, -0x1.2973908f16839p-62}, // 91 * 0x1p-15 = 0x1.6cp-9
    {0x1.6fffc2139e077p-9, 0x1.f894365aa51ffp-63, 0x1.fe9108p-1, 0x1.0915502cec9cfp-8, 0x1.c26341891fb94p-62}, // 92 * 0x1p-15 = 0x1.7p-9
    {0x1.73ff8379c8263p-9, 0x1.9a87c6285fd65p-64, 0x1.fe8d0ep-1, 0x1.0bf5b7c7085fbp-8, -0x1.a6ae1b5a0fc18p-62}, // 93 * 0x1p-15 = 0x1.74p-9
    {0x1.7800564b30de8p-9, 0x1.4df109a61f504p-66, 0x1.fe8913p-1, 0x1.0ed6de4f57c53p-8, 0x1.04149239acf29p-62}, // 94 * 0x1p-15 = 0x1.78p-9
    {0x1.7c00379b26a2p-9, 0x1.630c806af2e59p-63, 0x1.fe8519p-1, 0x1.11b75163b2bbdp-8, 0x1.9ea9a295d7e25p-62}, // 95 * 0x1p-15 = 0x1.7cp-9
    {0x1.800028de90034p-9, 0x1.6d6c848d15831p-66, 0x1.fe811fp-1, 0x1.1497ca3496fddp-8, 0x1.34ca92074b5e6p-65}, // 96 * 0x1p-15 = 0x1.8p-9
    {0x1.84002a15cc6f7p-9, 0x1.7bac132085b33p-64, 0x1.fe7d25p-1, 0x1.177848c21b6c1p-8, -0x1.fb96ec6aab17cp-65}, // 97 * 0x1p-15 = 0x1.84p-9
    {0x1.88003b413b56dp-9, 0x1.9538b4c5c9dd1p-63, 0x1.fe792bp-1, 0x1.1a58cd0c56e8p-8, 0x1.c91427cdc0a92p-62}, // 98 * 0x1p-15 = 0x1.88p-9
    {0x1.8c005c613c2cap-9, -0x1.d63fed50775dep-65, 0x1.fe7531p-1, 0x1.1d3957136053bp-8, 0x1.d5b40059cf7f2p-62}, // 99 * 0x1p-15 = 0x1.8cp-9
    {0x1.8fff8be5921a4p-9, -0x1.0ccf5e333a9e9p-66, 0x1.fe7138p-1, 0x1.20192d9cce658p-8, -0x1.0ef8613c770a8p-66}, // 100 * 0x1p-15 = 0x1.9p-9
    {0x1.93ffccebd1cd1p-9, 0x1.20f4111deaf9dp-63, 0x1.fe6d3ep-1, 0x1.22f9c31c46ecdp-8, 0x1.e687045f12bdep-63}, // 101 * 0x1p-15 = 0x1.94p-9
    {0x1.98001de7c1c1cp-9, -0x1.1cafe805939e2p-64, 0x1.fe6944p-1, 0x1.25da5e58d2075p-8, -0x1.2780ef22d42f2p-64}, // 102 * 0x1p-15 = 0x1.98p-9
    {0x1.9c007ed9c1775p-9, 0x1.14fc8cb270e7dp-63, 0x1.fe654ap-1, 0x1.28baff5286991p-8, 0x1.662631716e756p-63}, // 103 * 0x1p-15 = 0x1.9cp-9
    {0x1.9fffee218700ap-9, -0x1.b534bb12ca226p-66, 0x1.fe6151p-1, 0x1.2b9aecc935e56p-8, -0x1.bc5d90b8f1d66p-62}, // 104 * 0x1p-15 = 0x1.ap-9
    {0x1.a4006efcc0fcp-9, -0x1.2524335057878p-63, 0x1.fe5d57p-1, 0x1.2e7b993c10914p-8, 0x1.f628411d6d3ap-62}, // 105 * 0x1p-15 = 0x1.a4p-9
    {0x1.a7fffe26792p-9, 0x1.b488567e6d925p-65, 0x1.fe595ep-1, 0x1.315b9229310e3p-8, 0x1.32c89a9297db7p-63}, // 106 * 0x1p-15 = 0x1.a8p-9
    {0x1.abff9d3fb81fp-9, -0x1.fd773e728eb87p-64, 0x1.fe5565p-1, 0x1.343b90d0f3d29p-8, -0x1.2bee748b1f835p-63}, // 107 * 0x1p-15 = 0x1.acp-9
    {0x1.b0004df9934bdp-9, 0x1.8395f5bc85576p-63, 0x1.fe516bp-1, 0x1.371c4e797a6cdp-8, 0x1.cb72f84415034p-63}, // 108 * 0x1p-15 = 0x1.bp-9
    {0x1.b4000cf700f85p-9, 0x1.e1f0223699c58p-64, 0x1.fe4d72p-1, 0x1.39fc5898377e4p-8, -0x1.3ca140097dc4fp-66}, // 109 * 0x1p-15 = 0x1.b4p-9
    {0x1.b7ffdbe513729p-9, -0x1.98e4f9b1fb184p-63, 0x1.fe4979p-1, 0x1.3cdc6871db5f2p-8, -0x1.9345680cc160ap-62}, // 110 * 0x1p-15 = 0x1.b8p-9
    {0x1.bbffbac42a095p-9, 0x1.24156f86a31c8p-63, 0x1.fe458p-1, 0x1.3fbc7e067ce68p-8, 0x1.d359695e8eea6p-62}, // 111 * 0x1p-15 = 0x1.bcp-9
    {0x1.bfffa994a40e9p-9, -0x1.a4362c7f90a32p-63, 0x1.fe4187p-1, 0x1.429c995632ec3p-8, 0x1.b08bee8756463p-62}, // 112 * 0x1p-15 = 0x1.cp-9
    {0x1.c3ffa856e0d6fp-9, 0x1.3f4bc4afbd407p-63, 0x1.fe3d8ep-1, 0x1.457cba6114486p-8, -0x1.16f1c6f118e6ap-64}, // 113 * 0x1p-15 = 0x1.c4p-9
    {0x1.c7ffb70b3fba6p-9, -0x1.f7754e3b6281cp-64, 0x1.fe3995p-1, 0x1.485ce12737d3cp-8, -0x1.9831ce103ecbep-65}, // 114 * 0x1p-15 = 0x1.c8p-9
    {0x1.cbffd5b220138p-9, -0x1.13a306aace17bp-63, 0x1.fe359cp-1, 0x1.4b3d0da8b467ap-8, -0x1.33f8c2e5f53b8p-66}, // 115 * 0x1p-15 = 0x1.ccp-9
    {0x1.d000044be1401p-9, -0x1.b36474bb14031p-63, 0x1.fe31a3p-1, 0x1.4e1d3fe5a0dddp-8, 0x1.19489e0a375efp-64}, // 116 * 0x1p-15 = 0x1.dp-9
    {0x1.d40042d8e2a0bp-9, 0x1.29a5e1f98912bp-64, 0x1.fe2daap-1, 0x1.50fd77de1410bp-8, -0x1.9fbaf9e3baa81p-63}, // 117 * 0x1p-15 = 0x1.d4p-9
    {0x1.d7ff8f80a9f8ap-9, 0x1.20c9a519465a7p-65, 0x1.fe29b2p-1, 0x1.53dcfc3dacbd4p-8, 0x1.ca9cdb11dc86bp-64}, // 118 * 0x1p-15 = 0x1.d8p-9
    {0x1.dbffedf145dcap-9, 0x1.393e42134e08fp-64, 0x1.fe25b9p-1, 0x1.56bd3fac00842p-8, -0x1.8e164f95b2c0ap-62}, // 119 * 0x1p-15 = 0x1.dcp-9
    {0x1.e0005c5640109p-9, 0x1.dfe0bece3a625p-63, 0x1.fe21cp-1, 0x1.599d88d61f942p-8, -0x1.3e38aab655813p-62}, // 120 * 0x1p-15 = 0x1.ep-9
    {0x1.e3ffd8cb12e3p-9, -0x1.1f2470b617c04p-64, 0x1.fe1dc8p-1, 0x1.5c7d1e6354942p-8, -0x1.672c401514e5bp-62}, // 121 * 0x1p-15 = 0x1.e4p-9
    {0x1.e8006715e3a4bp-9, -0x1.32fa14c2a3be1p-64, 0x1.fe19cfp-1, 0x1.5f5d7303dd44ap-8, 0x1.9de715026a889p-64}, // 122 * 0x1p-15 = 0x1.e8p-9
    {0x1.ec0003694404p-9, 0x1.72f7a4b5765adp-63, 0x1.fe15d7p-1, 0x1.623d1404c6e1bp-8, -0x1.5ed53db89a97ap-62}, // 123 * 0x1p-15 = 0x1.ecp-9
    {0x1.efffafaa784c9p-9, -0x1.6175d77b00108p-65, 0x1.fe11dfp-1, 0x1.651cbabef46dbp-8, 0x1.d58bed52db82ep-64}, // 124 * 0x1p-15 = 0x1.fp-9
    {0x1.f4006dced3bf7p-9, 0x1.7e9e6780b774p-63, 0x1.fe0de6p-1, 0x1.67fd20910e165p-8, -0x1.1478031fd6a56p-63}, // 125 * 0x1p-15 = 0x1.f4p-9
    {0x1.f80039f0d1269p-9, -0x1.f78b02ffd3efdp-63, 0x1.fe09eep-1, 0x1.6adcd2bf792abp-8, 0x1.1800de5a06799p-62}, // 126 * 0x1p-15 = 0x1.f8p-9
    {0x1.fc001601c028fp-9, 0x1.373040c3f2eaep-65, 0x1.fe05f6p-1, 0x1.6dbc8aa76c9d9p-8, -0x1.49107de58e8a5p-62}, // 127 * 0x1p-15 = 0x1.fcp-9
    {0x1.00000101p-8, 0x1.0100000101p-64, 0x1.fe01fep-1, 0x1.709c4848ff3ddp-8, -0x1.f86284455f0dfp-62}, // 128 * 0x1p-15 = 0x1p-8
};

#define LOG2_OVERFLOW_GUARANTEED 1025.
#define POW_OVERFLOW_GUARANTEED 1025.
// If |ylg(x)| < 2^-55 then |1 - |x**y|| < 2^-55/ln(2) < ulpd(1.0)
#define POW_1_GUARANTEED 0x1p-55
#define POW_UNDERFLOW_GUARANTEED -1100.

static const double lgehi = 0x1.7154768p0, lgelo = -0x2.D47D01E8882F0p-28;
static const double lge = 0x1.71547652B82FE1777D0p0;

// gcc -Impfr/include -Lmpfr/lib -lmpfr -lgmp powtables.c -O3 -o xpowtables -std=gnu99 -Wall && ./xpowtables
static const double Exp2Table[][2] = { // d, y-1 for x=i/2**8, d = R(lg(R53(2**x))), thi=R53(2**d1)
    {0x0p+0, 0x1p+0}, // rerr = 0x0p+0, 2**(0/2**8) + 0/2**53
    {0x1.000002006be8p-8, 0x1.00b1afa70ff17p+0}, // rerr = -0x1.62b1fe056654p-77, 2**(1/2**8) + 4197757/2**53
    {0x1.00000278a56cp-7, 0x1.0163daa324ff2p+0}, // rerr = 0x1.986caf551eb28p-77, 2**(2/2**8) + 10365275/2**53
    {0x1.80000052e12p-7, 0x1.0216814423fd2p+0}, // rerr = 0x1.18df196373e1p-77, 2**(3/2**8) + 1357896/2**53
    {0x1.000000b822fap-6, 0x1.02c9a3e97c1e4p+0}, // rerr = -0x1.e05b6534c5c5p-79, 2**(4/2**8) + 6033789/2**53
    {0x1.40000009f2ep-6, 0x1.037d42e137b27p+0}, // rerr = -0x1.a2dbf94bbb808p-78, 2**(5/2**8) + 326000/2**53
    {0x1.8000018938b2p-6, 0x1.04315e8b3c115p+0}, // rerr = 0x1.87894f515755cp-77, 2**(6/2**8) + 12885081/2**53
    {0x1.c000004b5a74p-6, 0x1.04e5f7303a36fp+0}, // rerr = 0x1.c84b8bfd7e2c4p-76, 2**(7/2**8) + 2469178/2**53
    {0x1.0000000b3ce6p-5, 0x1.059b0d3198058p+0}, // rerr = -0x1.9aa2b29072e8cp-77, 2**(8/2**8) + 736486/2**53
    {0x1.20000036d022p-5, 0x1.0650a0e4f96aap+0}, // rerr = 0x1.b3825dad8318p-78, 2**(9/2**8) + 3592226/2**53
    {0x1.4000001213b8p-5, 0x1.0706b29e466bbp+0}, // rerr = 0x1.fef036f8868ep-76, 2**(10/2**8) + 1184696/2**53
    {0x1.60000053dd6p-5, 0x1.07bd42b9099ep+0}, // rerr = 0x1.e7f68d8c79fp-77, 2**(11/2**8) + 5496160/2**53
    {0x1.8000004f61bfp-5, 0x1.087451892075bp+0}, // rerr = -0x1.7cdf72f7bd5fp-76, 2**(12/2**8) + 5202367/2**53
    {0x1.a000003a9d64p-5, 0x1.092bdf67b12a8p+0}, // rerr = 0x1.f71f0e8bb465p-76, 2**(13/2**8) + 3841380/2**53
    {0x1.c00000e28345p-5, 0x1.09e3ecb187ccbp+0}, // rerr = 0x1.8b7368d9b92p-83, 2**(14/2**8) + 14844741/2**53
    {0x1.e000005ccf04p-5, 0x1.0a9c79b40b8a8p+0}, // rerr = -0x1.6a68fda914206p-76, 2**(15/2**8) + 6082308/2**53
    {0x1.00000020b2a88p-4, 0x1.0b5586d11340ap+0}, // rerr = 0x1.44f0078506318p-76, 2**(16/2**8) + 4285777/2**53
    {0x1.1000000a2dbd8p-4, 0x1.0c0f145ebcfc3p+0}, // rerr = -0x1.ce9c6095ecce4p-76, 2**(17/2**8) + 1334139/2**53
    {0x1.2000001591738p-4, 0x1.0cc922b81fa4ap+0}, // rerr = -0x1.b09f95d5884p-79, 2**(18/2**8) + 2826983/2**53
    {0x1.300000127c128p-4, 0x1.0d83b2346db19p+0}, // rerr = 0x1.d9f200154e56p-78, 2**(19/2**8) + 2422821/2**53
    {0x1.40000001ac3bp-4, 0x1.0e3ec32d50afap+0}, // rerr = 0x1.7c0531f62ed3cp-77, 2**(20/2**8) + 219254/2**53
    {0x1.50000000e57e8p-4, 0x1.0efa55fe05226p+0}, // rerr = -0x1.9d8037e6ffde4p-76, 2**(21/2**8) + 117501/2**53
    {0x1.60000013bce1p-4, 0x1.0fb66b00d5876p+0}, // rerr = 0x1.805d531027d3ep-76, 2**(22/2**8) + 2587074/2**53
    {0x1.70000000136cp-4, 0x1.1073028d73192p+0}, // rerr = -0x1.e1836ed7a5476p-76, 2**(23/2**8) + 9944/2**53
    {0x1.8000005a20d3p-4, 0x1.11301d05505f2p+0}, // rerr = -0x1.09318b5a1ec3p-78, 2**(24/2**8) + 11813286/2**53
    {0x1.900000053835p-4, 0x1.11edbab6209c3p+0}, // rerr = 0x1.6f92b52dc72b8p-78, 2**(25/2**8) + 684138/2**53
    {0x1.a000000c21f28p-4, 0x1.12abdc07537b2p+0}, // rerr = 0x1.544e8ecbb05cp-78, 2**(26/2**8) + 1590245/2**53
    {0x1.b000000715768p-4, 0x1.136a814f74dp+0}, // rerr = 0x1.a0a5b1f9411bep-76, 2**(27/2**8) + 928493/2**53
    {0x1.c0000006f2418p-4, 0x1.1429aaeae5f8cp+0}, // rerr = -0x1.4e345d15b56dp-77, 2**(28/2**8) + 910467/2**53
    {0x1.d000001a57828p-4, 0x1.14e959362f13ep+0}, // rerr = -0x1.07e8f8212c3dp-76, 2**(29/2**8) + 3452677/2**53
    {0x1.e000000cae79p-4, 0x1.15a98c8af1704p+0}, // rerr = -0x1.0e3bcb39671ep-77, 2**(30/2**8) + 1662194/2**53
    {0x1.f0000045e3cep-4, 0x1.166a454a6734ap+0}, // rerr = 0x1.7aea0ef55fde6p-76, 2**(31/2**8) + 9160604/2**53
    {0x1.0000000383cecp-3, 0x1.172b83c82a1c7p+0}, // rerr = 0x1.d355c0f1c68fcp-77, 2**(32/2**8) + 921403/2**53
    {0x1.0800001438468p-3, 0x1.17ed486b46247p+0}, // rerr = 0x1.c0678f09aeffcp-76, 2**(33/2**8) + 5300506/2**53
    {0x1.10000002d00dp-3, 0x1.18af93890d45fp+0}, // rerr = 0x1.9a333bc270ep-83, 2**(34/2**8) + 737332/2**53
    {0x1.1800000c1682cp-3, 0x1.197265849c983p+0}, // rerr = 0x1.435da5a20b4b8p-78, 2**(35/2**8) + 3168779/2**53
    {0x1.20000017a069cp-3, 0x1.1a35beb93e6cep+0}, // rerr = -0x1.7a3ebf29a7a52p-76, 2**(36/2**8) + 6193575/2**53
    {0x1.2800000cb57fcp-3, 0x1.1af99f82703adp+0}, // rerr = -0x1.2a749979b094p-77, 2**(37/2**8) + 3331583/2**53
    {0x1.30000032ca86p-3, 0x1.1bbe084526787p+0}, // rerr = -0x1.5d7944954c6b8p-77, 2**(38/2**8) + 13314584/2**53
    {0x1.3800000a24a88p-3, 0x1.1c82f9537bd11p+0}, // rerr = -0x1.d5c75f60c3204p-76, 2**(39/2**8) + 2658978/2**53
    {0x1.40000011652f8p-3, 0x1.1d4873183994p+0}, // rerr = 0x1.e96ae1ae7acfp-77, 2**(40/2**8) + 4560062/2**53
    {0x1.480000077f894p-3, 0x1.1e0e75ebfdd9fp+0}, // rerr = 0x1.f45d7a992ca1cp-76, 2**(41/2**8) + 1965605/2**53
    {0x1.500000246a5ecp-3, 0x1.1ed5023356925p+0}, // rerr = -0x1.4bd720d687eep-76, 2**(42/2**8) + 9546107/2**53
    {0x1.5800000d3437p-3, 0x1.1f9c1844d5eep+0}, // rerr = -0x1.2c3079d66a7bdp-75, 2**(43/2**8) + 3461340/2**53
    {0x1.6000002d6a13cp-3, 0x1.2063b88a9792cp+0}, // rerr = 0x1.724a435fba248p-76, 2**(44/2**8) + 11905103/2**53
    {0x1.6800000135064p-3, 0x1.212be357a8c02p+0}, // rerr = 0x1.913d1828f76b4p-77, 2**(45/2**8) + 316441/2**53
    {0x1.7000000af236p-3, 0x1.21f49918f0c89p+0}, // rerr = -0x1.2f6ed549704bcp-77, 2**(46/2**8) + 2869464/2**53
    {0x1.7800000ddc324p-3, 0x1.22bdda28ee532p+0}, // rerr = 0x1.45fd96c1409dcp-76, 2**(47/2**8) + 3633353/2**53
    {0x1.80000027763f8p-3, 0x1.2387a6eb3ae9ap+0}, // rerr = 0x1.e9cd979d7eae4p-77, 2**(48/2**8) + 10344702/2**53
    {0x1.88000005b9428p-3, 0x1.2451ffb8b2383p+0}, // rerr = 0x1.979c186dccfcap-76, 2**(49/2**8) + 1500426/2**53
    {0x1.9000000cb401cp-3, 0x1.251ce4fc6d00ep+0}, // rerr = 0x1.c9b0bd49e857cp-77, 2**(50/2**8) + 3330055/2**53
    {0x1.98000011eb0a4p-3, 0x1.25e85713b531p+0}, // rerr = 0x1.0840a8e92d50cp-77, 2**(51/2**8) + 4697129/2**53
    {0x1.a000000cc720cp-3, 0x1.26b4565f6e137p+0}, // rerr = -0x1.aec71b6c26dp-77, 2**(52/2**8) + 3349635/2**53
    {0x1.a800000515df8p-3, 0x1.2780e3426027p+0}, // rerr = 0x1.0e0ccc8cbf958p-76, 2**(53/2**8) + 1333118/2**53
    {0x1.b000000ccc9bp-3, 0x1.284dfe209ecfdp+0}, // rerr = -0x1.71831ed3ebe2p-79, 2**(54/2**8) + 3355244/2**53
    {0x1.b8000019bdbap-3, 0x1.291ba75bb25abp+0}, // rerr = -0x1.ab229e72f3b46p-76, 2**(55/2**8) + 6747880/2**53
    {0x1.c0000004cde7cp-3, 0x1.29e9df5279f0bp+0}, // rerr = -0x1.8b22546e8dd5p-78, 2**(56/2**8) + 1259423/2**53
    {0x1.c800000919978p-3, 0x1.2ab8a66dfc783p+0}, // rerr = -0x1.eec5db085e5ap-76, 2**(57/2**8) + 2385502/2**53
    {0x1.d000000cfdaf4p-3, 0x1.2b87fd0efebe8p+0}, // rerr = 0x1.7ee8a312cf4p-79, 2**(58/2**8) + 3405501/2**53
    {0x1.d8000005887fp-3, 0x1.2c57e39801b01p+0}, // rerr = 0x1.4a5833e7f6394p-76, 2**(59/2**8) + 1450492/2**53
    {0x1.e000001fea1ep-3, 0x1.2d285a7180f23p+0}, // rerr = -0x1.9300a8852457ep-76, 2**(60/2**8) + 8366200/2**53
    {0x1.e800000c9e278p-3, 0x1.2df961f78b7a9p+0}, // rerr = -0x1.905e58c363b98p-76, 2**(61/2**8) + 3307678/2**53
    {0x1.f0000001fc51p-3, 0x1.2ecafa94170d1p+0}, // rerr = 0x1.b395bbfe2a218p-77, 2**(62/2**8) + 520516/2**53
    {0x1.f80000019e5acp-3, 0x1.2f9d24ac031acp+0}, // rerr = 0x1.411c65ec1dd4p-76, 2**(63/2**8) + 424299/2**53
    {0x1.000000039d02cp-2, 0x1.306fe0a3da103p+0}, // rerr = -0x1.47ede2f09f9f4p-76, 2**(64/2**8) + 1894422/2**53
    {0x1.040000084e494p-2, 0x1.31432ee0a28cp+0}, // rerr = 0x1.b25242b646b1fp-75, 2**(65/2**8) + 4354634/2**53
    {0x1.0800000bf724p-2, 0x1.32170fc7482c4p+0}, // rerr = 0x1.99080c4f72cap-76, 2**(66/2**8) + 6273312/2**53
    {0x1.0c000002b1b18p-2, 0x1.32eb83bb1dec9p+0}, // rerr = 0x1.0a33e6baad39p-79, 2**(67/2**8) + 1412492/2**53
    {0x1.1000000cd9c0cp-2, 0x1.33c08b28eec07p+0}, // rerr = 0x1.f11773776d14cp-76, 2**(68/2**8) + 6737414/2**53
    {0x1.1400000505e38p-2, 0x1.3496266f4c3c6p+0}, // rerr = 0x1.df3f0186f2892p-76, 2**(69/2**8) + 2633500/2**53
    {0x1.18000000237fp-2, 0x1.356c55f9316e5p+0}, // rerr = 0x1.96f4fba7c756p-76, 2**(70/2**8) + 72696/2**53
    {0x1.1c000006b6204p-2, 0x1.36431a2f51599p+0}, // rerr = -0x1.687783f0dacaap-76, 2**(71/2**8) + 3518722/2**53
    {0x1.200000051ad3p-2, 0x1.371a7374bdcfbp+0}, // rerr = -0x1.ffc122977cc1p-78, 2**(72/2**8) + 2676376/2**53
    {0x1.24000009d994ep-2, 0x1.37f26233fbc7ep+0}, // rerr = 0x1.2395568506adp-76, 2**(73/2**8) + 5164199/2**53
    {0x1.28000002c2c5p-2, 0x1.38cae6d0f32b4p+0}, // rerr = 0x1.8ece6e31b288p-78, 2**(74/2**8) + 1447464/2**53
    {0x1.2c00000c8eb8ap-2, 0x1.39a401b9be8e5p+0}, // rerr = -0x1.363ab7052fad8p-76, 2**(75/2**8) + 6583749/2**53
    {0x1.300000140e2d8p-2, 0x1.3a7db3529ef57p+0}, // rerr = -0x1.52e9005d78ee6p-76, 2**(76/2**8) + 10514796/2**53
    {0x1.34000004ba08ap-2, 0x1.3b57fbffc9197p+0}, // rerr = -0x1.2bb6cd0db1dep-78, 2**(77/2**8) + 2478149/2**53
    {0x1.380000146a8dcp-2, 0x1.3c32dc3599392p+0}, // rerr = 0x1.2e217844246a4p-77, 2**(78/2**8) + 10703982/2**53
    {0x1.3c000003cefdep-2, 0x1.3d0e544faf56dp+0}, // rerr = -0x1.b73e4bae72738p-76, 2**(79/2**8) + 1996783/2**53
    {0x1.40000002a7356p-2, 0x1.3dea64c1b56c2p+0}, // rerr = -0x1.0f0f4e553c1c7p-75, 2**(80/2**8) + 1391019/2**53
    {0x1.440000097819ep-2, 0x1.3ec70df3d02a8p+0}, // rerr = -0x1.644867ff3185cp-77, 2**(81/2**8) + 4964559/2**53
    {0x1.480000054f35p-2, 0x1.3fa4504bee17dp+0}, // rerr = 0x1.d9b58eea5fe42p-76, 2**(82/2**8) + 2783656/2**53
    {0x1.4c0000013328p-2, 0x1.40822c36bca5bp+0}, // rerr = -0x1.83d5673885644p-77, 2**(83/2**8) + 629056/2**53
    {0x1.50000005ea89ap-2, 0x1.4160a220bc5bfp+0}, // rerr = 0x1.645ba5496caap-80, 2**(84/2**8) + 3101773/2**53
    {0x1.5400001a036c2p-2, 0x1.423fb27641088p+0}, // rerr = -0x1.9e52dd9156d24p-76, 2**(85/2**8) + 13638497/2**53
    {0x1.5800000234f8cp-2, 0x1.431f5d95861bdp+0}, // rerr = -0x1.ed2aabd4e05b4p-77, 2**(86/2**8) + 1157062/2**53
    {0x1.5c0000052762cp-2, 0x1.43ffa3f96cf9cp+0}, // rerr = 0x1.a9154e8cf37f8p-78, 2**(87/2**8) + 2702102/2**53
    {0x1.600000003a7aap-2, 0x1.44e08606256fp+0}, // rerr = -0x1.704135d92e7a8p-78, 2**(88/2**8) + 119765/2**53
    {0x1.640000033ef46p-2, 0x1.45c2042b345e2p+0}, // rerr = -0x1.0a4dc0a325af8p-76, 2**(89/2**8) + 1701795/2**53
    {0x1.68000007c88acp-2, 0x1.46a41ed388948p+0}, // rerr = -0x1.918ed4f605b28p-78, 2**(90/2**8) + 4080726/2**53
    {0x1.6c00000b3ba4ap-2, 0x1.4786d66b30ad9p+0}, // rerr = -0x1.3da552f77f8b8p-77, 2**(91/2**8) + 5889317/2**53
    {0x1.7000000e3699ap-2, 0x1.486a2b5f3cad8p+0}, // rerr = -0x1.18fc4f1b34c9cp-77, 2**(92/2**8) + 7451853/2**53
    {0x1.740000076ef96p-2, 0x1.494e1e1ad31cep+0}, // rerr = -0x1.6b53f17e13962p-76, 2**(93/2**8) + 3897291/2**53
    {0x1.78000007f7b2p-2, 0x1.4a32af0f45232p+0}, // rerr = 0x1.bdd5ee20a3eb8p-76, 2**(94/2**8) + 4177296/2**53
    {0x1.7c000002eba2ep-2, 0x1.4b17dea7830c6p+0}, // rerr = 0x1.90ea63d75de3p-79, 2**(95/2**8) + 1531159/2**53
    {0x1.800000036178ep-2, 0x1.4bfdad542520cp+0}, // rerr = 0x1.2ac7034158eep-79, 2**(96/2**8) + 1772487/2**53
    {0x1.840000044522p-2, 0x1.4ce41b8272635p+0}, // rerr = 0x1.2d5278c01febp-76, 2**(97/2**8) + 2238736/2**53
    {0x1.88000004b65dcp-2, 0x1.4dcb29a0ee638p+0}, // rerr = 0x1.933be8241edc8p-76, 2**(98/2**8) + 2470638/2**53
    {0x1.8c0000040b6dap-2, 0x1.4eb2d81e75559p+0}, // rerr = 0x1.e3ce42f270acap-76, 2**(99/2**8) + 2120557/2**53
    {0x1.9000000901b68p-2, 0x1.4f9b276bde95bp+0}, // rerr = -0x1.b6a9bfcbe070cp-76, 2**(100/2**8) + 4722100/2**53
    {0x1.94000005a887ap-2, 0x1.508417f59d142p+0}, // rerr = -0x1.05a86b0c3ce86p-76, 2**(101/2**8) + 2966589/2**53
    {0x1.98000002beea4p-2, 0x1.516daa2d96f0ep+0}, // rerr = -0x1.824dbe0941d9ap-76, 2**(102/2**8) + 1439570/2**53
    {0x1.9c00000b659b6p-2, 0x1.5257de8691237p+0}, // rerr = -0x1.1526fa34170ccp-76, 2**(103/2**8) + 5975259/2**53
    {0x1.a0000001fe31cp-2, 0x1.5342b56a4a222p+0}, // rerr = -0x1.b9a12074e76b4p-76, 2**(104/2**8) + 1044878/2**53
    {0x1.a400000079cacp-2, 0x1.542e2f4f86ddfp+0}, // rerr = -0x1.b2d11bbfb09p-80, 2**(105/2**8) + 249430/2**53
    {0x1.a800000347522p-2, 0x1.551a4ca69aecp+0}, // rerr = 0x1.7b15ecce99eb6p-76, 2**(106/2**8) + 1718929/2**53
    {0x1.ac0000057f2eap-2, 0x1.56070ddfd6d73p+0}, // rerr = -0x1.080fb2eba1e3p-75, 2**(107/2**8) + 2881909/2**53
    {0x1.b00000082fdaep-2, 0x1.56f4736d39096p+0}, // rerr = 0x1.89b0ba59efb86p-76, 2**(108/2**8) + 4292311/2**53
    {0x1.b4000006e9be4p-2, 0x1.57e27dbfc8412p+0}, // rerr = -0x1.5d1a770e068dp-76, 2**(109/2**8) + 3624434/2**53
    {0x1.b80000059f30cp-2, 0x1.58d12d4acc6abp+0}, // rerr = -0x1.a57054486751p-79, 2**(110/2**8) + 2947462/2**53
    {0x1.bc000006196bep-2, 0x1.59c082815dec2p+0}, // rerr = 0x1.3f4a466bd80ccp-76, 2**(111/2**8) + 3197791/2**53
    {0x1.c0000000bbacap-2, 0x1.5ab07dd4b14d7p+0}, // rerr = -0x1.2f9aad7fc6f7cp-76, 2**(112/2**8) + 384357/2**53
    {0x1.c4000004077c6p-2, 0x1.5ba11fbb7a587p+0}, // rerr = -0x1.a640c2a4ea848p-76, 2**(113/2**8) + 2112483/2**53
    {0x1.c8000002f06c2p-2, 0x1.5c9268a645f3fp+0}, // rerr = 0x1.0d3a841a0800ap-76, 2**(114/2**8) + 1540961/2**53
    {0x1.cc00000cac3c2p-2, 0x1.5d84590c9845bp+0}, // rerr = -0x1.4077cd0cae724p-77, 2**(115/2**8) + 6644193/2**53
    {0x1.d000000631f8cp-2, 0x1.5e76f15c4a52p+0}, // rerr = 0x1.a600b8636a5bcp-77, 2**(116/2**8) + 3248070/2**53
    {0x1.d400000c5f88ep-2, 0x1.5f6a3210c02fdp+0}, // rerr = 0x1.73fb23d3ddf38p-77, 2**(117/2**8) + 6487111/2**53
    {0x1.d800000648fe2p-2, 0x1.605e1b98ed86bp+0}, // rerr = 0x1.f2029d885f0a4p-77, 2**(118/2**8) + 3295217/2**53
    {0x1.dc00000480196p-2, 0x1.6152ae6df2f9fp+0}, // rerr = -0x1.030ba459c3d88p-77, 2**(119/2**8) + 2359499/2**53
    {0x1.e0000013fb67cp-2, 0x1.6247eb0870165p+0}, // rerr = -0x1.640a0710ce668p-77, 2**(120/2**8) + 10476350/2**53
    {0x1.e4000001864acp-2, 0x1.633dd1d1f079bp+0}, // rerr = 0x1.95681a5b33bb4p-77, 2**(121/2**8) + 799318/2**53
    {0x1.e8000001fd876p-2, 0x1.6434634d470cfp+0}, // rerr = 0x1.4256471d94056p-76, 2**(122/2**8) + 1043515/2**53
    {0x1.ec000001eb9e2p-2, 0x1.652b9fec3fd71p+0}, // rerr = -0x1.e4a4a7761ebc8p-76, 2**(123/2**8) + 1006833/2**53
    {0x1.f0000005a7522p-2, 0x1.66238826b1001p+0}, // rerr = -0x1.2e8ee2c22b778p-78, 2**(124/2**8) + 2964113/2**53
    {0x1.f4000007ccecep-2, 0x1.671c1c7268aap+0}, // rerr = -0x1.41afb2ed9f76ep-76, 2**(125/2**8) + 4089703/2**53
    {0x1.f8000004d45fep-2, 0x1.68155d45f7f22p+0}, // rerr = -0x1.cbe1403b7a3bep-76, 2**(126/2**8) + 2532095/2**53
    {0x1.fc00000d00828p-2, 0x1.690f4b1d16d2p+0}, // rerr = 0x1.18520f7489d98p-77, 2**(127/2**8) + 6816788/2**53
    {0x1.000000006d6f2p-1, 0x1.6a09e668295fdp+0}, // rerr = -0x1.612e072fd04dep-76, 2**(128/2**8) + 448242/2**53
    {0x1.020000006f2eep-1, 0x1.6b052fa788183p+0}, // rerr = 0x1.d4ffee14f461p-76, 2**(129/2**8) + 455406/2**53
    {0x1.0400000205a67p-1, 0x1.6c012751bcc3cp+0}, // rerr = 0x1.ce1092eed39bp-79, 2**(130/2**8) + 2120295/2**53
    {0x1.06000000bb46ap-1, 0x1.6cfdcddda3ee1p+0}, // rerr = -0x1.332188aeeaeeap-76, 2**(131/2**8) + 767082/2**53
    {0x1.08000006234b3p-1, 0x1.6dfb23c95c28dp+0}, // rerr = -0x1.09996143c9e6p-77, 2**(132/2**8) + 6436019/2**53
    {0x1.0a000002360edp-1, 0x1.6ef92986ace76p+0}, // rerr = -0x1.e6d8c20280c84p-76, 2**(133/2**8) + 2318573/2**53
    {0x1.0c00000224115p-1, 0x1.6ff7df962a4e4p+0}, // rerr = 0x1.5fb5d4ac30c14p-76, 2**(134/2**8) + 2244885/2**53
    {0x1.0e0000007f94fp-1, 0x1.70f7466f82a2dp+0}, // rerr = -0x1.0a3116230c27cp-76, 2**(135/2**8) + 522575/2**53
    {0x1.100000056865ep-1, 0x1.71f75e917b5b8p+0}, // rerr = -0x1.8a254fba747ccp-77, 2**(136/2**8) + 5670494/2**53
    {0x1.12000003209b2p-1, 0x1.72f828703f1d1p+0}, // rerr = 0x1.61bbc2d9a610ep-76, 2**(137/2**8) + 3279282/2**53
    {0x1.1400000084352p-1, 0x1.73f9a48a9aabp+0}, // rerr = 0x1.5041c822ef9c4p-77, 2**(138/2**8) + 541522/2**53
    {0x1.16000003ce3c2p-1, 0x1.74fbd35f68af9p+0}, // rerr = 0x1.552f7c9b745a4p-76, 2**(139/2**8) + 3990466/2**53
    {0x1.18000005a047fp-1, 0x1.75feb566ffb92p+0}, // rerr = -0x1.8a420f2e709cap-76, 2**(140/2**8) + 5899391/2**53
    {0x1.1a000003a11e5p-1, 0x1.77024b1c8e947p+0}, // rerr = -0x1.c3c3879c1d3eep-76, 2**(141/2**8) + 3805669/2**53
    {0x1.1c0000087d61bp-1, 0x1.7806950238385p+0}, // rerr = 0x1.6f0c2a0ed22fcp-76, 2**(142/2**8) + 8902171/2**53
    {0x1.1e00000132e4ap-1, 0x1.790b938b5e765p+0}, // rerr = 0x1.94455bedaa408p-77, 2**(143/2**8) + 1257034/2**53
    {0x1.20000002ed0b2p-1, 0x1.7a1147402f7a4p+0}, // rerr = 0x1.64c9057f85b9p-78, 2**(144/2**8) + 3068082/2**53
    {0x1.220000021e1cap-1, 0x1.7b17b09883363p+0}, // rerr = 0x1.902e87a0586dcp-76, 2**(145/2**8) + 2220490/2**53
    {0x1.240000041fbb2p-1, 0x1.7c1ed0152b5cdp+0}, // rerr = 0x1.60b19c1c5df26p-76, 2**(146/2**8) + 4324274/2**53
    {0x1.2600000191ef4p-1, 0x1.7d26a630c7d55p+0}, // rerr = -0x1.a6af9f8eb0dfcp-77, 2**(147/2**8) + 1646324/2**53
    {0x1.2800000294a37p-1, 0x1.7e2f336e4ab7p+0}, // rerr = 0x1.6bf358629ap-81, 2**(148/2**8) + 2705975/2**53
    {0x1.2a0000002d5e9p-1, 0x1.7f38784933d2cp+0}, // rerr = -0x1.71ab65610adap-76, 2**(149/2**8) + 185833/2**53
    {0x1.2c000000368bfp-1, 0x1.80427543fe015p+0}, // rerr = 0x1.b89d3c468d384p-77, 2**(150/2**8) + 223423/2**53
    {0x1.2e00000e5d239p-1, 0x1.814d2ae48e817p+0}, // rerr = 0x1.c211b2451b2e8p-76, 2**(151/2**8) + 15061561/2**53
    {0x1.30000000aa7bep-1, 0x1.82589995260c8p+0}, // rerr = 0x1.46e1ddacaa168p-78, 2**(152/2**8) + 698302/2**53
    {0x1.32000000c6923p-1, 0x1.8364c1ebfc43bp+0}, // rerr = -0x1.dd723e087c47ep-76, 2**(153/2**8) + 813347/2**53
    {0x1.34000007a46eep-1, 0x1.8471a46641527p+0}, // rerr = -0x1.e7a3b0892d30cp-76, 2**(154/2**8) + 8013550/2**53
    {0x1.360000000875ap-1, 0x1.857f4179fa28p+0}, // rerr = 0x1.162f06718426ap-76, 2**(155/2**8) + 34650/2**53
    {0x1.38000005c1f5bp-1, 0x1.868d99b754833p+0}, // rerr = -0x1.9472e4d5ec4b2p-76, 2**(156/2**8) + 6037339/2**53
    {0x1.3a000002822d9p-1, 0x1.879cad946eb95p+0}, // rerr = -0x1.587f77246a9ep-76, 2**(157/2**8) + 2630361/2**53
    {0x1.3c0000054b58fp-1, 0x1.88ac7d9b76eb5p+0}, // rerr = 0x1.65b2a7fa143d6p-76, 2**(158/2**8) + 5551503/2**53
    {0x1.3e000001d6803p-1, 0x1.89bd0a48804d3p+0}, // rerr = 0x1.0b44d93e63a18p-77, 2**(159/2**8) + 1927171/2**53
    {0x1.400000046b3ep-1, 0x1.8ace542506b0dp+0}, // rerr = -0x1.dbf51052d6878p-76, 2**(160/2**8) + 4633568/2**53
    {0x1.420000022acb8p-1, 0x1.8be05bae8acd9p+0}, // rerr = 0x1.83c795c92b8ep-77, 2**(161/2**8) + 2272440/2**53
    {0x1.4400000110a71p-1, 0x1.8cf3216be6ce3p+0}, // rerr = -0x1.2b2e2db7629e8p-76, 2**(162/2**8) + 1116785/2**53
    {0x1.460000008527ep-1, 0x1.8e06a5e0ce2dcp+0}, // rerr = -0x1.dc847b4af427p-78, 2**(163/2**8) + 545406/2**53
    {0x1.4800000c48632p-1, 0x1.8f1ae997fa64dp+0}, // rerr = -0x1.8f5a9af024aep-79, 2**(164/2**8) + 12879410/2**53
    {0x1.4a0000019c4d6p-1, 0x1.902fed036228ap+0}, // rerr = 0x1.07441d8df5368p-77, 2**(165/2**8) + 1688790/2**53
    {0x1.4c0000090e1a2p-1, 0x1.9145b0be0b47ap+0}, // rerr = 0x1.c74c25a2410d8p-76, 2**(166/2**8) + 9494946/2**53
    {0x1.4e00000749b6dp-1, 0x1.925c353e9b472p+0}, // rerr = -0x1.4d277fe326c7p-77, 2**(167/2**8) + 7641965/2**53
    {0x1.500000009941fp-1, 0x1.93737b0d3013ap+0}, // rerr = -0x1.7fa155a5bb44cp-76, 2**(168/2**8) + 627743/2**53
    {0x1.52000000fd26bp-1, 0x1.948b82b684334p+0}, // rerr = 0x1.1d2ae492ec038p-77, 2**(169/2**8) + 1036907/2**53
    {0x1.54000002865aap-1, 0x1.95a44cbde8147p+0}, // rerr = 0x1.bb8400b3f7d3ep-76, 2**(170/2**8) + 2647466/2**53
    {0x1.560000023c506p-1, 0x1.96bdd9a8a22ffp+0}, // rerr = 0x1.b80f9430795p-81, 2**(171/2**8) + 2344198/2**53
    {0x1.58000000868bdp-1, 0x1.97d829fe2f2edp+0}, // rerr = -0x1.8bcc83a1676b6p-76, 2**(172/2**8) + 551101/2**53
    {0x1.5a000001cce14p-1, 0x1.98f33e48a1534p+0}, // rerr = 0x1.696b17d47cfap-78, 2**(173/2**8) + 1887764/2**53
    {0x1.5c00000284415p-1, 0x1.9a0f170e06225p+0}, // rerr = 0x1.daca0d829af5cp-76, 2**(174/2**8) + 2638869/2**53
    {0x1.5e000000d6ebfp-1, 0x1.9b2bb4d5b7835p+0}, // rerr = -0x1.d7a8884fb0eacp-77, 2**(175/2**8) + 880319/2**53
    {0x1.60000000e65c2p-1, 0x1.9c49182abf9c8p+0}, // rerr = 0x1.bc13cdadcbd78p-77, 2**(176/2**8) + 943554/2**53
    {0x1.620000008c1d6p-1, 0x1.9d67419509f83p+0}, // rerr = -0x1.df8118650d772p-76, 2**(177/2**8) + 573910/2**53
    {0x1.640000015c9dep-1, 0x1.9e86319ef5d59p+0}, // rerr = 0x1.e15ac2ea849p-78, 2**(178/2**8) + 1427934/2**53
    {0x1.6600000414b42p-1, 0x1.9fa5e8d2cb063p+0}, // rerr = -0x1.33a879cdaa2ap-78, 2**(179/2**8) + 4279106/2**53
    {0x1.68000001214ccp-1, 0x1.a0c667b68191bp+0}, // rerr = 0x1.ff8266b943e58p-78, 2**(180/2**8) + 1184972/2**53
    {0x1.6a000001843bcp-1, 0x1.a1e7aed9c7317p+0}, // rerr = -0x1.96b9f4f017b2p-76, 2**(181/2**8) + 1590204/2**53
    {0x1.6c000000758a2p-1, 0x1.a309bec4e5813p+0}, // rerr = -0x1.6c13008ffda84p-77, 2**(182/2**8) + 481442/2**53
    {0x1.6e00000477098p-1, 0x1.a42c9806eaep+0}, // rerr = -0x1.3fc8ad68e4f24p-76, 2**(183/2**8) + 4681880/2**53
    {0x1.700000019cc89p-1, 0x1.a5503b24cdc6dp+0}, // rerr = 0x1.8259fddf3b62p-76, 2**(184/2**8) + 1690761/2**53
    {0x1.7200000062f88p-1, 0x1.a674a8af7e9fap+0}, // rerr = 0x1.d878513c97132p-76, 2**(185/2**8) + 405384/2**53
    {0x1.740000011ec75p-1, 0x1.a799e133afab3p+0}, // rerr = 0x1.ea11daeea77a8p-78, 2**(186/2**8) + 1174645/2**53
    {0x1.76000002de3b8p-1, 0x1.a8bfe53db919bp+0}, // rerr = 0x1.e2989a88cdbdep-76, 2**(187/2**8) + 3007416/2**53
    {0x1.7800000249e28p-1, 0x1.a9e6b558f1ac2p+0}, // rerr = 0x1.980ac6341caap-77, 2**(188/2**8) + 2399784/2**53
    {0x1.7a000000c9999p-1, 0x1.ab0e5213cb79bp+0}, // rerr = 0x1.e0e67808108p-81, 2**(189/2**8) + 825753/2**53
    {0x1.7c000000f0acfp-1, 0x1.ac36bbfdcabdbp+0}, // rerr = -0x1.cf047b2d1b6c6p-76, 2**(190/2**8) + 985807/2**53
    {0x1.7e000003b665fp-1, 0x1.ad5ff3a5eaecp+0}, // rerr = -0x1.8498bb3ac2c6ep-76, 2**(191/2**8) + 3892831/2**53
    {0x1.800000015becfp-1, 0x1.ae89f9967806p+0}, // rerr = -0x1.5f6531c4d4968p-76, 2**(192/2**8) + 1425103/2**53
    {0x1.82000001bc2bp-1, 0x1.afb4ce6332c77p+0}, // rerr = 0x1.67d89569ee91p-77, 2**(193/2**8) + 1819312/2**53
    {0x1.8400000b96bedp-1, 0x1.b0e0729fa6005p+0}, // rerr = 0x1.65cb85df845cp-76, 2**(194/2**8) + 12151789/2**53
    {0x1.86000005d181ap-1, 0x1.b20ce6cd13d83p+0}, // rerr = -0x1.54efbec6d8d28p-76, 2**(195/2**8) + 6101018/2**53
    {0x1.880000017a522p-1, 0x1.b33a2b85d048fp+0}, // rerr = -0x1.1d955e2b98608p-76, 2**(196/2**8) + 1549602/2**53
    {0x1.8a00000dfe0bcp-1, 0x1.b4684163b8e99p+0}, // rerr = -0x1.500e9cb5b8e48p-78, 2**(197/2**8) + 14672060/2**53
    {0x1.8c000003afe5bp-1, 0x1.b59728e084c08p+0}, // rerr = 0x1.18bb874b2acc2p-76, 2**(198/2**8) + 3866203/2**53
    {0x1.8e00000069dadp-1, 0x1.b6c6e29f5b33dp+0}, // rerr = -0x1.fcf236a3f0d78p-76, 2**(199/2**8) + 433581/2**53
    {0x1.90000000a0b5ep-1, 0x1.b7f76f30159dbp+0}, // rerr = -0x1.ebc6e25ae6ebcp-76, 2**(200/2**8) + 658270/2**53
    {0x1.92000008ff77dp-1, 0x1.b928cf27d4592p+0}, // rerr = -0x1.33ef3048c662p-76, 2**(201/2**8) + 9435005/2**53
    {0x1.9400000829798p-1, 0x1.ba5b030ef3b35p+0}, // rerr = -0x1.f549986b92d38p-76, 2**(202/2**8) + 8558488/2**53
    {0x1.96000005646a8p-1, 0x1.bb8e0b7ce3dd9p+0}, // rerr = 0x1.7aa61ead88454p-76, 2**(203/2**8) + 5654184/2**53
    {0x1.98000002f2f09p-1, 0x1.bcc1e90682ac7p+0}, // rerr = -0x1.9b148c173ef26p-76, 2**(204/2**8) + 3092233/2**53
    {0x1.9a00000bdd595p-1, 0x1.bdf69c4663ea6p+0}, // rerr = 0x1.57358fd52d874p-77, 2**(205/2**8) + 12440981/2**53
    {0x1.9c000000373fep-1, 0x1.bf2c25bd9353p+0}, // rerr = -0x1.69beada96139p-79, 2**(206/2**8) + 226302/2**53
    {0x1.9e000001d6e5ep-1, 0x1.c0628615390c9p+0}, // rerr = 0x1.03a4772b8d6a8p-78, 2**(207/2**8) + 1928798/2**53
    {0x1.a00000035f465p-1, 0x1.c199bdda629cfp+0}, // rerr = 0x1.97091bedb437cp-76, 2**(208/2**8) + 3535973/2**53
    {0x1.a2000006d882p-1, 0x1.c2d1cda3d3ea5p+0}, // rerr = 0x1.ecb1b5783b808p-77, 2**(209/2**8) + 7178272/2**53
    {0x1.a4000003c5ae4p-1, 0x1.c40ab6024c00cp+0}, // rerr = -0x1.6766bf3cfdda4p-77, 2**(210/2**8) + 3955428/2**53
    {0x1.a6000002476bbp-1, 0x1.c544779115b4p+0}, // rerr = -0x1.2123916fa81b2p-76, 2**(211/2**8) + 2389691/2**53
    {0x1.a80000067077ep-1, 0x1.c67f12e973619p+0}, // rerr = -0x1.ae847b118c45ep-76, 2**(212/2**8) + 6752126/2**53
    {0x1.aa00000b8ac35p-1, 0x1.c7ba889fab90dp+0}, // rerr = -0x1.15b171c7205cp-77, 2**(213/2**8) + 12102709/2**53
    {0x1.ac00000079d36p-1, 0x1.c8f6d940b9d91p+0}, // rerr = 0x1.630468b4c39e2p-76, 2**(214/2**8) + 498998/2**53
    {0x1.ae00000244398p-1, 0x1.ca340576843ap+0}, // rerr = -0x1.01de9fc4174fp-76, 2**(215/2**8) + 2376600/2**53
    {0x1.b0000006c9425p-1, 0x1.cb720dd331994p+0}, // rerr = -0x1.d15bb756d5a1ap-76, 2**(216/2**8) + 7115813/2**53
    {0x1.b20000040a06bp-1, 0x1.ccb0f2e9564f7p+0}, // rerr = -0x1.098ee7c4f236p-76, 2**(217/2**8) + 4235371/2**53
    {0x1.b4000001b8c3dp-1, 0x1.cdf0b556efe47p+0}, // rerr = 0x1.ece880a75ef6p-79, 2**(218/2**8) + 1805373/2**53
    {0x1.b600000473d9bp-1, 0x1.cf3155b8857bdp+0}, // rerr = -0x1.9573ac0495accp-77, 2**(219/2**8) + 4668827/2**53
    {0x1.b800000218d64p-1, 0x1.d072d4a1ca24p+0}, // rerr = -0x1.1cfe9f616a16ap-76, 2**(220/2**8) + 2198884/2**53
    {0x1.ba00000319e46p-1, 0x1.d1b532b2811e5p+0}, // rerr = -0x1.63d611f50796p-78, 2**(221/2**8) + 3251782/2**53
    {0x1.bc00000563c24p-1, 0x1.d2f8708440e2cp+0}, // rerr = -0x1.e57164290f518p-76, 2**(222/2**8) + 5651492/2**53
    {0x1.be0000033cec4p-1, 0x1.d43c8eaeb791bp+0}, // rerr = -0x1.f8be852f0ecc4p-77, 2**(223/2**8) + 3395268/2**53
    {0x1.c00000092181ap-1, 0x1.d5818dd5880bcp+0}, // rerr = 0x1.319c562533444p-77, 2**(224/2**8) + 9574426/2**53
    {0x1.c2000000b2765p-1, 0x1.d6c76e86a02bp+0}, // rerr = 0x1.85b3a89263c14p-76, 2**(225/2**8) + 730981/2**53
    {0x1.c40000002af22p-1, 0x1.d80e316cb3ab8p+0}, // rerr = 0x1.0bb88e6c1c144p-77, 2**(226/2**8) + 175906/2**53
    {0x1.c600000cb4a9ap-1, 0x1.d955d7281a581p+0}, // rerr = -0x1.26ac3b93430afp-75, 2**(227/2**8) + 13322906/2**53
    {0x1.c8000001b543fp-1, 0x1.da9e603ecc1e4p+0}, // rerr = 0x1.15b9e96c22aep-77, 2**(228/2**8) + 1791039/2**53
    {0x1.ca000004a9829p-1, 0x1.dbe7cd66a9266p+0}, // rerr = 0x1.4aad5365d4bfap-76, 2**(229/2**8) + 4888617/2**53
    {0x1.cc00000551605p-1, 0x1.dd321f338ac32p+0}, // rerr = 0x1.ab2393040a7cap-76, 2**(230/2**8) + 5576197/2**53
    {0x1.ce000003a354ap-1, 0x1.de7d56441bb1cp+0}, // rerr = -0x1.79e6ee7922864p-77, 2**(231/2**8) + 3814730/2**53
    {0x1.d0000000b27afp-1, 0x1.dfc973382da3ep+0}, // rerr = -0x1.74a8fa8b0d63cp-77, 2**(232/2**8) + 731055/2**53
    {0x1.d200000202f1bp-1, 0x1.e11676b2e7334p+0}, // rerr = 0x1.6613a0d76cdd8p-76, 2**(233/2**8) + 2109211/2**53
    {0x1.d40000050a8e2p-1, 0x1.e2646152a4e33p+0}, // rerr = -0x1.9ee8f0b8050d8p-76, 2**(234/2**8) + 5286114/2**53
    {0x1.d6000003d0c08p-1, 0x1.e3b333b3ee7d8p+0}, // rerr = 0x1.ca018c9c92838p-76, 2**(235/2**8) + 4000776/2**53
    {0x1.d8000000c7cebp-1, 0x1.e502ee7937317p+0}, // rerr = -0x1.f94b3c342a728p-78, 2**(236/2**8) + 818411/2**53
    {0x1.da0000060dd41p-1, 0x1.e653924a733bbp+0}, // rerr = -0x1.296907c87557cp-77, 2**(237/2**8) + 6348097/2**53
    {0x1.dc00000504b69p-1, 0x1.e7a51fbfc4ebp+0}, // rerr = 0x1.5591c4548c4cp-77, 2**(238/2**8) + 5262185/2**53
    {0x1.de0000018f6ccp-1, 0x1.e8f7977de3dbcp+0}, // rerr = 0x1.a0a35302713ccp-76, 2**(239/2**8) + 1636044/2**53
    {0x1.e0000003582ap-1, 0x1.ea4afa2c81573p+0}, // rerr = -0x1.27e1391d9ceep-77, 2**(240/2**8) + 3506848/2**53
    {0x1.e2000008640cdp-1, 0x1.eb9f486d624ebp+0}, // rerr = 0x1.2528e74e6725p-77, 2**(241/2**8) + 8798413/2**53
    {0x1.e400000ef29b3p-1, 0x1.ecf482e2e03c7p+0}, // rerr = 0x1.0abe05c0c1538p-75, 2**(242/2**8) + 15673779/2**53
    {0x1.e600000a86731p-1, 0x1.ee4aaa28935efp+0}, // rerr = 0x1.0ca2cf2357d2p-79, 2**(243/2**8) + 11036465/2**53
    {0x1.e8000001232a3p-1, 0x1.efa1bee6d900bp+0}, // rerr = 0x1.a57825775f29p-77, 2**(244/2**8) + 1192611/2**53
    {0x1.ea000001d8024p-1, 0x1.f0f9c1cca1a4cp+0}, // rerr = -0x1.39af31e7fa1p-78, 2**(245/2**8) + 1933348/2**53
    {0x1.ec00000144453p-1, 0x1.f252b377966ccp+0}, // rerr = 0x1.5624dbae6e198p-78, 2**(246/2**8) + 1328211/2**53
    {0x1.ee0000077b4a6p-1, 0x1.f3ac9492e6c58p+0}, // rerr = -0x1.1348d0c7d7718p-77, 2**(247/2**8) + 7845030/2**53
    {0x1.f0000002820d1p-1, 0x1.f50765b897d3fp+0}, // rerr = 0x1.80c50ae84ff8p-81, 2**(248/2**8) + 2629841/2**53
    {0x1.f20000040e7ffp-1, 0x1.f663279b46a11p+0}, // rerr = -0x1.8dad50d78db9p-79, 2**(249/2**8) + 4253695/2**53
    {0x1.f4000000101a1p-1, 0x1.f7bfdad9d6dc6p+0}, // rerr = 0x1.ee11d24059678p-78, 2**(250/2**8) + 65953/2**53
    {0x1.f60000056fb82p-1, 0x1.f91d8025fb7a6p+0}, // rerr = -0x1.8957a80f6faep-79, 2**(251/2**8) + 5700482/2**53
    {0x1.f800000132d42p-1, 0x1.fa7c181abb707p+0}, // rerr = -0x1.09be52642a214p-75, 2**(252/2**8) + 1256770/2**53
    {0x1.fa000008dcd22p-1, 0x1.fbdba36f4538cp+0}, // rerr = -0x1.0db4b6b63134ap-76, 2**(253/2**8) + 9293090/2**53
    {0x1.fc000000d9586p-1, 0x1.fd3c22b98cf5cp+0}, // rerr = 0x1.f57d4da4c3dc8p-76, 2**(254/2**8) + 890246/2**53
    {0x1.fe000001c6485p-1, 0x1.fe9d96b3dc461p+0}, // rerr = -0x1.7531858abd466p-76, 2**(255/2**8) + 1860741/2**53
    {0x1p+0, 0x1p+1}, // rerr = 0x0p+0, 2**(256/2**8) + 0/2**53
};
                //Worst case: 0x1.b25242b646b1fp-75 from 4354634 (0x1.040000084e494p-2) with r=16777216

/* We design a minimax poly for
      2^x-1 ÷ x
Approximating g(x) = (2^x-1)/x over [0,2^-7]:
   p(x) = 
       .693147180559945318193472330348557 +
       ( .240226506959044553084155309067230 +
         ( 0.555041087223186432940320239932465e-1 +
           ( 0.961810850574698526660046525532774e-2 +
             0.133636821875765095445302638781823e-2 * x
                   ) * x
                 ) * x
               ) * x

for the interval [2^-53,2^-7] with an error of 0.8776240208898384e-17 which is better than 2^-56 = 1.877e-17.  how do we get 2^-56?  it is the effect of the interval increase on the prescribed error of 2^-63.
We then check that it is ok for [0,2^-53]. 

You can go to -2^-16 and still maintain the error.
The minimax however is very nice from [-2^-16,2^-7].
*/

static const double Exp2Poly2m7[5] = {
        0.00133636821875765095445302638781823,
        0.00961810850574698526660046525532774,
        0.0555041087223186432940320239932465,
        0.240226506959044553084155309067230,
        0.693147180559945318193472330348557,
};

static const double Ln2 =     0x1.62E42FEFA39EFp-1;   // log(2) = 0x1.62E42FEFA39EF...35793C7673007Ep-1
//static const double Ln2tail = 0x0.35793C7673007Ep-53; // log(2) = 0x1.62E42FEFA39EF...35793C7673007Ep-1
static const double one = 1.0;

#define N1       8
#define TWO_N1   0x1.0p8 // 2**N1


//static const xUInt64 pow_specialop_boundary = {0x7fefffffffffffffULL, 0};
static const xUInt64 mask_of_ones = {0xffffffffffffffffULL, 0};
static const xDouble double_exp_lsb =   (const xDouble)(const xUInt64){0x0010000000000000ULL, 0};
static const xDouble double_exp_mask =  (const xDouble)(const xUInt64){0x7ff0000000000000ULL, 0};
static const xDouble double_mant_mask = (const xDouble)(const xUInt64){0x000fffffffffffffULL, 0};
static const xDouble frexp_mant_mask =  (const xDouble)(const xUInt64){0x800fffffffffffffULL, 0};
static const xDouble frexp_half_mask =  (const xDouble)(const xUInt64){0x0008000000000000ULL, 0};
static const xDouble xMZEROd = {-0.0, -0.0};

//Infs, zeros and NaNs -- not supported. you get what you get.
//Assumes x>0.
//For normals and denorms this returns frexp(x) in [0.75,1.5)
//And the coresponding exponent. 
static inline double frexp_near1( double absx, int *exp ) ALWAYS_INLINE;
static inline double frexp_near1( double absx, int *exp )
#if AVOID_64_BIT_INTS
{
        const xDouble vx = DOUBLE_2_XDOUBLE(absx);
        static const double smallestNormal = 0x1.0p-1022;
        const xDouble xOne = _mm_load_sd( &one );

        xDouble exponent = _mm_and_pd(vx,double_exp_mask);
        xDouble mantissa = _mm_and_pd(vx,frexp_mant_mask);
        const xDouble isDenormal = _mm_cmplt_sdm( vx, &smallestNormal );
        const int isdenorm = _mm_cvtsi128_si32(  (xSInt64) isDenormal );

        *exp = -1023; //pre-remove the bias
        if( EXPECT_FALSE( isdenorm ) ) //if denormal or zero
        {
                //denormal or zero -- this gives the wrong result for 0
                // or in bias to the new exponent for the mantissa
                mantissa =  _mm_or_pd(mantissa, xOne);
//                const xDouble v = _mm_and_pd(mantissa, double_exp_mask);
                const xDouble u = mantissa - xOne;
                
                exponent = _mm_and_pd(u, double_exp_mask);
                mantissa = _mm_and_pd(u, frexp_mant_mask);
                
                *exp += -1022;
        }

        // or in -1 + bias to the new exponent for the mantissa
        const xDouble upperhalf = _mm_and_pd(mantissa, frexp_half_mask);
        const xUInt64 nudge = _mm_slli_epi64((xUInt64)upperhalf, 1);
        mantissa = _mm_xor_pd(_mm_or_pd(mantissa, xOne), (xDouble)nudge); // Divide by two if significand >= 3/2 (0x3ff... -> 0x3fe...)
        const int true_exp = _mm_cvtsi128_si32( _mm_srli_epi64(nudge+(xUInt64)exponent,52));
        *exp += (int) true_exp; //right shift exponent and remove the bias, and store

        return XDOUBLE_2_DOUBLE(mantissa);
}
#else
{
        union{ double d; uint64_t u; } u = { absx };

        uint64_t        exponent = u.u & 0x7ff0000000000000ULL;
        uint64_t        mantissa = u.u & 0x800fffffffffffffULL;
        *exp = -1023; //pre-remove the bias
        if( __builtin_expect( (int64_t) exponent == 0x0000000000000000LL, 0 ) ) //if denormal, NaN or Inf
        {
                //denormal or zero -- this gives the wrong result for 0
                // or in bias to the new exponent for the mantissa
                mantissa |= 0x3ff0000000000000ULL;

                //TODO: don't need v since we aren't dealing with NaN/Inf
//                union{  uint64_t u; double d; } v = { mantissa & 0xfff0000000000000ULL };
                u.u = mantissa;
//                u.d = u.d - v.d;
                u.d = u.d - one;

                exponent = u.u & 0x7ff0000000000000ULL;
                mantissa = u.u & 0x800fffffffffffffULL;
                
                *exp += -1022;
        }

        // or in -1 + bias to the new exponent for the mantissa
        uint64_t        upperhalf = u.u & 0x0008000000000000ULL;
        mantissa = (mantissa | 0x3ff0000000000000ULL) ^ (upperhalf << 1); // Divide by two if significand >= 3/2
        *exp += (int) ( exponent >> 52 ) + (upperhalf != 0ULL); //right shift exponent and remove the bias, and store
        u.u = mantissa;

//    const double f = (fp1 > 1.5) ? (0.5 * fp1 - 1.0) : (fp1 - 1.0);
//    n += (f < 0) ? 1 : 0;
        *exp = (int)exponent;
        return u.d;
}
#endif


static inline double twoton(int n) ALWAYS_INLINE;
static inline double twoton(int n)
#if AVOID_64_BIT_INTS
{
        return XDOUBLE_2_DOUBLE(twoToTheM(n));
}
#else
{
        union{ double d; uint64_t u; } ux;
        ux.u = (uint64_t)(0x3ff + n) << 52;
        return ux.d;
}
#endif

static const xUInt64 ROUND26 = {0x0000000004000000ULL, 0};
static const xUInt64 ROUND26_MASK= {0xfffffffff8000000ULL, 0};

static inline double round26nearest(double x) ALWAYS_INLINE;
static inline double round26nearest(double x)
#if AVOID_64_BIT_INTS
{
        const xDouble vx = DOUBLE_2_XDOUBLE(x);
        const xDouble vs = _mm_and_pd((xDouble)_mm_add_epi64((xUInt64)vx,ROUND26),(xDouble)ROUND26_MASK) ;
        return XDOUBLE_2_DOUBLE(vs); 
}
#else
{
        union{ double d; uint64_t u; } ux;
        ux.d = x;
        ux.u = (ux.u + 0x0000000004000000ULL) & 0xfffffffff8000000ULL;
        return ux.d; 
}
#endif

// TODO use minimax poly for the smaller range we are actually using. 
static const double LogTaylor[]=
{
        0x0.24628E2A4CB513Ep0, /* ~1/7 */
        -0x0.2AAAA7C79E594CFp0, /* ~1/6 */
        0x0.333333441E488E8p0, /* ~1/5 */
        -0x0.400000000286788p0, /* ~1/4 */
        0x0.555555555553FDFp0, /* ~1/3 */
        -0x0.7FFFFFFFFFFFFFFp0, /* ~1/2 */
};

static const xDouble small = {0x1p-1020, 0.};
static const xDouble big = {0x1p+1020, 0.};

double pow(double x, double y) {
    //Handle special input conditions.
    //Either return early or set yisint and yisodd with finite non-zero non-one x and y. 
    int yisint = 0;
    int yisodd = 0;
#if AVOID_64_BIT_INTS
    {
        if( x == one || y == one)
                return x;

        const xDouble vx = DOUBLE_2_XDOUBLE(x);
        const xDouble vy = DOUBLE_2_XDOUBLE(y);
        const xDouble xOne = _mm_load_sd( &one );
        //Move the arguments to the integer registers for bitwise inspection
        xDouble absux = _mm_andnot_pd(xMZEROd, vx);
        xDouble absuy = _mm_andnot_pd(xMZEROd, vy);
        uint32_t absuyhi = _mm_cvtsi128_si32((xUInt32)_mm_srli_epi64((xUInt64)absuy,32));
        uint32_t absuxhi = _mm_cvtsi128_si32((xUInt32)_mm_srli_epi64((xUInt64)absux,32));

        //figure out if y is an odd integer
        //Find out if y is an integer or not without raising inexact
        //Fails for Inf/NaN. We don't care about that here.
        if (EXPECT_FALSE(absuyhi >= 0x43400000U)) { // |y| >= 0x1p53 implies y is an even int
            yisint = 1;
#if DEBUG
            printf("Guaranteed int: %d (%x >= %x), odd: %d\n", yisint, absuyhi, 0x43400000U, yisodd);
#endif
        } else if (EXPECT_TRUE(absuyhi < 0x40000000U)) { // |y| < 2.0: for our purposes -1, 0, 1 are special ops and not integers ;->
            yisint = yisodd = (y == -1.0);
        } else {
            xDouble mask = _mm_and_pd(absuy, double_exp_mask); // 2^(floor(lg|y|))
            const xDouble onesMask = mask + xOne; // 1 in ones position of significand (for y >= 2)
            const xDouble sigy = _mm_and_pd(absuy, double_mant_mask);
            const xDouble onesBit = _mm_and_pd(sigy, onesMask);
            
            mask = (xDouble)_mm_add_epi64((xUInt64)mask, (xUInt64)double_exp_lsb); // 2^(floor(lg|y|)+1)
            const xDouble fractUnMask = mask - xOne; // 1s in all the integer valued bits of significand
            const xUInt32 fractionalBits = _mm_andnot_si128((xUInt32)fractUnMask, (xUInt32)absuy);
            const int anyFractionBit = 0xff & _mm_movemask_epi8( _mm_cmpeq_epi8(fractionalBits, _mm_setzero_si128() ) ) ;
            const int anyOnesBit = 0xff & _mm_movemask_epi8( _mm_cmpeq_epi8((xUInt32)onesBit, _mm_setzero_si128() ) ); // Is there a faster way to do this? 
            yisint = (0xff == anyFractionBit);
            yisodd = (yisint && (0xff != anyOnesBit));
#if DEBUG
            printf("int: %d (%d), odd: %d (%d) %vllx %vllx %vllx\n", yisint, anyFractionBit, yisodd, anyOnesBit, fractionalBits, fractUnMask, onesBit);
#endif
        }
#if DEBUG
            printf("y hi: %a %x int: %d, odd: %d\n",y,absuyhi, yisint, yisodd);
#endif
 
        // Handle most edge cases
        //If |x| or |y| is in { +-0, +-Inf, +-NaN } 
        if( EXPECT_FALSE(absuxhi >= 0x7ff00000U
                         || absuyhi >= 0x7ff00000U
                         || _mm_istrue_sd( _mm_or_pd(_mm_cmpeq_pd(_mm_setzero_pd(), vx),_mm_cmpeq_pd(_mm_setzero_pd(), vy)))
                    )
                )
        {
            // any**0 = 1.0f for all values, including NaN
            if( 0. == y )
                return one;
        
            // handle NaNs
            if( x != x || y != y )
                return x + y;
                        
            if( 0. == x )
            {
                //if y is an odd integer
                if( yisodd )    
                {
                    if( y < 0.0 )
                        return one / x;
                        
                    return x;
                }
                
                // y is not an odd integer
                if( 0.0 < y )
                    return 0.0;
                
                return one / __builtin_fabs(x);                 // return Inf and set div/0
            }
            
            // deal with infinite y (already dealt with NaN)
            if( 0x7ff00000U == absuyhi )
            {
                if( -1.0 == x )
                    return one;
                    
                if( absuxhi >= 0x3ff00000U )        // |x| > 1.0 (already handled == 1.0)
                {   // |x| > 1.0
                    if( 0.0 < y )
                        return y;
                    else
                        return 0.0;
                }
                else
                {   // |x| < 1.0
                    if( 0.0 < y )
                        return 0.0;
                    else
                        return __builtin_fabs(y);
                }           
            }
        
            // we can also deal with x == +inf at this point.
            if( x == __builtin_inf() )
            {       
                if( y < 0.0 )
                    return 0.0;
                else
                    return x;
            }
            
            // At this point, we know that x is in { +-0, -Inf } and y is finite non-zero.
            // Deal with y is odd integer cases
            if( yisodd )    // if( |y| >= 1.0 || |y| < 0x1.0p53 )
            {                       
                // x == -inf
                if( 0.0 < y )
                    return x;
                    
                return -0.0; 
            }
            
            // x == -inf
            if( 0.0 < y )
                return -x;
                
            return 0.0;
        }

        const double absy = __builtin_fabs(y);
        //one last edge case -- pow(x, y) returns NaN and raises invalid for x < 0 and finite non-integer y
        // and one special case --      call sqrt for |y| == 0.5
        if( EXPECT_FALSE((x < 0.0 && !yisint) || (0.5 == absy)) )
        {
            if( x < 0.0 || y > 0.0 )
                return sqrt(x);
        
            return one / sqrt( x );
        }

        //Handle yisint at this point using long double 
//        if( yisint && (absuy < 0x41e0000000000000ULL)) {
        if( yisint && (absy < 0x1p8)) {
            //calculate ix = f**i
            long double ix = 1.0, lx = (long double) x;

            //if y is negative, we will need to take the reciprocal eventually
            //Do it now to avoid underflow when we should get overflow
            //but don't do it if iy is zero to avoid spurious overflow
            if( y < 0. )
                lx = 1.0L/ lx;

            //calculate x**i by doing lots of multiplication
            int i = (int)absy; // take abs of y since we have done the recip. 
            int mask = 1;

            //for each of the bits set in i, multiply ix by x**(2**bit_position)
            while(i != 0)
            {
                if( i & mask )
                {
                    ix *= lx;
                    i -= mask;
                }
                mask += mask;
                lx *= lx; // In double this might overflow spuriously, but not in long double
            }
            return (double)ix; // May legitimately under/overflow at this point.
        }
    }
#else
    {
        if( x == one || y == one)
                return x;

        //Move the arguments to the integer registers for bitwise inspection
        union{ double d; uint64_t u; } ux, uy;
        ux.d = x;               
        uy.d = y;
        uint64_t absux = ux.u & 0x7fffffffffffffffULL;
        uint64_t absuy = uy.u & 0x7fffffffffffffffULL;

        //figure out if y is an odd integer
        //Find out if y is an integer or not without raising inexact
        //Fails for Inf/NaN. We don't care about that here.
        if (EXPECT_FALSE(absuy >= 0x4340000000000000ULL)) { // |y| >= 0x1p53 implies y is an even int
            yisint = 1;
        } else if (EXPECT_TRUE(absuy < 0x4000000000000000ULL)) { // |y| < 2.0: for our purposes -1, 0, 1 are special ops and not integers ;->
            yisint = yisodd = (y == -1.0);
        } else {
            union{ double d; uint64_t u; } mask, onesMask, fractUnMask;
            
            mask.u = (absuy & 0x7ff0000000000000ULL); // 2^(floor(lg|y|))
            onesMask.d = mask.d + one; // 1 in ones position of significand (for y >= 2)
            const uint64_t sigy = absuy & 0x000fffffffffffffULL;
            const uint64_t onesBit =  sigy & onesMask.u;
            
            mask.u = mask.u + 0x0010000000000000ULL; // 2^(floor(lg|y|)+1)
            fractUnMask.d = mask.d - one; // 1s in all the integer valued bits of significand
            const uint64_t fractionalBits = absuy & ~fractUnMask.u;
            yisint = (0 == fractionalBits);
            yisodd = (yisint && (0 != onesBit));
        }
 
        // Handle most edge cases
        //If |x| or |y| is in { +-0, +-Inf, +-NaN } 
        if( EXPECT_FALSE((absux - 1ULL) >= 0x7fefffffffffffffULL || (absuy - 1ULL) >= 0x7fefffffffffffffULL) )
        {
            // any**0 = 1.0f for all values, including NaN
            if( 0 == absuy )
                return one;
        
            // handle NaNs
            if( x != x || y != y )
                return x + y;
                        
            if( 0 == absux )
            {
                //if y is an odd integer
                if( yisodd )    
                {
                    if( y < 0.0 )
                        return one / x;
                        
                    return x;
                }
                
                // y is not an odd integer
                if( 0.0 < y )
                    return 0.0;
                
                return one / __builtin_fabs(x);                 // return Inf and set div/0
            }
            
            // deal with infinite y
            if( 0x7ff0000000000000ULL == absuy )
            {
                if( -1.0 == x )
                    return one;
                    
                if( absux >= 0x3ff0000000000000ULL )        // |x| > 1.0 (already handled == 1.0)
                {   // |x| > 1.0
                    if( 0.0 < y )
                        return y;
                    else
                        return 0.0;
                }
                else
                {   // |x| < 1.0
                    if( 0.0 < y )
                        return 0.0;
                    else
                        return __builtin_fabs(y);
                }           
            }
        
            // we can also deal with x == +inf at this point.
            if( x == __builtin_inf() )
            {       
                if( y < 0.0 )
                    return 0.0;
                else
                    return x;
            }
            
            // At this point, we know that x is in { +-0, -Inf } and y is finite non-zero.
            // Deal with y is odd integer cases
            if( yisodd )    // if( |y| >= 1.0 || |y| < 0x1.0p53 )
            {                       
                // x == -inf
                if( 0.0 < y )
                    return x;
                    
                return -0.0; 
            }
            
            // x == -inf
            if( 0.0 < y )
                return -x;
                
            return 0.0;
        }

        //one last edge case -- pow(x, y) returns NaN and raises invalid for x < 0 and finite non-integer y
        // and one special case --      call sqrt for |y| == 0.5
        if( EXPECT_FALSE((x < 0.0 && !yisint) || (0x3fe0000000000000ULL == absuy)) )
        {
            if( x < 0.0 || y > 0.0 )
                return sqrt(x);
        
            return one / sqrt( x );
        }

        //Handle yisint at this point using long double 
//        if( yisint && (absuy < 0x41e0000000000000ULL)) {
        const double absy = fabs(y);
        if( yisint && (absy < 0x1p8)) {
            //calculate ix = f**i
            long double ix = 1.0, lx = (long double) x;

            //if y is negative, we will need to take the reciprocal eventually
            //Do it now to avoid underflow when we should get overflow
            //but don't do it if iy is zero to avoid spurious overflow
            if( y < 0. )
                lx = 1.0L/ lx;

            //calculate x**i by doing lots of multiplication
            int i = (int)absy; // take abs of y since we have done the recip. 
            int mask = 1;

            //for each of the bits set in i, multiply ix by x**(2**bit_position)
            while(i != 0)
            {
                if( i & mask )
                {
                    ix *= lx;
                    i -= mask;
                }
                mask += mask;
                lx *= lx; // In double this might overflow spuriously, but not in long double
            }
            return (double)ix; // May legitimately under/overflow at this point.
        }
    }
#endif

 // end of special ops handling

/*
  We have ruled out all cases with x or y in {nan, -inf, 0, 1, inf}, x=-1, invalid cases.
  Still need to worry about numeric overflow and underflow.
*/

    const double absx = __builtin_fabs(x);
    const double signx = (x < 0.0 && yisodd)?-1.0:1.0; // adjustment to the sign if needed
    if(x == -1.0) return signx;

    long double temp;

    //use fyl2x to get y*log2(x)
	const double *py = &y;
	const double *pabsx = &absx;
    asm volatile( "fldl (%1)\n fldl (%2)\n fyl2x \n fstpt %0" : "=m" (*(&temp)) : "r" (py),  "r" (pabsx), "m"(absx), "m"(y) );
    const long double lw = temp;
    const long double abslw = __builtin_fabsl(lw);

    //const long double lw = __fyl2x((long double)y, (long double)absx);

    // Compute exp2(lw)
    if (lw > POW_OVERFLOW_GUARANTEED) return signx * XDOUBLE_2_DOUBLE(REQUIRED_MULTIPLY_sd(big,big)); //big*big, raise overflow

    // TODO fix this for directed modes lw < 0 ? 0x1.fffffffffffffp-1|1 : 1|0x1.0000000000001p0 
    if (abslw < POW_1_GUARANTEED) return signx * 1.0; // Avoid spurious underflow
/* Note: another way to approach checking to see if the result is 1.0 with double in doulbe is
_mm_add_epi64((xInt64)absy, (((absx >> 11) | 1p11) - 1.ffcp11)) < 1p-57
*/

    if (lw < POW_UNDERFLOW_GUARANTEED) return signx * XDOUBLE_2_DOUBLE(REQUIRED_MULTIPLY_sd(small,small));//small*small, raise underflow
    const long double wn = __builtin_floorl(lw); // TODO: long double or double?
    const long double lwf = lw - wn;
/* **************************************************************** */


/*
Note that we can begin the calculation of thi once we know wfest
(which we get from west).
    x**y = 2**(y lg(x))
         = 2**(m + (west-m) + ...)
         = 2**m exp2(wfhi + wflo)
         = 2**m exp2(wfhi)exp2(wflo)
         = 2**m (thi + tlom1 * thi)

    thi = exp2(wfhi), 0 <= wfhi < 1
*/

//exp2m1 implementation for the reduced argument here....
    //b1 = first few bits of f (multiple of 2^-k1). 0 <= b1 < n1
    const int b1 = ((int)(lwf * TWO_N1));
    const double d1 = Exp2Table[b1][0]; // -2^-16 < wfest - d1 < 2^-k1

/*     const double twoI = u.d;     */
    
    //d2 = f - d1.  |d2| < 2^-k1
    const double d2 = (wn == -1.0) ? lw - (d1 - one) : lwf - d1 ; //TODO do we still need this with long double? 

    //thi = exp2(wfhi), |wfhi| < 1/2

/*
Now that we have defined the factors we can think about the logarithms. 
We stick with between working with log base 2
which is convenient for working with the exponents.

Compute 2 ** w = 2**(wn+wfhi+wflo)
               = 2**wn 2**wfhi 2**wflo; 
               = 2**wn exp2(wfhi) exp(wflo)
Where w = wn+wfhi+wflo. 
Let thi = 2**wfhi = exp2(wfhi), tlom1 = exp2m1(wflo)
    exp2(wfhi) exp2(wflo) = thi (1 + tlom1)
                      =  thi + tlom1 * thi
This last expression should behave well enough numerically. 
*/

    //thi = R(exp2(d1))
    const double thi = Exp2Table[b1][1];

    const double wflo = d2;

/* Now we can get the rest of the exponential
    tlom1 = expm1(wflo)
    x**y = 2**(y lg(x))
         = 2**m exp2(wfhi)exp(wflo)
         = 2**m (thi + thi tlom1)
*/

/*
We want to compute p(r) but early we know r' = d2 = r - wftail
So |r - r'| = |wftail| <~ |ccp| < 2**-30 
So |r^n - r'^n| < n 2**-30 r^n-1 < n 2**-(30+7*(n-1))
 */
    const double pwflo = ( ( ( ( 
                                       Exp2Poly2m7[0] //t0
                                       * wflo + Exp2Poly2m7[1] ) //t1+wflo(t0)
                               * wflo + Exp2Poly2m7[2] ) //t2+wflo(t1+wflo(t0))
                             * wflo + Exp2Poly2m7[3] ) //t3+wflo(t2+wflo(t1+wflo(t0)))
                           * wflo + Exp2Poly2m7[4] ); //t4+wflo(t3+wflo(t2+wflo(t1+wflo(t0))))
    const double tlom1 = wflo * pwflo; 

    const int m = (int)wn;
    const int m1 = m >> 1;
    const int m2 = m - m1;

    // We break 2**m into two pieces to sneak up on the over/underflow boundary
    const double scale1 = signx * twoton(m1);
    const double scale2 = twoton(m2);
    const double zf = thi + thi*tlom1; 
    const double z = scale1 * (scale2 * zf); // todo add Steves underflow trick
#if DEBUG
    printf("fyl2x: \t%a*lg(%a) = \t%La --> \n",y,absx,lw);
    printf("%La + %La (= %a[%d] + %a) --> %a * %a * %a (%a + 1)) = %La\n",wn,lwf,d1,b1,d2,scale1,scale2,thi,tlom1,z);
#endif

    return z;
}

#include <math.h>
#include <float.h>

//
//	This is not the worlds best power function.  It is merely a simple one that 
//	gives pretty good accuracy, with better range and precision than the double precision
//	one above. It should be off by no more than a few ulps, depending on the accuracy of 
//	exp2 and log2, which are in turn depedent on the hardware fyl2x and .
//
//	Since this is a long double implementation, I have chosen to be more conservative
//	about the level license I take with the C99 spec. It is rigorous about it's flags. 
//	It is perhaps a bit too rigorous about the inexact flag, which we are allowed to abose. 
//	It could be sped up by replacing nearbyintl with floor or round as appropriate.
//
long double powl( long double x, long double y )
{
	static const double neg_epsilon = 0x1.0p63;

	//if x = 1, return x for any y, even NaN
	if( x == 1.0 )
		return x;
	
	//if y == 0, return 1 for any x, even NaN
	if( y == 0.0 )
		return 1.0L;

	//get NaNs out of the way
	if( x != x  || y != y )
		return x + y;
	
	//do the work required to sort out edge cases
	long double fabsy = __builtin_fabsl( y );
	long double fabsx = __builtin_fabsl( x );
	long double infinity = __builtin_infl();
	long double iy = nearbyintl( fabsy );			//we do round to nearest here so that |fy| <= 0.5
	if( iy > fabsy )//convert nearbyint to floor
		iy -= 1.0L;
	int isOddInt = 0;
	if( fabsy == iy && fabsy != infinity && iy < neg_epsilon )
		isOddInt = 	iy - 2.0L * nearbyintl( 0.5L * iy );		//might be 0, -1, or 1
			
	///test a few more edge cases
	//deal with x == 0 cases
	if( x == 0.0 )
	{
		if( ! isOddInt )
			x = 0.0L;

		if( y < 0 )
			x = 1.0L/ x;

		return x;
	}
	
	//x == +-Inf cases
	if( fabsx == infinity )
	{
		if( x < 0 )
		{
			if( isOddInt )
			{
				if( y < 0 )
					return -0.0;
				else
					return -infinity;
			}
			else
			{
				if( y < 0 )
					return 0.0;
				else
					return infinity;
			}
		}

		if( y < 0 )
			return 0;
		return infinity;
	}

	//y = +-inf cases
	if( fabsy == infinity )
	{
		if( x == -1 )
			return 1;

		if( y < 0 )
		{
			if( fabsx < 1 )
				return infinity;
			return 0;
		}
		if( fabsx < 1 )
			return 0;
		return infinity;
	}

	// x < 0 and y non integer case
	if( x < 0 && iy != fabsy )
	{
		SET_INVALID_FLAG();
		return nanl("37");
	}
	
	//speedy resolution of sqrt and reciprocal sqrt
	if( fabsy == 0.5 )
	{
		x = sqrtl( x );
		if( y < 0 )
			x = 1.0L/ x;
		return x;
	}

	//Enter the main power function.  This is done as:
	//
	//		split up x**y as:
	//
	//			x**y	= x**(i+f)		i = integer part of y, f = positive fractional part
	//					= x**f * x**i
	//
	long double fy = fabsy - iy;
	
	long double fx = 1.0;
	long double ix = 1.0;

	//Calculate fx = x**f
	if( fy != 0 ) //This is expensive and may set unwanted flags. skip if unneeded
	{
		fx =log2l(x);

		long double fabsfx = __builtin_fabsl( fx );
		long double min = fminl( fy, fabsfx );
		long double max = fmaxl( fy, fabsfx );

		if( y < 0  )
			fy = -fy;

		//if fx * fy is a denormal, we get spurious underflow here, so try to avoid that
		if( min < 0x1.0p-8191L && max < neg_epsilon )	//a crude test for a denormal product
		{
			fx = 1;		//for small numbers, skip straight to the result
		}
		else
		{ //safe to do the work
			fx *= fy;
			fx = exp2l( fx );
		}
	}

	//calculate ix = f**i
	
	//if y is negative, we will need to take the reciprocal eventually
	//Do it now to avoid underflow when we should get overflow
	//but don't do it if iy is zero to avoid spurious overflow
	if( y < 0 && iy != 0 )
		x = 1.0L/ x;

	//calculate x**i by doing lots of multiplication
	while( iy != 0.0L )
	{
		long double ylo;

		//early exit for underflow and overflow. Otherwise we may end up looping up to 16383 times here.
		if( x == 0.0 || x == infinity )
		{
			ix *= x;	//we know this is the right thing to do, because iy != 0
			break;
		}

		//chop off 30 bits at a time
		if( iy > 0x1.0p30 )
		{
			long double scaled = iy * 0x1.0p-30L;
			long double yhi = nearbyintl( scaled );
			if( yhi > scaled )
				yhi -= 1.0;
			ylo = iy - 0x1.0p30L * yhi;
			iy = yhi;
		}
		else
		{ //faster code for the common case
			ylo = iy;
			iy = 0;
		}

		int j;
		int i = ylo;
		int mask = 1;

		//for each of the 30 bits set in i, multiply ix by x**(2**bit_position)
		if( i & 1 )
		{
			ix *= x;
			i -= mask;
		}
		for( j = 0; j < 30 && i != 0; j++ )
		{
			mask += mask;
			x *= x;
			if( i & mask )
			{
				ix *= x;
				i -= mask;
			}
		}
		
		//we may have exited early from the loop above. 
		//If so, and there are still bits in iy finish out the multiplies
		if( 0.0 != iy )
			for( ; j < 30; j++ )
				x *= x;
	}

	x = fx * ix;

	return x;
}


#pragma mark -
#pragma mark cbrt

static inline double _cbrt( double _x ) ALWAYS_INLINE;

double _cbrt( double _x )
{
    static const double infinity = __builtin_inf();
    static const double smallestNormal = 0x1.0p-1022;
    static const double twom968 = 0x1.0p-968;
    static const xUInt64 oneThird = { 0x55555556ULL, 0 };
    static const xUInt32 denormBias = { 0, 696219795U, 0, 0 };
    static const xUInt32 normalBias = { 0, 0x1200000U, 0, 0 };

    static const double C =  5.42857142857142815906e-01; /* 19/35     = 0x3FE15F15, 0xF15F15F1 */
    static const double D = -7.05306122448979611050e-01; /* -864/1225 = 0xBFE691DE, 0x2532C834 */
    static const double E =  1.41428571428571436819e+00; /* 99/70     = 0x3FF6A0EA, 0x0EA0EA0F */
    static const double F =  1.60714285714285720630e+00; /* 45/28     = 0x3FF9B6DB, 0x6DB6DB6E */
    static const double G =  3.57142857142857150787e-01; /* 5/14      = 0x3FD6DB6D, 0xB6DB6DB7 */

    static const xDouble expMask = { __builtin_inf(), 0 };
    static const xUInt64 topMask = { 0xFFFFFFFF00000000ULL, 0 };
    static const double twom20 = 0x1.0p-20;

	xDouble x = DOUBLE_2_XDOUBLE( _x ); 

	if( EXPECT_FALSE( _mm_istrue_sd( _mm_cmpunord_sd( x, x ) ) ) )
		return _x + _x;

	xDouble sign = _mm_and_pd( x, minusZeroD );     //set aside sign
	x = _mm_andnot_pd( minusZeroD, x );             //x = fabs(x)

    if( EXPECT_FALSE( _mm_istrue_sd( _mm_cmpeq_sdm( x, &infinity)) ) )
		return _x;

	if( EXPECT_TRUE( _x != 0.0 ) )
	{
		xDouble isDenorm = _mm_cmplt_sdm( x, &smallestNormal );
		xDouble t = _mm_and_pd( _mm_load_sd( &twom968 ), isDenorm );        //t is 0 for normals, and 2**54 for denormals
		t = _mm_sub_sd( _mm_or_pd( t, x ), t );                             //multiply of t * x for denormals. Exact for normals.
		
		//prepare cheesy estimate of t**1/3 by dividing high 32-bits by 3
		xSInt32 addend = _mm_add_epi32( _mm_andnot_si128( (xSInt32) isDenorm, normalBias), denormBias );
		t = (xDouble) _mm_mul_epu32( _mm_srli_epi64( (xSInt64) t, 32 ), oneThird );
		t = (xDouble) _mm_add_epi32( (xSInt32) t, addend );
		
		//new cbrt to a reported 23 bits (may be implemented in single precision
		xDouble r = _mm_div_sd( _mm_mul_sd( t, t ), x );        //r = t*t/x
		xDouble s = _mm_add_sdm( _mm_mul_sd( r, t ), &C );      //s = C + r*t
		xDouble y = _mm_add_sdm( s, &E );
		xDouble z = _mm_div_sd( _mm_load_sd( &D ), s );
		y = _mm_add_sd( y, z );
		y = _mm_div_sd( _mm_load_sd( &F ), y );
		y = _mm_add_sdm( y, &G );
		t = _mm_mul_sd( t, y );

		/* chopped to 20 bits and make it larger than cbrt(x) */ 
		xDouble add = _mm_mul_sdm( t, &twom20 ); 
		add = _mm_and_pd( add, expMask );
		t = _mm_add_sd( t, add );
		t = _mm_and_pd( t, (xDouble) topMask );
		
		/* one step newton iteration to 53 bits with error less than 0.667 ulps */
		s = _mm_mul_sd( t, t );            //exact
		r = _mm_div_sd( x, s );         
		xDouble w = _mm_add_sd( t, t );
		w = _mm_add_sd( w, r );
		r = _mm_sub_sd( r, t );
		r = _mm_div_sd( r, w );
		t = _mm_add_sd( t, _mm_mul_sd( t, r ) );
		
		//restore sign
		t = _mm_or_pd( t, sign );
	
		return XDOUBLE_2_DOUBLE( t );
	}

	return _x;      //result for 0.0 and -0.0
}

double cbrt( double x )
{
	return _cbrt( x );
}

#if 0
/* **************** OLD STUFF **************** */
/*
 *  xmm_power.c
 *  xmmLibm
 *
 *  Created by Ian Ollmann, Ph.D. on 7/15/05.
 *  Copyright © 2005 Apple Computer, Inc. All rights reserved.
 *
 *  Constants from original typing by Earl Killian of MIPS on March 23rd, 1992.         
 *  Converted from pairs of 32-bit hexadecimal words to C99 notation, by Ian Ollmann
 *
 *  Algorithm from Peter Tang:
 *
 *      ACM Transactions on Mathematical Software, Vol 15, 2, June 1989, pp 144-157
 *      ACM Transactions on Mathematical Software, Vol 18, 2, June 1992, pp 211-222
 *      
 */
 
#include "xmmLibm_prefix.h"

#include "math.h"

static const double T1 =  0x1.F800000000000p-1; //         0.984375 //  T1 = 1-1/64
static const double T2 =  0x1.0400000000000p+0; //         1.015625 //  T2 = 1+1/64
static const double T52 = 0x1.0000000000000p+52; // 4503599627370496  //  T52 = 2^52
static const double T53 = 0x1.0000000000000p+53; // 9007199254740992  //  T53 = 2^53
static const double Emax =  0x1.62E42FEFA39EFp+9; //709.782712893383973096
static const double Emin = -0x1.74385446D71C3p+9; //-744.44007192138121809
static const double A1 =  0x1.5555555555555p-4; //0.0833333333333333287074
static const double A2 =  0x1.99999999FE736p-7; //0.0125000000007165872062
static const double A3 =  0x1.24919E6600596p-9; //0.00223212297987691443008
static const double B1 =  0x1.555555554F9EDp-4; //0.0833333333330085884727
static const double B2 =  0x1.999A118F10BD9p-7; //0.0125000558601921375051
static const double C1 =  0x1.5555555555555p-4; //0.0833333333333333287074
static const double C2 =  0x1.99999999AF7C8p-7; //0.0125000000001555117146
static const double C3 =  0x1.24923B2F1315Cp-9; //0.00223214123210461849733
static const double C4 =  0x1.CE20EE795DBA1p-12; //0.00044072021372392784647
static const double C5 =  0x1.CE20EE795DBA1p-12; //0.00044072021372392784647
static const double Inv_L =  0x1.71547652B82FEp+5; //46.1662413084468283841
static const double L1 =  0x1.62E42FEF00000p-6; //0.0216608493901730980724
static const double L2 =  0x1.473DE6AF278EDp-39; //2.32519284687887401481e-12
static const double P1 =  0x1.0000000000000p-1; //              0.5
static const double P2 =  0x1.5555555547334p-3; //0.166666666665059914898
static const double P3 =  0x1.555555554A9D2p-5; //0.0416666666663619983391
static const double P4 =  0x1.1111609FBE568p-7; //0.00833337038010269204324
static const double P5 =  0x1.6C172098CB78Bp-10; //0.0013888944287816253325
static const double plusinf =  1e500; //              inf

static const double logtable[129*2] = {
                                         0.0, //                0
                                         0.0, //                0
                                         0x1.FE02A6B200000p-8, //0.00778214044294145423919
                                        -0x1.F30EE07912DF9p-41, //-8.86505291726724739329e-13
                                         0x1.FC0A8B1000000p-7, //0.015504186536418274045
                                        -0x1.FE0E183092C59p-42, //-4.5301989413649348858e-13
                                         0x1.7B91B07D80000p-6, //0.0231670592820591991767
                                        -0x1.2772AB6C0559Cp-41, //-5.24820947929564425056e-13
                                         0x1.F829B0E780000p-6, //0.0307716586667083902285
                                         0x1.980267C7E09E4p-45, //4.52981425779092882775e-14
                                         0x1.39E87BA000000p-5, //0.0383188643027096986771
                                        -0x1.42A056FEA4DFDp-41, //-5.7309948330766312415e-13
                                         0x1.77458F6340000p-5, //0.0458095360318111488596
                                        -0x1.2303B9CB0D5E1p-41, //-5.16945692881222029089e-13
                                         0x1.B42DD71180000p-5, //0.053244514518155483529
                                         0x1.71BEC28D14C7Ep-41, //6.56799336898521766515e-13
                                         0x1.F0A30C0100000p-5, //0.0606246218158048577607
                                         0x1.62A6617CC9717p-41, //6.29984819938331143924e-13
                                         0x1.16536EEA40000p-4, //0.0679506619089806918055
                                        -0x1.0A3E2F3B47D18p-41, //-4.72942410916632905482e-13
                                         0x1.341D7961C0000p-4, //0.0752234212377516087145
                                        -0x1.717B6B33E44F8p-43, //-1.64083015855986619259e-13
                                         0x1.51B073F060000p-4, //0.0824436692109884461388
                                         0x1.83F69278E686Ap-44, //8.61451293608781447223e-14
                                         0x1.6F0D28AE60000p-4, //0.089612158690215437673
                                        -0x1.2968C836CC8C2p-41, //-5.28305053080814367877e-13
                                         0x1.8C345D6320000p-4, //0.0967296264589094789699
                                        -0x1.937C294D2F567p-42, //-3.58366674300941370128e-13
                                         0x1.A926D3A4A0000p-4, //0.103796793680885457434
                                         0x1.AAC6CA17A4554p-41, //7.58107392301637643358e-13
                                         0x1.C5E548F5C0000p-4, //0.110814366340491687879
                                        -0x1.C5E7514F4083Fp-43, //-2.01573684160162150917e-13
                                         0x1.E27076E2A0000p-4, //0.117783035655520507134
                                         0x1.E5CBD3D50FFFCp-41, //8.62947404296943765415e-13
                                         0x1.FEC9131DC0000p-4, //0.12470347850103280507
                                        -0x1.54555D1AE6607p-44, //-7.55692068745133691756e-14
                                         0x1.0D77E7CD10000p-3, //0.131576357789526809938
                                        -0x1.C69A65A23A170p-41, //-8.075373495358435282e-13
                                         0x1.1B72AD52F0000p-3, //0.138402322858382831328
                                         0x1.9E80A41811A39p-41, //7.36304357708705134617e-13
                                         0x1.29552F8200000p-3, //0.145182009844575077295
                                        -0x1.5B967F4471DFCp-44, //-7.71800133682809851086e-14
                                         0x1.371FC201F0000p-3, //0.151916042026641662233
                                        -0x1.C22F10C9A4EA8p-41, //-7.99687160774375808217e-13
                                         0x1.44D2B6CCB0000p-3, //0.158605030175749561749
                                         0x1.F4799F4F6543Ep-41, //8.890223439724662699e-13
                                         0x1.526E5E3A20000p-3, //0.165249572895845631137
                                        -0x1.2F21746FF8A47p-41, //-5.38468261878823239516e-13
                                         0x1.5FF3070A80000p-3, //0.171850256927427835763
                                        -0x1.B0B0DE3077D7Ep-41, //-7.6861342240181686233e-13
                                         0x1.6D60FE71A0000p-3, //0.178407657473144354299
                                        -0x1.6F1B955C4D1DAp-42, //-3.26057179310581566492e-13
                                         0x1.7AB8902110000p-3, //0.184922338494288851507
                                        -0x1.37B720E4A694Bp-42, //-2.76858843104483055456e-13
                                         0x1.87FA065210000p-3, //0.191394853000019793399
                                        -0x1.B77B7EFFB7F41p-42, //-3.90338789379495198219e-13
                                         0x1.9525A9CF40000p-3, //0.197825743329303804785
                                         0x1.5AD1D904C1D4Ep-41, //6.16075577558872326221e-13
                                         0x1.A23BC1FE30000p-3, //0.20421554142922104802
                                        -0x1.2A739B23B93E1p-41, //-5.30156516006025969342e-13
                                         0x1.AF3C94E810000p-3, //0.210564769107804750092
                                        -0x1.00349CC67F9B2p-41, //-4.55112422774782019696e-13
                                         0x1.BC286742E0000p-3, //0.216873938301432644948
                                        -0x1.CCA75818C5DBCp-41, //-8.18285329273778346373e-13
                                         0x1.C8FF7C79B0000p-3, //0.223143551314933574758
                                        -0x1.97794F689F843p-41, //-7.23818992174968106057e-13
                                         0x1.D5C216B500000p-3, //0.229374101065332069993
                                        -0x1.11BA91BBCA682p-41, //-4.86240001538378988236e-13
                                         0x1.E27076E2B0000p-3, //0.235566071312860003673
                                        -0x1.A342C2AF0003Cp-44, //-9.30945949519688945136e-14
                                         0x1.EF0ADCBDC0000p-3, //0.241719936886511277407
                                         0x1.64D948637950Ep-41, //6.33890736899755317832e-13
                                         0x1.FB9186D5E0000p-3, //0.247836163904139539227
                                         0x1.F1546AAA3361Cp-42, //4.41717553713155466566e-13
                                         0x1.0402594B50000p-2, //0.253915209981641964987
                                        -0x1.7DF928EC217A5p-41, //-6.78520849597058843023e-13
                                         0x1.0A324E2738000p-2, //0.259957524436686071567
                                         0x1.0E35F73F7A018p-42, //2.39995404842117353465e-13
                                         0x1.1058BF9AE8000p-2, //0.265963548497893498279
                                        -0x1.A9573B02FAA5Ap-41, //-7.55556940028374187478e-13
                                         0x1.1675CABAB8000p-2, //0.271933715483100968413
                                         0x1.30701CE63EAB9p-41, //5.40790418614551497411e-13
                                         0x1.1C898C1698000p-2, //0.277868451003087102436
                                         0x1.9FAFBC68E7540p-42, //3.69203750820800887027e-13
                                         0x1.22941FBCF8000p-2, //0.283768173130738432519
                                        -0x1.A6976F5EB0963p-44, //-9.38341722366369999987e-14
                                         0x1.2895A13DE8000p-2, //0.289633292582948342897
                                         0x1.A8D7AD24C13F0p-44, //9.43339818951269030846e-14
                                         0x1.2E8E2BAE10000p-2, //0.2954642128934210632
                                         0x1.D309C2CC91A85p-42, //4.1481318704258567983e-13
                                         0x1.347DD9A988000p-2, //0.301261330578199704178
                                        -0x1.5594DD4C58092p-45, //-3.7923164802093146798e-14
                                         0x1.3A64C55698000p-2, //0.307025035295737325214
                                        -0x1.D0B1C68651946p-41, //-8.25463138725003992339e-13
                                         0x1.4043086868000p-2, //0.312755710003330023028
                                         0x1.3F1DE86093EFAp-41, //5.66865358290073900922e-13
                                         0x1.4618BC21C8000p-2, //0.318453731119006988592
                                        -0x1.09EC17A426426p-41, //-4.72372782198636743149e-13
                                         0x1.4BE5F95778000p-2, //0.324119468654316733591
                                        -0x1.D7C92CD9AD824p-44, //-1.04757500587765412913e-13
                                         0x1.51AAD872E0000p-2, //0.329753286372579168528
                                        -0x1.F4BD8DB0A7CC1p-44, //-1.11186713895593226425e-13
                                         0x1.5767717458000p-2, //0.335355541921671829186
                                        -0x1.2C9D5B2A49AF9p-41, //-5.33998929200329680741e-13
                                         0x1.5D1BDBF580000p-2, //0.340926586970454081893
                                         0x1.394A11B1C1EE4p-43, //1.39128412121975659358e-13
                                         0x1.62C82F2BA0000p-2, //0.34646676734701031819
                                        -0x1.C356848506EADp-41, //-8.01737271397201833369e-13
                                         0x1.686C81E9B0000p-2, //0.351976423156884266064
                                         0x1.4AEC442BE1015p-42, //2.9391859187648000773e-13
                                         0x1.6E08EAA2B8000p-2, //0.357455888921322184615
                                         0x1.0F1C609C98C6Cp-41, //4.81589611172320539489e-13
                                         0x1.739D7F6BC0000p-2, //0.362905493690050207078
                                        -0x1.7FCB18ED9D603p-41, //-6.81753940632532726416e-13
                                         0x1.792A55FDD8000p-2, //0.368325561159508652054
                                        -0x1.C2EC1F512DC03p-41, //-8.00999005543249141653e-13
                                         0x1.7EAF83B828000p-2, //0.373716409792905324139
                                         0x1.7E1B259D2F3DAp-41, //6.78756682315870616582e-13
                                         0x1.842D1DA1E8000p-2, //0.379078352934811846353
                                         0x1.62E927628CBC2p-43, //1.57612037739694350287e-13
                                         0x1.89A3386C18000p-2, //0.384411698911208077334
                                        -0x1.ED2A52C73BF78p-41, //-8.76037599077487426799e-13
                                         0x1.8F11E87368000p-2, //0.389716751140440464951
                                        -0x1.D3881E8962A96p-42, //-4.15251580634361213004e-13
                                         0x1.947941C210000p-2, //0.394993808240542421117
                                         0x1.6FABA4CDD147Dp-42, //3.26556988969071456956e-13
                                         0x1.99D9581180000p-2, //0.400243164127459749579
                                        -0x1.F753456D113B8p-42, //-4.47042650104524445082e-13
                                         0x1.9F323ECBF8000p-2, //0.405465108107819105498
                                         0x1.84BF2B68D766Fp-42, //3.45276479520397708744e-13
                                         0x1.A484090E58000p-2, //0.410659924984429380856
                                         0x1.D8515FE535B87p-41, //8.39005077851830734139e-13
                                         0x1.A9CEC9A9A0000p-2, //0.415827895143593195826
                                         0x1.0931A909FEA5Ep-43, //1.17769787513692141889e-13
                                         0x1.AF12932478000p-2, //0.420969294644237379543
                                        -0x1.E53BB31EED7A9p-44, //-1.07743414616095792458e-13
                                         0x1.B44F77BCC8000p-2, //0.426084395310681429692
                                         0x1.EC5197DDB55D3p-43, //2.1863343293215910319e-13
                                         0x1.B985896930000p-2, //0.431173464818130014464
                                         0x1.0FB598FB14F89p-42, //2.41326394913331314894e-13
                                         0x1.BEB4D9DA70000p-2, //0.436236766774527495727
                                         0x1.B7BF7861D37ACp-42, //3.90574622098307022265e-13
                                         0x1.C3DD7A7CD8000p-2, //0.44127456080423144158
                                         0x1.6A6B9D9E0A5BDp-41, //6.43787909737320689684e-13
                                         0x1.C8FF7C79A8000p-2, //0.446287102628048160113
                                         0x1.A21AC25D81EF3p-42, //3.71351419195920213229e-13
                                         0x1.CE1AF0B860000p-2, //0.451274644139630254358
                                        -0x1.8290905A86AA6p-43, //-1.71669213360824320344e-13
                                         0x1.D32FE7E010000p-2, //0.456237433481874177232
                                        -0x1.42A9E21373414p-42, //-2.86582851579143533167e-13
                                         0x1.D83E7258A0000p-2, //0.461175715121498797089
                                         0x1.79F2828ADD176p-41, //6.71369279138460114513e-13
                                         0x1.DD46A04C20000p-2, //0.466089729925442952663
                                        -0x1.DAFA08CECADB1p-41, //-8.43728104087127572675e-13
                                         0x1.E24881A7C8000p-2, //0.470979715219073113985
                                        -0x1.3D9E34270BA6Bp-42, //-2.82101438461812689978e-13
                                         0x1.E744261D68000p-2, //0.475845904869856894948
                                         0x1.E1F8DF68DBCF3p-44, //1.07019317621142549209e-13
                                         0x1.EC399D2468000p-2, //0.480688529345570714213
                                         0x1.9802EB9DCA7E7p-43, //1.81193463664411114729e-13
                                         0x1.F128F5FAF0000p-2, //0.485507815781602403149
                                         0x1.BB2CD720EC44Cp-44, //9.84046527823262695501e-14
                                         0x1.F6123FA700000p-2, //0.490303988044615834951
                                         0x1.45630A2B61E5Bp-41, //5.78003198945402769376e-13
                                         0x1.FAF588F790000p-2, //0.495077266798034543172
                                        -0x1.9C24CA098362Bp-43, //-1.83028573560416684376e-13
                                         0x1.FFD2E08580000p-2, //0.499827869556611403823
                                        -0x1.6CF54D05F9367p-43, //-1.62074001567449500378e-13
                                         0x1.02552A5A5C000p-1, //0.504556010751912253909
                                         0x1.0FEC69C695D7Fp-41, //4.830331494955320223e-13
                                         0x1.04BDF9DA94000p-1, //0.509261901790523552336
                                        -0x1.92D9A033EFF75p-41, //-7.15605531723821174215e-13
                                         0x1.0723E5C1CC000p-1, //0.513945751101346104406
                                         0x1.F404E57963891p-41, //8.8821239518571854472e-13
                                         0x1.0986F4F574000p-1, //0.518607764208354637958
                                        -0x1.5BE8DC04AD601p-42, //-3.09005805132382426227e-13
                                         0x1.0BE72E4254000p-1, //0.523248143765158602037
                                        -0x1.57D49676844CCp-41, //-6.10765519728514951184e-13
                                         0x1.0E44985D1C000p-1, //0.527867089620485785417
                                         0x1.917EDD5CBBD2Dp-42, //3.56599696633478298092e-13
                                         0x1.109F39E2D4000p-1, //0.532464798869114019908
                                         0x1.92DFBC7D93617p-42, //3.57823965912763837621e-13
                                         0x1.12F7195940000p-1, //0.537041465897345915437
                                        -0x1.043ACFEDCE638p-41, //-4.62260870015445768969e-13
                                         0x1.154C3D2F4C000p-1, //0.541597282432121573947
                                         0x1.5E9A98F33A396p-41, //6.22797629172251525649e-13
                                         0x1.179EABBD88000p-1, //0.54613243759740726091
                                         0x1.9A0BFC60E6FA0p-41, //7.28389472720657362987e-13
                                         0x1.19EE6B467C000p-1, //0.550647117952394182794
                                         0x1.2DD98B97BAEF0p-42, //2.68096466152116723636e-13
                                         0x1.1C3B81F714000p-1, //0.555141507540611200966
                                        -0x1.EDA1B58389902p-44, //-1.09608250460592783688e-13
                                         0x1.1E85F5E704000p-1, //0.559615787935399566777
                                         0x1.A07BD8B34BE7Cp-46, //2.3119493838005377632e-14
                                         0x1.20CDCD192C000p-1, //0.564070138285387656651
                                        -0x1.4926CAFC2F08Ap-41, //-5.84690580052992446699e-13
                                         0x1.23130D7BEC000p-1, //0.568504735352689749561
                                        -0x1.7AFA4392F1BA7p-46, //-2.10374825114449422873e-14
                                         0x1.2555BCE990000p-1, //0.572919753562018740922
                                        -0x1.06987F78A4A5Ep-42, //-2.33231829455874083248e-13
                                         0x1.2795E1289C000p-1, //0.577315365035246941261
                                        -0x1.DCA290F81848Dp-42, //-4.23336942881419153586e-13
                                         0x1.29D37FEC2C000p-1, //0.5816917396350618219
                                        -0x1.EEA6F465268B4p-42, //-4.39339379697378426136e-13
                                         0x1.2C0E9ED448000p-1, //0.586049045003164792433
                                         0x1.D1772F5386374p-42, //4.13416470738355643357e-13
                                         0x1.2E47436E40000p-1, //0.590387446602107957006
                                         0x1.34202A10C3491p-44, //6.84176364159146659095e-14
                                         0x1.307D7334F0000p-1, //0.594707107746216934174
                                         0x1.0BE1FB590A1F5p-41, //4.75855340044306376333e-13
                                         0x1.32B1339120000p-1, //0.599008189645246602595
                                         0x1.D71320556B67Bp-41, //8.36796786747576938145e-13
                                         0x1.34E289D9D0000p-1, //0.603290851438941899687
                                        -0x1.E2CE9146D277Ap-41, //-8.57637346466586390378e-13
                                         0x1.37117B5474000p-1, //0.607555250224322662689
                                         0x1.ED71774092113p-43, //2.19132812293400917731e-13
                                         0x1.393E0D3564000p-1, //0.611801541106615331955
                                        -0x1.5E6563BBD9FC9p-41, //-6.22428425364311469584e-13
                                         0x1.3B6844A000000p-1, //0.616029877215623855591
                                        -0x1.EEA838909F3D3p-44, //-1.0983594325438429833e-13
                                         0x1.3D9026A714000p-1, //0.620240409751204424538
                                         0x1.6FAA404263D0Bp-41, //6.53104313776336534177e-13
                                         0x1.3FB5B84D18000p-1, //0.624433288012369303033
                                        -0x1.0BDA4B162AFA3p-41, //-4.75801990217107657695e-13
                                         0x1.41D8FE8468000p-1, //0.628608659422752680257
                                        -0x1.AA33736867A17p-42, //-3.78542512654570397313e-13
                                         0x1.43F9FE2F9C000p-1, //0.632766669570628437214
                                         0x1.CCEF4E4F736C2p-42, //4.09392332186786656392e-13
                                         0x1.4618BC21C4000p-1, //0.636907462236194987781
                                         0x1.EC27D0B7B37B3p-41, //8.74243839148582888557e-13
                                         0x1.48353D1EA8000p-1, //0.641031179420679109171
                                         0x1.1BEE7ABD17660p-42, //2.52181884568428814231e-13
                                         0x1.4A4F85DB04000p-1, //0.645137961373620782979
                                        -0x1.44FDD840B8591p-45, //-3.60813136042255739798e-14
                                         0x1.4C679AFCD0000p-1, //0.64922794662561500445
                                        -0x1.1C64E971322CEp-41, //-5.05185559242808977623e-13
                                         0x1.4E7D811B74000p-1, //0.653301272011958644725
                                         0x1.BB09CB0985646p-41, //7.86994033233553225797e-13
                                         0x1.50913CC018000p-1, //0.657358072709030238912
                                        -0x1.794B434C5A4F5p-41, //-6.70208769619490643267e-13
                                         0x1.52A2D265BC000p-1, //0.661398482245203922503
                                         0x1.6ABB9DF22BC57p-43, //1.61085757539324585156e-13
                                         0x1.54B2467998000p-1, //0.665422632544505177066
                                         0x1.497A915428B44p-41, //5.85271884362515112697e-13
                                         0x1.56BF9D5B40000p-1, //0.669430653942981734872
                                        -0x1.8CD7DC73BD194p-42, //-3.52467572979047943315e-13
                                         0x1.58CADB5CD8000p-1, //0.673422675212350441143
                                        -0x1.9DB3DB43689B4p-43, //-1.83720844956290584735e-13
                                         0x1.5AD404C358000p-1, //0.677398823590920073912
                                         0x1.F2CFB29AAA5F0p-41, //8.86066898134949155668e-13
                                         0x1.5CDB1DC6C0000p-1, //0.681359224807238206267
                                         0x1.7648CF6E3C5D7p-41, //6.64862680714687006264e-13
                                         0x1.5EE02A9240000p-1, //0.685304003098281100392
                                         0x1.67570D6095FD2p-41, //6.38316151706465171657e-13
                                         0x1.60E32F4478000p-1, //0.689233281238557538018
                                         0x1.1B194F912B417p-42, //2.51442307283760746611e-13
                                         0x1.62E42FEFA4000p-1, //0.693147180560117703862
                                        -0x1.8432A1B0E2634p-43 //-1.72394445256148347926e-13
                                    };
                                    
static const double exptable[32*2] = {
                                         0x1.0000000000000p+0, //                1
                                         0.0,                   //                0
                                         0x1.059B0D3158540p+0, //1.02189714865410508082
                                         0x1.A1D73E2A475B4p-47, //1.15974117063913618369e-14
                                         0x1.0B5586CF98900p+0, //1.04427378242741042413
                                         0x1.EC5317256E308p-49, //3.41618797093084913461e-15
                                         0x1.11301D0125B40p+0, //1.06714040067681992241
                                         0x1.0A4EBBF1AED93p-48, //3.69575974405711634226e-15
                                         0x1.172B83C7D5140p+0, //1.09050773266524458904
                                         0x1.D6E6FBE462876p-47, //1.30701638697787231928e-14
                                         0x1.1D4873168B980p+0, //1.11438674259588310633
                                         0x1.53C02DC0144C8p-47, //9.42997619141976990955e-15
                                         0x1.2387A6E756200p+0, //1.13878863475667913008
                                         0x1.C3360FD6D8E0Bp-47, //1.25236260025620074908e-14
                                         0x1.29E9DF51FDEC0p+0, //1.16372485877757014805
                                         0x1.09612E8AFAD12p-47, //7.36576401089527357793e-15
                                         0x1.306FE0A31B700p+0, //1.18920711500271636396
                                         0x1.52DE8D5A46306p-48, //4.70275685574031410345e-15
                                         0x1.371A7373AA9C0p+0, //1.21524735998046651275
                                         0x1.54E28AA05E8A9p-49, //2.36536434724852953227e-15
                                         0x1.3DEA64C123400p+0, //1.2418578120734764525
                                         0x1.11ADA0911F09Fp-47, //7.59609684336943426188e-15
                                         0x1.44E0860618900p+0, //1.26905095719172322788
                                         0x1.68189B7A04EF8p-47, //9.99467515375775096979e-15
                                         0x1.4BFDAD5362A00p+0, //1.29683955465100098081
                                         0x1.38EA1CBD7F621p-47, //8.68512209487110863385e-15
                                         0x1.5342B569D4F80p+0, //1.32523664315974087913
                                         0x1.DF0A83C49D86Ap-52, //4.15501897749673983948e-16
                                         0x1.5AB07DD485400p+0, //1.35425554693688354746
                                         0x1.4AC64980A8C8Fp-47, //9.18083828572431297142e-15
                                         0x1.6247EB03A5580p+0, //1.38390988196383091235
                                         0x1.2C7C3E81BF4B7p-50, //1.04251790803720876383e-15
                                         0x1.6A09E667F3BC0p+0, //1.41421356237309225889
                                         0x1.921165F626CDDp-49, //2.78990693089087774733e-15
                                         0x1.71F75E8EC5F40p+0, //1.44518080697703510396
                                         0x1.9EE91B8797785p-47, //1.15160818747516875124e-14
                                         0x1.7A11473EB0180p+0, //1.47682614593949779191
                                         0x1.B5F54408FDB37p-50, //1.51947228890629129108e-15
                                         0x1.82589994CCE00p+0, //1.50916442759341862256
                                         0x1.28ACF88AFAB35p-48, //4.11720196080016564552e-15
                                         0x1.8ACE5422AA0C0p+0, //1.54221082540793474891
                                         0x1.B5BA7C55A192Dp-48, //6.074702681072821835e-15
                                         0x1.93737B0CDC5C0p+0, //1.57598084510787828094
                                         0x1.27A280E1F92A0p-47, //8.20551346575487959595e-15
                                         0x1.9C49182A3F080p+0, //1.61049033194925073076
                                         0x1.01C7C46B071F3p-48, //3.57742087137029902059e-15
                                         0x1.A5503B23E2540p+0, //1.64575547815395850648
                                         0x1.C8B424491CAF8p-48, //6.33803674368915982631e-15
                                         0x1.AE89F995AD380p+0, //1.68179283050741901206
                                         0x1.6AF439A68BB99p-47, //1.00739973218322238167e-14
                                         0x1.B7F76F2FB5E40p+0, //1.71861929812247637983
                                         0x1.BAA9EC206AD4Fp-50, //1.5357984302925880313e-15
                                         0x1.C199BDD855280p+0, //1.75625216037329323626
                                         0x1.C2220CB12A092p-48, //6.24685034485536557515e-15
                                         0x1.CB720DCEF9040p+0, //1.79470907500309806437
                                         0x1.48A81E5E8F4A5p-47, //9.12205626035419583226e-15
                                         0x1.D5818DCFBA480p+0, //1.83400808640934087634
                                         0x1.C976816BAD9B8p-50, //1.58714330671767538549e-15
                                         0x1.DFC97337B9B40p+0, //1.87416763411029307917
                                         0x1.EB968CAC39ED3p-48, //6.82215511854592947014e-15
                                         0x1.EA4AFA2A490C0p+0, //1.91520656139714162691
                                         0x1.9858F73A18F5Ep-48, //5.66696026748885461802e-15
                                         0x1.F50765B6E4540p+0, //1.95714412417540017941
                                         0x1.9D3E12DD8A18Bp-54 //8.9607677910366677676e-17
 };

static const double one = 1.0;
static const double mOne = -1.0;
static const double two = 2.0;
static const xSInt64 bias[2] = { {2045, 0},  {1023, 0} };
static const xUInt64 POWER_NAN = { 0x7FF8000000000025ULL, 0 };     //should be the same as nan("37")


static inline xDouble ipow( xDouble x, uint32_t u ) ALWAYS_INLINE;
static inline xDouble _pow( xDouble X, xDouble Y ) ALWAYS_INLINE;
 
static inline xDouble xscalb( xDouble x, int M )
{
    static const double scale[2] = { 0x1.0p1022, 0x1.0p-1022 };
    static const int    step[2] = { 1022, -1022 };
    int index = M >> 31;
    int count = abs(M);
    xSInt64 xm = _mm_cvtsi32_si128( M + 1023 );
    xSInt64 xstep = _mm_cvtsi32_si128( step[-index] ); 
    xDouble xscale = _mm_load_sd( scale - index );
        
    if( count > 1022 )
    {
        x = _mm_mul_sd( x, xscale );
        xm = _mm_sub_epi64( xm, xstep );
        count -= 1022;

        if( count > 1022 )
        {
            x = _mm_mul_sd( x, xscale );
            xm = _mm_sub_epi64( xm, xstep );
            count -= 1022;

            if( count > 1022 )
                return _mm_mul_sd( x, xscale );
        }
    }

    xm = _mm_slli_epi64( xm, 52 );
    return _mm_mul_sd( x, (xDouble) xm );
} 
 
 //The original source from vMathLib used recursion (yuck!) 
 //That was removed in favor of this more efficient loop
static inline xDouble ipow( xDouble x, uint32_t u )
{
    xDouble result;
    uint32_t mask = 1;

	if( 0 == u )
		return _mm_load_sd( &one );
	
	//skip trailing zeros
    while( u && 0 == (u & mask) )
    {
        //square x
        x = _mm_mul_sd( x,x );    

        //move up to the next mask
        mask += mask;
    }

	//this prevents an underflow from occurring for pow( tiny, 1 )
	result = x;

	//clear the bit in u (so we don't loop forever)
	u &= ~mask;

    while( u )
    {
        //square x
        x = _mm_mul_sd( x,x );    

        //move up to the next mask
        mask += mask;

        //if the current mask bit is set in u, multiply the result by x
        if( u & mask )
		{
            result = _mm_mul_sd( result, x );

			//clear the bit in u (so we don't loop forever)
			u &= ~mask;
		}
    }
 
    return result;
}

static const xUInt64 iOne = { 1, 0 };

 
static inline xDouble _pow( xDouble X, xDouble Y )
{
    //get old fp env, and set the default one
    int oldMXCSR = _mm_getcsr();
	int newMXCSR = (oldMXCSR | DEFAULT_MXCSR) & DEFAULT_MASK;		//set standard masks, enable denormals, set round to nearest
	if( newMXCSR != oldMXCSR )
		_mm_setcsr( newMXCSR );

    static const double tenM20 = 1e-20;
    static const double ten20 = 1e20;
    static const double d16 = 16.0;
    static const double d128 = 128.0;
    static const double r128 = 1.0/128.0;
    static const double r8 = 1.0/8.0;
    static const double smallestNormal = 0x1.0p-1022;


	//if y == 0 or x == 1, then the answer is always 1, even if the other argument is NaN 
	if( _mm_istrue_sd( _mm_or_pd( _mm_cmpeq_sdm( X, &one ), _mm_cmpeq_sdm( Y, (double*) &minusZeroD ) )) )
	{        
		X = _mm_load_sd( &one );
		if( newMXCSR != oldMXCSR )
			_mm_setcsr( oldMXCSR );
		return X;
	}

    //get NaN inputs out of the way
    if( _mm_istrue_sd( _mm_cmpunord_sd( X, Y ) ) )
    {
		if( newMXCSR != oldMXCSR )
			_mm_setcsr( oldMXCSR );
        return _mm_add_sd( X, Y ); 
    }

    xDouble fabsY = _mm_andnot_pd( minusZeroD, Y );
    xDouble fabsX = _mm_andnot_pd( minusZeroD, X );
	xDouble fabsyIsInf = _mm_cmpeq_sdm( fabsY, &plusinf );
    xDouble signPatch = _mm_setzero_pd();

	//detect if Y is integer, even or odd
	xDouble floorbias = _mm_load_sd( &T52 );
		floorbias = _mm_and_pd( floorbias, _mm_cmplt_sd( fabsY, floorbias ) ); 
    xDouble yShifted = _mm_add_sd( fabsY, floorbias);
    xDouble roundFabsY = _mm_sub_sd( yShifted, floorbias );
    xDouble yIsEven = (xDouble) _mm_sub_epi64( _mm_and_si128( (xUInt64) yShifted, iOne ), iOne );   
    xDouble yIsInt = _mm_cmpeq_sd( roundFabsY, fabsY);
    int intY = _mm_cvtsd_si32( Y );
	_mm_setcsr( newMXCSR );                                                     //Avoid setting the inexact flag
	yIsEven = _mm_or_pd( yIsEven, _mm_cmpge_sdm( fabsY, &T53 ) );				//|y| >= 2**53 is always even
	yIsInt = _mm_andnot_pd( fabsyIsInf,  yIsInt );


    //Patch up the case of negative X with large integer Y. We have to do it here, 
    //because recursion is not inlinable. 
	xDouble fabsxLTInf = _mm_cmplt_sdm( fabsX, &plusinf );
    if( _mm_istrue_sd( _mm_and_pd( _mm_cmplt_sdm( X, (double*) &minusZeroD ), fabsxLTInf )))     //X < 0
    {
        if( _mm_istrue_sd( yIsInt ) )
        {
            X = fabsX;                 //X = fabs(X)
            signPatch = _mm_andnot_pd( yIsEven, minusZeroD );   //flip the sign before exiting if y is an odd int

			//if x == -1, then the answer is always 1 or -1, unless NaN (removed above) 
			if( _mm_istrue_sd( _mm_cmpeq_sdm( X, &one )) )
			{        
				X = _mm_load_sd( &one );
				goto exit;
			}
        }
        else
        {
			if( _mm_istrue_sd( _mm_cmplt_sdm( fabsY, &plusinf ) ) )
			{
				X = (xDouble) POWER_NAN;
				oldMXCSR |= INVALID_FLAG;
				goto exit;
			}
        }
    }

    xDouble xGTzero = _mm_cmpgt_sdm( X, (double*) &minusZeroD ); 
    xDouble yLTzero = _mm_cmplt_sdm( Y, (double*) &minusZeroD ); 
    xDouble xEQzero = _mm_cmpeq_sdm( X, (double*) &minusZeroD );
        
    //More accurate, fast case for Y is a integer
    if( _mm_istrue_sd( _mm_andnot_pd( xEQzero, yIsInt)) && intY != 0x80000000 )
    {
		if(  intY < 0 )
		{
			_mm_setcsr( DEFAULT_MXCSR ); 
			xDouble recip = _mm_div_sd( _mm_load_sd( &one ), X );
			
			//if the reciprocal is exact, use ipow
			if( 0 == (_mm_getcsr() & INEXACT_FLAG ) )
			{
				X = ipow( recip, -intY );        
				oldMXCSR |= _mm_getcsr() & ALL_FLAGS;
				_mm_setcsr( oldMXCSR );
				X = _mm_xor_pd( X, signPatch );
				return X;
			}
			_mm_setcsr( newMXCSR );      
		}
		else
		{
			X = ipow( X, intY );        
			oldMXCSR |= _mm_getcsr() & ALL_FLAGS;
			_mm_setcsr( oldMXCSR );
			X = _mm_xor_pd( X, signPatch );
			return X;
		}
    }

    xDouble fabsyEQhalf = _mm_cmpeq_sdm( fabsY, &P1 );

    //sqrt, reciprocal sqrt
    if( _mm_istrue_sd( _mm_and_pd( fabsyEQhalf, xGTzero ) ) )
    {
        _mm_setcsr( oldMXCSR );
        X = _MM_SQRT_SD( X );
        if( _mm_istrue_sd( yLTzero ) )
            X = _mm_div_sd( _mm_load_sd( &one ), X );
        return X;
    }


    xDouble xLTinf =  _mm_cmplt_sdm( X, &plusinf );
    xDouble fabsyGT1em20 = _mm_cmpgt_sdm( fabsY, &tenM20 );
    xDouble fabsyLT1e20 = _mm_cmplt_sdm( fabsY, &ten20 );
    
    if( _mm_istrue_sd( _mm_and_pd(  _mm_and_pd( xGTzero, xLTinf ),                      //x > 0 && x < inf
                                    _mm_and_pd( fabsyGT1em20, fabsyLT1e20 ) ) ) )       //|y| > 1e-20 && |y| < 1e20
    {
        xDouble z1, z2, w1, w2;
        xDouble t1LTx = _mm_cmpgt_sdm( X, &T1 );
        xDouble xLTt2 = _mm_cmplt_sdm( X, &T2 );
        if( _mm_istrue_sd( _mm_and_pd( t1LTx, xLTt2 ) ) )
        {
			/* |X - 1| < 2^-6 */
			/* procedure Lsmall */
            xDouble xEQone = _mm_cmpeq_sdm( X, &one );
            if( _mm_istrue_sd( xEQone ) )
            {
                X = _mm_load_sd( &one );
                goto exit;
            }
            xDouble f = _mm_sub_sdm( X, &one );
            xDouble f1 = _mm_cvtss_sd( f, _mm_cvtsd_ss( (xFloat)f, f ));
            xDouble f2 = _mm_sub_sd( f, f1 );
            xDouble g = _mm_add_sdm( f, &two );
            g = _mm_div_sd( _mm_load_sd( &one ), g );
            xDouble u = _mm_mul_sd( f, g );
            u = _mm_add_sd( u, u );
            xDouble v = _mm_mul_sd( u, u );
            xDouble q = _mm_add_sdm( _mm_mul_sdm( v, &C5 ), &C4 );
            q = _mm_add_sdm( _mm_mul_sd( q, v ), &C3 );
            q = _mm_add_sdm( _mm_mul_sd( q, v ), &C2 );
            q = _mm_add_sdm( _mm_mul_sd( q, v ), &C1 );
            v = _mm_mul_sd( v, u );
            q = _mm_mul_sd( q, v );
        
            xDouble u1 = _mm_cvtss_sd( u, _mm_cvtsd_ss( (xFloat)u, u ));
            xDouble u2 = _mm_sub_sd( f, u1 );
            u2 = _mm_add_sd( u2, u2 );
            u2 = _mm_sub_sd( u2, _mm_mul_sd( u1, f1 ) );
            u2 = _mm_sub_sd( u2, _mm_mul_sd( u1, f2 ) );
            u2 = _mm_mul_sd( u2, g );
            z2 = _mm_add_sd( q, u2 );
            z1 = _mm_add_sd( u1, z2 );
            z1 = _mm_cvtss_sd( z1, _mm_cvtsd_ss( (xFloat)z1, z1 ));
            z2 = _mm_add_sd( z2, _mm_sub_sd( u1, z1 ));
        }
        else
        {
            //			x = mantissa(X, &m);  //  m = logb(X);  x = scalb(X, -m);
            //convert denormals to normals
            xDouble xOne = _mm_load_sd( &one );
            xDouble isDenormal = _mm_cmplt_sdm( fabsX, &smallestNormal );
            xDouble denormBias = _mm_and_pd( xOne, isDenormal );
            int isdenorm = _mm_cvtsi128_si32(  (xSInt64) isDenormal );
            X = _mm_or_pd( X, denormBias );
            X = _mm_sub_sd( X, denormBias );
    
            //calculate mantissa and exponent
            xDouble inf = _mm_load_sd( &plusinf );
            xDouble exponent = _mm_and_pd( X, inf);
            xDouble x = _mm_andnot_pd( inf, X );
            xSInt64 xi = _mm_srli_epi64( (xUInt64) exponent, 52 );
            x = _mm_or_pd( x, xOne );
            xi = _mm_sub_epi32( xi, bias[1 + isdenorm] );
            exponent = _mm_cvtepi32_pd( (xSInt32) xi );
            
            int j = _mm_cvttsd_si32( _mm_add_sdm( _mm_mul_sdm( x, &d128) , &P1 ));
            xDouble F = _mm_mul_sdm( _mm_cvtsi32_sd( X, j ), &r128 );
            xDouble g = _mm_div_sd( xOne, _mm_add_sd( F, x ) );
            xDouble f = _mm_sub_sd( x, F );
            xDouble a1 = _mm_add_sdm( _mm_mul_sdm( exponent, &logtable[128*2]), &logtable[(j-128)*2] );
            xDouble a2 = _mm_add_sdm( _mm_mul_sdm( exponent, &logtable[128*2]+1), &logtable[(j-128)*2+1] );
            xDouble u = _mm_mul_sd( f, g );
            u = _mm_add_sd( u, u );
            xDouble u1 = _mm_cvtss_sd( u, _mm_cvtsd_ss( (xFloat)u, u ) );
            xDouble v = _mm_mul_sd( u, u );
            xDouble c = _mm_mul_sd( Y, a1 );
            c = _mm_andnot_pd( minusZeroD, c );
            xDouble cLTsixteen = _mm_cmplt_sdm( c, &d16 );
            xDouble cLToneeighth = _mm_cmplt_sdm( c, &r8 );
            xDouble q, u2;
            if( _mm_istrue_sd( cLToneeighth ) )
            {
                //u2 = g * (2 * (f - u1 * F) - u1 * f);
                u2 = _mm_sub_sd( f, _mm_mul_sd( u1, F ) );
                u2 = _mm_add_sd( u2, u2 );
                u2 = _mm_sub_sd( u2, _mm_mul_sd( u1, f ) );
                u2 = _mm_mul_sd( u2, g );

                //q = u * (v * (B1 + v * B2));
                q = _mm_add_sdm( _mm_mul_sdm( v, &B2 ), &B1 );
                q = _mm_mul_sd( q, v );
                q = _mm_mul_sd( q, u );
            }
            else 
            {
                if( _mm_istrue_sd( cLTsixteen ) )
                {
                    //u2 = g * (2 * (f - u1 * F) - u1 * f);
                    u2 = _mm_sub_sd( f, _mm_mul_sd( u1, F ) );
                    u2 = _mm_add_sd( u2, u2 );
                    u2 = _mm_sub_sd( u2, _mm_mul_sd( u1, f ) );
                    u2 = _mm_mul_sd( u2, g );
                
                    //q = u * (v * (A1 + v * (A2 + v * A3)));
                    q = _mm_add_sdm( _mm_mul_sdm( v, &A3 ), &A2 );
                    q = _mm_add_sdm( _mm_mul_sd( q, v ), &A1 );
                    q = _mm_mul_sd( _mm_mul_sd( q, v ), u );
                }
                else
                {
                    xDouble f1 = _mm_cvtss_sd( f, _mm_cvtsd_ss( (xFloat) f, f ));
                    xDouble f2 = _mm_sub_sd( f, f1 );
                
                    //u2 = g * ((2 * (f - u1 * F) - u1 * f1) - u1 * f2);
                    u2 = _mm_sub_sd( f, _mm_mul_sd( u1, F ) );              //f - u1*f
                    u2 = _mm_add_sd( u2, u2 );                              //2*(f - u1*f)
                    u2 = _mm_sub_sd( u2, _mm_mul_sd( u1, f1 ) );            //2*(f - u1*f) - u1*f1
                    u2 = _mm_sub_sd( u2, _mm_mul_sd( u1, f2 ) );            //(2*(f - u1*f) - u1*f1) - u1*f2
                    u2 = _mm_mul_sd( u2, g );                               //g * ((2*(f - u1*f) - u1*f1) - u1*f2)

                    //q = u * (v * (A1 + v * (A2 + v * A3)));
                    q = _mm_add_sdm( _mm_mul_sdm( v, &A3 ), &A2 );
                    q = _mm_add_sdm( _mm_mul_sd( q, v ), &A1 );
                    q = _mm_mul_sd( _mm_mul_sd( q, v ), u );
                }
            }
        
            xDouble p = _mm_add_sd( u2, q );
            xDouble t = _mm_add_sd( a1, u1 );
            a2 = _mm_add_sd( a2, _mm_add_sd( _mm_sub_sd( a1, t), u1 ) );
            z2 = _mm_add_sd( p, a2 );
            z1 = _mm_add_sd( t, z2 );
            z1 = _mm_cvtss_sd( z1, _mm_cvtsd_ss( (xFloat) z1, z1 ));
            z2 = _mm_add_sd( z2, _mm_sub_sd( t, z1) );
        }
        
        /* Procedure M */
        {
            xDouble y1 = _mm_cvtss_sd( Y, _mm_cvtsd_ss( (xFloat) Y, Y )); 
            xDouble y2 = _mm_sub_sd( Y, y1 );
            w2 = _mm_add_sd( _mm_mul_sd( y2, z1 ), _mm_mul_sd( y2, z2 ));
            w2 = _mm_add_sd( w2, _mm_mul_sd( y1, z2 ) );
            w1 = _mm_mul_sd( y1, z1 ); 
        }

        //deal with overflow/underflow
        xDouble overflow = _mm_add_sd( w1, w2);
        xDouble underflow = _mm_cmplt_sdm( overflow, &Emin );
        overflow = _mm_cmpgt_sdm( overflow, &Emax );
        if( _mm_istrue_sd( _mm_or_pd( overflow, underflow ) ) )
        {
            int overflowFlag = _mm_cvtsi128_si32( (xUInt64) overflow ) & OVERFLOW_FLAG;
            int underflowFlag = _mm_cvtsi128_si32( (xUInt64) underflow ) & UNDERFLOW_FLAG;
            oldMXCSR |= overflowFlag | underflowFlag | INEXACT_FLAG;
            X = _mm_and_pd( _mm_load_sd( &plusinf ), overflow );
            goto exit;
        }

		/* Procedure E */
		{
            int N = _mm_cvtsd_si32( _mm_mul_sdm( w1, &Inv_L) ); 
            int j = N & 31;
            int M = N >> 5;
            xDouble dN = _mm_cvtsi32_sd( w1, N );
            xDouble r = _mm_sub_sd( w1, _mm_mul_sdm( dN, &L1 ) );
			r = _mm_add_sd( r, w2 );
            r = _mm_sub_sd( r, _mm_mul_sdm( dN, &L2 ) );
            //double p = r + r * (r * (P1 + r * (P2 + r * (P3 + r * (P4 + r * P5)))));
            xDouble p = _mm_add_sdm( _mm_mul_sdm( r, &P5 ), &P4 );
            p = _mm_add_sdm( _mm_mul_sd( p, r ), &P3 );
            p = _mm_add_sdm( _mm_mul_sd( p, r ), &P2 );
            p = _mm_add_sdm( _mm_mul_sd( p, r ), &P1 );
            p = _mm_add_sd( _mm_mul_sd( _mm_mul_sd( p, r ), r), r );
            //double S = exptable[j].lead + exptable[j].trail;
            xDouble S = _mm_add_sdm( _mm_load_sd( &exptable[ 2 * j ] ), &exptable[ 2 * j +1] );
            xDouble t = _mm_add_sdm( _mm_mul_sd( S, p ), &exptable[ 2 * j +1] );
            t = _mm_add_sdm( t, &exptable[ 2 * j ] );
            X  = xscalb(t, M);

            oldMXCSR |= _mm_getcsr() & ALL_FLAGS;
            goto exit;
		}
    }

    //Handle special cases
    

    xDouble yIsOddInt = _mm_andnot_pd( yIsEven, yIsInt );
    xDouble resultSign = _mm_and_pd( X, minusZeroD );

    //take care of the x == 0 cases
    if( _mm_istrue_sd( xEQzero ) )
    {
        //The x==1,NaN and y == 0, NaN cases have been weeded out above
        int div_zero_flag = _mm_cvtsi128_si32( (xSInt64) yLTzero ) & DIVIDE_0_FLAG;

        //result is Inf if y <0, otherwise result is 0
        X = _mm_and_pd( _mm_load_sd( &plusinf), yLTzero );      

        //only apply the sign only if y is a odd integer
        resultSign = _mm_and_pd( yIsOddInt, resultSign ); 
        X = _mm_or_pd( X, resultSign );
        
        oldMXCSR |= div_zero_flag;
        goto exit;
    }
    
    //take care of the |x| == inf cases
    if( _mm_istrue_sd( _mm_cmpeq_sdm( fabsX, &plusinf ) ) )
    {        
        //result is Inf if y > 0, otherwise result is 0
        X = _mm_andnot_pd( yLTzero, _mm_load_sd( &plusinf) );      

        //only apply the sign only if y is a odd integer
        resultSign = _mm_and_pd( yIsOddInt, resultSign ); 
        X = _mm_or_pd( X, resultSign );
    
        goto exit;
    }

    //take care of the |y| == inf cases
    if( _mm_istrue_sd( fabsyIsInf ) )
    {        
        xDouble fabsxGTone = _mm_cmpgt_sdm( fabsX, &one );
        xDouble isInf = _mm_xor_pd( yLTzero, fabsxGTone );
        xDouble isOne = _mm_cmpeq_sdm( X, &mOne );          // x == -1, |y| == inf returns 1
        X = _mm_and_pd( isInf, _mm_load_sd( &plusinf ) );
        X = _mm_sel_pd( X, _mm_load_sd( &one ), isOne );
        X = _mm_xor_pd( X, signPatch );

        goto exit;
    }


    //We have already handled the following cases:
    //  y = +Inf, -Inf, +0, -0, NaN,
    //  x = +Inf, -Inf, +0, -0, NaN,
    //
    //  x is any and y is a small integer
    //  x is negative and y is a large integer, |y| < 1e20   
    //  x positive finite and  |y| > 1e-20 && |y| < 1e20
    //  x is negative and y is not an integer
    //
    //  We have left:
    //      x is positive finite and |Y| is <= 1e-20
    //      x is positive finite and |Y| is >= 1e20
    //      x is negative finite and |Y| is >= 1e20 and an integer  (we set x = fabs(x) above in this case, |Y| > 1e20 is always even)
    //      x is negative finite and |Y| is <= 1e-20 and an integer (which never happens)
    //
    //  we can be sure that X and Y are not inf, -inf, NaN, 0, -0 at this point,
    //  since those cases are handled, therefore both X and Y are finite
    //
    //  The cases:
    //              y > 1e20    y < 1e-20   y< -1e20
    //  x > 1       inf oi      1.0 i       0.0 ui
    //  x < 1       0.0 ui      1.0 i       inf oi

    xDouble fabsxLTone = _mm_cmplt_sdm( fabsX, &one );
    xDouble underflow = _mm_xor_pd( fabsxLTone, yLTzero );
    xDouble overflow = _mm_andnot_pd( underflow, xLTinf );      //overflow = ~underflow
    xDouble fabsyLTone = _mm_cmplt_sdm( fabsY, &one );
    xDouble fabsxEQone = _mm_cmpeq_sdm( fabsX, &one );
    underflow = _mm_andnot_pd( fabsyLTone, underflow );
    overflow = _mm_andnot_pd( fabsyLTone, overflow );
    int overflowMask = _mm_cvtsi128_si32( (xUInt32) overflow ) & OVERFLOW_FLAG;
    int underflowMask = _mm_cvtsi128_si32( (xUInt32) underflow ) & UNDERFLOW_FLAG;
	int inexactMask = (~ _mm_cvtsi128_si32( (xUInt32) fabsxEQone )) & INEXACT_FLAG;
    X = _mm_and_pd( overflow, _mm_load_sd( &plusinf ) );
    X = _mm_sel_pd( X, _mm_load_sd( &one), fabsyLTone );
    oldMXCSR |= overflowMask | underflowMask | inexactMask;
    _mm_setcsr( oldMXCSR );
    return X;

exit:
    _mm_setcsr( oldMXCSR );
    return _mm_xor_pd( X, signPatch );
} 

double pow( double x, double y )
{
    xDouble xd = DOUBLE_2_XDOUBLE( x );
    xDouble yd = DOUBLE_2_XDOUBLE( y );
    xd = _pow( xd, yd );
    return XDOUBLE_2_DOUBLE( xd );
}

/* **************** OLD STUFF **************** */
#endif