this repo has no description
1/*
2 * pow.c
3 *
4 * by Jeff Kidder.
5 *
6 * Copyright (c) 2007, Apple Inc. All Rights Reserved.
7 *
8 * Implementation for C99 compliant float pow(double)
9 *
10 * Minimax polynomial by Ali Sazegari.
11 */
12
13#include <math.h>
14#include <float.h>
15#include "fenv.h"
16#include <stdint.h>
17//#include "required_arithmetic.h"
18
19#ifndef DEBUG
20 #define DEBUG 0
21#endif
22
23#if DEBUG
24 #include <stdio.h>
25#endif
26
27#ifndef ALWAYS_INLINE
28 #if DEBUG
29 #define ALWAYS_INLINE
30 #else
31 #define ALWAYS_INLINE __attribute__ ((always_inline))
32 #endif
33#endif
34
35#include "xmmLibm_prefix.h"
36
37#define AVOID_64_BIT_INTS defined(__i386__)
38
39//gcc logtable.c -o xlt -I./mpfr/include -L./mpfr/lib -lgmp -lmpfr -framework Accelerate -Wall && ./xlt
40typedef struct logdata_t {double hi; double lo; double inv; double lg1phi; double lg1plo; } logdata_t;
41
42static const int A_ORIGIN = 64;
43static const logdata_t A_LOOKUP[] = { //a{hi,lo}, va, lg1pa{hi,lo}: 1/va ~ 1+ahi+alo
44 {-0x1.fffffe7fffffap-3, 0x1.8000006p-79, 0x1.555555p+0, -0x1.a8ff95a6bc2f6p-2, -0x1.3d82406f24c25p-59}, // -64 * 0x1p-8 = -0x1p-2
45 {-0x1.f8000200a7ff5p-3, -0x1.720e0e2121555p-57, 0x1.539095p+0, -0x1.a152f32d1c481p-2, -0x1.e8bc9082edfep-58}, // -63 * 0x1p-8 = -0x1.f8p-3
46 {-0x1.f0000177dfffap-3, -0x1.3df00582ffdebp-57, 0x1.51d07fp+0, -0x1.99b0740f363dap-2, 0x1.0f9d162e39146p-56}, // -62 * 0x1p-8 = -0x1.fp-3
47 {-0x1.e7fffe8c47ffap-3, -0x1.db49fab940a0cp-57, 0x1.501501p+0, -0x1.9217ff324952cp-2, -0x1.cbbeaaa56a6a7p-56}, // -61 * 0x1p-8 = -0x1.e8p-3
48 {-0x1.dffffde4ffff4p-3, -0x1.adfff013cffa8p-57, 0x1.4e5e0ap+0, -0x1.8a897eb027b02p-2, 0x1.4f8714574779dp-57}, // -60 * 0x1p-8 = -0x1.ep-3
49 {-0x1.d7fffde23fff4p-3, -0x1.717fefff03fa8p-57, 0x1.4cab88p+0, -0x1.8304d7103dda3p-2, 0x1.98833591862b5p-56}, // -59 * 0x1p-8 = -0x1.d8p-3
50 {-0x1.cfffffe74p-3, 0x1.8c0000063p-61, 0x1.4afd6ap+0, -0x1.7b89f015dd637p-2, 0x1.1d4ce385cfbe7p-57}, // -58 * 0x1p-8 = -0x1.dp-3
51 {-0x1.c7fffee1efffdp-3, 0x1.b370049e3e20dp-58, 0x1.49539ep+0, -0x1.7418abe24a63dp-2, 0x1.fa37ab3d61feep-56}, // -57 * 0x1p-8 = -0x1.c8p-3
52 {-0x1.bffffda7ffff2p-3, 0x1.00005460001fap-59, 0x1.47ae14p+0, -0x1.6cb0f45c5ddccp-2, 0x1.de975927718f4p-57}, // -56 * 0x1p-8 = -0x1.cp-3
53 {-0x1.b7fffd8bdfff1p-3, 0x1.572017f608896p-57, 0x1.460cbcp+0, -0x1.6552b258722e2p-2, -0x1.2f241dca6fc3fp-56}, // -55 * 0x1p-8 = -0x1.b8p-3
54 {-0x1.affffe52bfff9p-3, 0x1.02800f24aa04p-58, 0x1.446f86p+0, -0x1.5dfdcd968123p-2, 0x1.efb9d089cf90ap-56}, // -54 * 0x1p-8 = -0x1.bp-3
55 {-0x1.a7fffe2a8fff8p-3, 0x1.ec9809ce63f2dp-57, 0x1.42d662p+0, -0x1.56b22cc04de54p-2, 0x1.c9bb0d879afd7p-57}, // -53 * 0x1p-8 = -0x1.a8p-3
56 {-0x1.9ffffeb47fffcp-3, 0x1.ab0006d6bc016p-58, 0x1.414141p+0, -0x1.4f6fba00d7b94p-2, -0x1.77a3d5b250693p-56}, // -52 * 0x1p-8 = -0x1.ap-3
57 {-0x1.98000019ap-3, 0x1.99fffff998p-61, 0x1.3fb014p+0, -0x1.48365e8072c0dp-2, 0x1.803dc35aa1904p-60}, // -51 * 0x1p-8 = -0x1.98p-3
58 {-0x1.900001017fffdp-3, -0x1.f100019257ffcp-57, 0x1.3e22ccp+0, -0x1.4106026313941p-2, 0x1.5bb94c1280f7bp-56}, // -50 * 0x1p-8 = -0x1.9p-3
59 {-0x1.87fffe88cfffbp-3, 0x1.403804d08cb11p-57, 0x1.3c995ap+0, -0x1.39de8cc6a56b9p-2, -0x1.c4556357fb55cp-56}, // -49 * 0x1p-8 = -0x1.88p-3
60 {-0x1.7ffffec7ffffcp-3, -0x1.5ffffd41ffff8p-57, 0x1.3b13b1p+0, -0x1.32bfed220f8dbp-2, 0x1.a7efa69babda9p-58}, // -48 * 0x1p-8 = -0x1.8p-3
61 {-0x1.7800014d17ffcp-3, 0x1.2de3f963db955p-58, 0x1.3991c3p+0, -0x1.2baa0d5b0d6cfp-2, 0x1.19d4b3cacb7eep-56}, // -47 * 0x1p-8 = -0x1.78p-3
62 {-0x1.6ffffed21fffdp-3, 0x1.8f90026fcbe07p-57, 0x1.381381p+0, -0x1.249cd1a7c821ap-2, -0x1.82633f48991dp-58}, // -46 * 0x1p-8 = -0x1.7p-3
63 {-0x1.67fffeafb7ffcp-3, 0x1.7f2c06ac55c55p-58, 0x1.3698dfp+0, -0x1.1d982b7703222p-2, 0x1.ef3e37d2edb56p-57}, // -45 * 0x1p-8 = -0x1.68p-3
64 {-0x1.600001a7ffff9p-3, -0x1.8000069ffffe6p-57, 0x1.3521dp+0, -0x1.169c06a7938bbp-2, 0x1.13c37a49fc23fp-56}, // -44 * 0x1p-8 = -0x1.6p-3
65 {-0x1.5800019cafffap-3, 0x1.f94ff3e59ea2fp-58, 0x1.33ae46p+0, -0x1.0fa8496a15078p-2, -0x1.557b896ea3a78p-56}, // -43 * 0x1p-8 = -0x1.58p-3
66 {-0x1.500002099fff6p-3, -0x1.1140306cbe714p-59, 0x1.323e35p+0, -0x1.08bce29b7e937p-2, 0x1.ff263e711169p-59}, // -42 * 0x1p-8 = -0x1.5p-3
67 {-0x1.47ffff948p-3, 0x1.ae00001aep-57, 0x1.30d19p+0, -0x1.01d9bb7350ffbp-2, 0x1.b68e9421e42b1p-58}, // -41 * 0x1p-8 = -0x1.48p-3
68 {-0x1.400000d7ffffep-3, -0x1.400000d7ffffep-57, 0x1.2f684cp+0, -0x1.f5fd8c01b8598p-3, -0x1.2af9dd21de84ap-57}, // -40 * 0x1p-8 = -0x1.4p-3
69 {-0x1.37ffffe4ep-3, 0x1.b2000006c8p-61, 0x1.2e025cp+0, -0x1.e857d3a536a7bp-3, -0x1.2ae5ac22439c5p-59}, // -39 * 0x1p-8 = -0x1.38p-3
70 {-0x1.300000e79fffep-3, -0x1.3cc00415ee7f7p-59, 0x1.2c9fb5p+0, -0x1.dac22ec6addadp-3, 0x1.237db4a7636b7p-58}, // -38 * 0x1p-8 = -0x1.3p-3
71 {-0x1.2800011897ffdp-3, -0x1.87d403993f0b7p-58, 0x1.2b404bp+0, -0x1.cd3c73066548p-3, -0x1.cf4b11e658fe5p-57}, // -37 * 0x1p-8 = -0x1.28p-3
72 {-0x1.200002417fff4p-3, -0x1.41001f16abf5dp-58, 0x1.29e413p+0, -0x1.bfc67e497d02cp-3, 0x1.5f07d9233af02p-57}, // -36 * 0x1p-8 = -0x1.2p-3
73 {-0x1.17ffff0e47ffep-3, 0x1.0c280484a978ap-59, 0x1.288b01p+0, -0x1.b2602303e0d2dp-3, -0x1.5b9ec49135187p-58}, // -35 * 0x1p-8 = -0x1.18p-3
74 {-0x1.100002d17ffeep-3, 0x1.46ffe23b280c1p-57, 0x1.27350cp+0, -0x1.a509500525022p-3, 0x1.7a9c418d8486p-58}, // -34 * 0x1p-8 = -0x1.1p-3
75 {-0x1.07ffffcf38p-3, 0x1.557800095648p-59, 0x1.25e227p+0, -0x1.97c1cac2fd722p-3, -0x1.49e502588505cp-57}, // -33 * 0x1p-8 = -0x1.08p-3
76 {-0x1.fffffe3fffffcp-4, -0x1.fffffe3fffffcp-58, 0x1.249249p+0, -0x1.8a897f3aa75ccp-3, 0x1.b366c85648a5ap-58}, // -32 * 0x1p-8 = -0x1p-3
77 {-0x1.f00005b67ffdbp-4, 0x1.11ff8750b031p-59, 0x1.234568p+0, -0x1.7d604e1d4e346p-3, 0x1.0ce3d95e5651ep-60}, // -31 * 0x1p-8 = -0x1.fp-4
78 {-0x1.dfffff1dfffffp-4, -0x1.dfffff1dfffffp-60, 0x1.21fb78p+0, -0x1.70460263cfbd2p-3, 0x1.9fe6887659803p-58}, // -30 * 0x1p-8 = -0x1.ep-4
79 {-0x1.d00002d38fff7p-4, 0x1.2d7f1a43efadcp-63, 0x1.20b471p+0, -0x1.633a8e40d66a7p-3, 0x1.8870b46556c8ap-57}, // -29 * 0x1p-8 = -0x1.dp-4
80 {-0x1.c00001c7ffffcp-4, -0x1.c00001c7ffffcp-58, 0x1.1f7048p+0, -0x1.563dc4114f416p-3, 0x1.ca52b9f12ee9fp-58}, // -28 * 0x1p-8 = -0x1.cp-4
81 {-0x1.b00003cd3fffp-4, 0x1.427fddaa56092p-59, 0x1.1e2ef4p+0, -0x1.494f894c616e5p-3, -0x1.9ae20a276fef6p-58}, // -27 * 0x1p-8 = -0x1.bp-4
82 {-0x1.a00001e8bfffcp-4, 0x1.d2ffeec1fa025p-61, 0x1.1cf06bp+0, -0x1.3c6fb7d937a2ap-3, -0x1.fabc7d482f61bp-57}, // -26 * 0x1p-8 = -0x1.ap-4
83 {-0x1.8fffffc64p-4, 0x1.ce00000738p-61, 0x1.1bb4a4p+0, -0x1.2f9e32a7954e4p-3, 0x1.11897da40f648p-59}, // -25 * 0x1p-8 = -0x1.9p-4
84 {-0x1.7fffff17fffffp-4, -0x1.7fffff17fffffp-60, 0x1.1a7b96p+0, -0x1.22dadb72090e4p-3, 0x1.f4461b11bb8dp-59}, // -24 * 0x1p-8 = -0x1.8p-4
85 {-0x1.6fffff8b8p-4, 0x1.d200000e9p-59, 0x1.194538p+0, -0x1.162592bc18896p-3, -0x1.889ff670a2c9ap-57}, // -23 * 0x1p-8 = -0x1.7p-4
86 {-0x1.5ffffebe3fffep-4, -0x1.165fff67ec3ffp-58, 0x1.181181p+0, -0x1.097e37d076533p-3, 0x1.0d672c7895724p-59}, // -22 * 0x1p-8 = -0x1.6p-4
87 {-0x1.500005ae0ffddp-4, 0x1.281793457ee21p-59, 0x1.16e069p+0, -0x1.f9c966af0bb0bp-4, -0x1.21ffac8a485cp-58}, // -21 * 0x1p-8 = -0x1.5p-4
88 {-0x1.40000076p-4, 0x1.d7fffff14p-59, 0x1.15b1e6p+0, -0x1.e0b1af47da109p-4, 0x1.9dab517f95157p-59}, // -20 * 0x1p-8 = -0x1.4p-4
89 {-0x1.300001ad8fffdp-4, 0x1.529ff4f9a3e14p-61, 0x1.1485f1p+0, -0x1.c7b52b547832ap-4, 0x1.6baa19b9f9395p-62}, // -19 * 0x1p-8 = -0x1.3p-4
90 {-0x1.1ffffef43ffffp-4, 0x1.69c000a96f801p-59, 0x1.135c81p+0, -0x1.aed3900be76fcp-4, 0x1.aa87b52ee52c3p-58}, // -18 * 0x1p-8 = -0x1.2p-4
91 {-0x1.0ffff994dffd4p-4, 0x1.03e097afaa813p-59, 0x1.12358ep+0, -0x1.960ca5af96cdp-4, -0x1.29c6aa0b462f4p-58}, // -17 * 0x1p-8 = -0x1.1p-4
92 {-0x1.fffffe1fffffep-5, -0x1.fffffe1fffffep-61, 0x1.111111p+0, -0x1.7d6047fba73e7p-4, 0x1.f3c7d0da33a2dp-58}, // -16 * 0x1p-8 = -0x1p-4
93 {-0x1.dffffe3c1fffep-5, -0x1.6177ff9cb608p-59, 0x1.0fef01p+0, -0x1.64ce256627e67p-4, -0x1.c92eb2b54a333p-59}, // -15 * 0x1p-8 = -0x1.ep-5
94 {-0x1.c00007537ffe4p-5, 0x1.8e3fe47f8c86bp-59, 0x1.0ecf57p+0, -0x1.4c56157db2425p-4, -0x1.072624d45947ep-58}, // -14 * 0x1p-8 = -0x1.cp-5
95 {-0x1.a0000d685ffa1p-5, -0x1.3b68a730c6ce3p-59, 0x1.0db20bp+0, -0x1.33f7d811b177p-4, -0x1.a92813604147cp-58}, // -13 * 0x1p-8 = -0x1.ap-5
96 {-0x1.8000007ap-5, 0x1.e7fffff86p-61, 0x1.0c9715p+0, -0x1.1bb32abc5a676p-4, -0x1.307117f313841p-58}, // -12 * 0x1p-8 = -0x1.8p-5
97 {-0x1.6000070edffe6p-5, 0x1.b67e801af0d88p-63, 0x1.0b7e6fp+0, -0x1.0387f50e8fdd9p-4, 0x1.e09f5e05261b8p-60}, // -11 * 0x1p-8 = -0x1.6p-5
98 {-0x1.40000a547ffc8p-5, -0x1.e7404a9c5066fp-59, 0x1.0a6811p+0, -0x1.d6ebe1744ab54p-5, 0x1.6169c1a187949p-61}, // -10 * 0x1p-8 = -0x1.4p-5
99 {-0x1.20000d067ffa8p-5, -0x1.420251782705ap-61, 0x1.0953f4p+0, -0x1.a6f9d6f1d16afp-5, 0x1.4703c3ec0059cp-59}, // -9 * 0x1p-8 = -0x1.2p-5
100 {-0x1.00000e87fff93p-5, -0x1.000cc587fa037p-63, 0x1.084211p+0, -0x1.7739624188772p-5, 0x1.e1e1fb7ea4b7p-60}, // -8 * 0x1p-8 = -0x1p-5
101 {-0x1.c00015a43ff88p-6, 0x1.868f5898382a3p-60, 0x1.073261p+0, -0x1.47aa174242a68p-5, -0x1.78a5b28f384fep-62}, // -7 * 0x1p-8 = -0x1.cp-6
102 {-0x1.7ffff4c4fffep-6, 0x1.26801734eb043p-60, 0x1.0624ddp+0, -0x1.184b8600b1067p-5, 0x1.f72dde81305e6p-59}, // -6 * 0x1p-8 = -0x1.8p-6
103 {-0x1.3fffe1d9bff18p-6, -0x1.cf9c851ec033fp-61, 0x1.05197fp+0, -0x1.d23acfec2e5e7p-6, -0x1.cc0694e8223dfp-62}, // -5 * 0x1p-8 = -0x1.4p-6
104 {-0x1.fffffe08p-7, 0x1.f8000007ep-61, 0x1.041041p+0, -0x1.743ee6f09edf1p-6, 0x1.1ac84c0953b8cp-61}, // -4 * 0x1p-8 = -0x1p-6
105 {-0x1.7fffd7f97ff35p-7, -0x1.7c5eff8c5a0eep-61, 0x1.03091bp+0, -0x1.16a200e9b243ap-6, -0x1.9e84c88c2a9fep-60}, // -3 * 0x1p-8 = -0x1.8p-7
106 {-0x1.fffff01fffffp-8, -0x1.fffff01fffffp-64, 0x1.020408p+0, -0x1.72c7ae96537f8p-7, -0x1.cf9a702ff830ep-62}, // -2 * 0x1p-8 = -0x1p-7
107 {-0x1.fffffe02p-9, 0x1.fe000001fep-65, 0x1.010101p+0, -0x1.720d9a9553bf9p-8, -0x1.bf85dcbd8a866p-62}, // -1 * 0x1p-8 = -0x1p-8
108 {0x0p+0, 0x0p+0, 0x1p+0, 0x0p+0, 0x0p+0}, // 0 * 0x1p-8 = 0x0p+0
109 {0x1.00000101p-8, 0x1.0100000101p-64, 0x1.fe01fep-1, 0x1.709c4848ff3ddp-8, -0x1.f86284455f0dfp-62}, // 1 * 0x1p-8 = 0x1p-8
110 {0x1.0000081000008p-7, 0x1.0000081000008p-63, 0x1.fc07fp-1, 0x1.6fe516f994381p-7, -0x1.7c1ff82f44adcp-61}, // 2 * 0x1p-8 = 0x1p-7
111 {0x1.7fffe7774004ap-7, 0x1.7a17c7a45e7ebp-61, 0x1.fa11cbp-1, 0x1.1362fffc7797cp-6, 0x1.f4876a1ea9f9bp-62}, // 3 * 0x1p-8 = 0x1.8p-7
112 {0x1.fffffdf800001p-7, -0x1.f80000082p-61, 0x1.f81f82p-1, 0x1.6e7966ead8ac5p-6, -0x1.cba91dae29988p-60}, // 4 * 0x1p-8 = 0x1p-6
113 {0x1.3ffff8fda000cp-6, 0x1.829fd69677d47p-63, 0x1.f6310bp-1, 0x1.c93631bd2c4b7p-6, 0x1.8575ca34d0306p-60}, // 5 * 0x1p-8 = 0x1.4p-6
114 {0x1.7ffffc6b00003p-6, 0x1.12fffea0f6001p-61, 0x1.f4465ap-1, 0x1.11cd1acadf723p-5, -0x1.efa68b88a0ae7p-64}, // 6 * 0x1p-8 = 0x1.8p-6
115 {0x1.c00008bb80013p-6, -0x1.c63ff624547ebp-60, 0x1.f25f64p-1, 0x1.3ed30f682c99bp-5, -0x1.8caa572b44451p-59}, // 7 * 0x1p-8 = 0x1.cp-6
116 {0x1.00000084p-5, 0x1.080000042p-60, 0x1.f07c1fp-1, 0x1.6bad38119a13ap-5, -0x1.0f9994f222757p-60}, // 8 * 0x1p-8 = 0x1p-5
117 {0x1.1ffff7b800021p-5, 0x1.ffff7b8000212p-61, 0x1.ee9c8p-1, 0x1.985bf0a9f1682p-5, 0x1.9d0544bf2b55bp-61}, // 9 * 0x1p-8 = 0x1.2p-5
118 {0x1.4000033f40005p-5, 0x1.2d4007ed6b40cp-61, 0x1.ecc07bp-1, 0x1.c4dfb012d2a7fp-5, -0x1.7579e1c86e5eap-59}, // 10 * 0x1p-8 = 0x1.4p-5
119 {0x1.5ffffa438001p-5, -0x1.cd0015b0c3fc4p-60, 0x1.eae808p-1, 0x1.f1389043d4afep-5, 0x1.b8b4ecc2bd1ecp-61}, // 11 * 0x1p-8 = 0x1.6p-5
120 {0x1.7ffffb8d00009p-5, 0x1.d17ffafa2d00bp-59, 0x1.e9131bp-1, 0x1.0eb386e9567e7p-4, -0x1.b18d168d9858dp-62}, // 12 * 0x1p-8 = 0x1.8p-5
121 {0x1.a000062c60012p-5, 0x1.12d01aa27434ep-60, 0x1.e741aap-1, 0x1.24b5bc1e1dbfcp-4, -0x1.a2efa461c33cfp-61}, // 13 * 0x1p-8 = 0x1.ap-5
122 {0x1.bffff838c001dp-5, -0x1.45101a711549ep-59, 0x1.e573adp-1, 0x1.3aa2f88097a88p-4, -0x1.a5adebc35ec9cp-58}, // 14 * 0x1p-8 = 0x1.cp-5
123 {0x1.dffff91e80016p-5, 0x1.737fedd48a03bp-59, 0x1.e3a918p-1, 0x1.507b7eafe13b6p-4, -0x1.67c359d084bc1p-58}, // 15 * 0x1p-8 = 0x1.ep-5
124 {0x1.fffffde000002p-5, 0x1.fffffde000002p-61, 0x1.e1e1e2p-1, 0x1.663f6e3b3cbb2p-4, 0x1.3e721192791a3p-61}, // 16 * 0x1p-8 = 0x1p-4
125 {0x1.0ffffeddf0001p-4, 0x1.a187ff5c45f81p-59, 0x1.e01e02p-1, 0x1.7beee7e3206a7p-4, -0x1.c6054c190ee99p-58}, // 17 * 0x1p-8 = 0x1.1p-4
126 {0x1.2000024640005p-4, -0x1.55bffadd637f5p-59, 0x1.de5d6ep-1, 0x1.918a19f536b15p-4, -0x1.336be543a9993p-60}, // 18 * 0x1p-8 = 0x1.2p-4
127 {0x1.2ffffe0d90004p-4, -0x1.e25401995c7bdp-58, 0x1.dca01ep-1, 0x1.a7111b55df32fp-4, -0x1.4f1d83f3e7e8cp-60}, // 19 * 0x1p-8 = 0x1.3p-4
128 {0x1.400003e88000ep-4, 0x1.568019ad9905dp-59, 0x1.dae607p-1, 0x1.bc842945ace93p-4, -0x1.8fd5b9a815711p-58}, // 20 * 0x1p-8 = 0x1.4p-4
129 {0x1.500001d370003p-4, 0x1.4cd0053319f09p-60, 0x1.d92f22p-1, 0x1.d1e350a4f6b57p-4, 0x1.45508587ec271p-60}, // 21 * 0x1p-8 = 0x1.5p-4
130 {0x1.600002c860007p-4, 0x1.0bb00922df317p-59, 0x1.d77b65p-1, 0x1.e72ec4ca62caap-4, 0x1.8d32ff20ce97bp-60}, // 22 * 0x1p-8 = 0x1.6p-4
131 {0x1.70000045cp-4, 0x1.170000045cp-60, 0x1.d5cac8p-1, 0x1.fc66a14d0527ep-4, -0x1.9476863d87a59p-60}, // 23 * 0x1p-8 = 0x1.7p-4
132 {0x1.7ffffe5c00002p-4, 0x1.d7ffff13c0001p-58, 0x1.d41d42p-1, 0x1.08c587b8a8459p-3, -0x1.eaebfe80f652ap-57}, // 24 * 0x1p-8 = 0x1.8p-4
133 {0x1.90000266b0005p-4, 0x1.028402df580c6p-58, 0x1.d272cap-1, 0x1.134e1cdc84c46p-3, 0x1.8280d2b9d2e4ep-57}, // 25 * 0x1p-8 = 0x1.9p-4
134 {0x1.9fffffa7ep-4, 0x1.b89ffff764ep-60, 0x1.d0cb59p-1, 0x1.1dcd193b9d854p-3, -0x1.9c8f4e7f2e39fp-57}, // 26 * 0x1p-8 = 0x1.ap-4
135 {0x1.affffdb850005p-4, -0x1.3094026cbcebbp-58, 0x1.cf26e6p-1, 0x1.284293339b4a1p-3, -0x1.f513c53ec0906p-58}, // 27 * 0x1p-8 = 0x1.bp-4
136 {0x1.bffffbb380011p-4, -0x1.5e4010232c7c1p-58, 0x1.cd8569p-1, 0x1.32ae9b5bf73ccp-3, -0x1.ea3729015b5c1p-57}, // 28 * 0x1p-8 = 0x1.cp-4
137 {0x1.d00003b8f800cp-4, 0x1.c9f50a67b4b5bp-58, 0x1.cbe6d9p-1, 0x1.3d11494321dc5p-3, 0x1.d20de6a527ce2p-59}, // 29 * 0x1p-8 = 0x1.dp-4
138 {0x1.e000035a0000ap-4, 0x1.c0003c54000b5p-61, 0x1.ca4b3p-1, 0x1.476aa1c23e268p-3, 0x1.8bdb8834b12ffp-58}, // 30 * 0x1p-8 = 0x1.ep-4
139 {0x1.effffcd8d0009p-4, -0x1.0e480c787d55dp-59, 0x1.c8b266p-1, 0x1.51bab70047027p-3, -0x1.1117308935bc2p-58}, // 31 * 0x1p-8 = 0x1.fp-4
140 {0x1.fffffdc000004p-4, 0x1.fffffdc000004p-58, 0x1.c71c72p-1, 0x1.5c01a22e68f24p-3, -0x1.a8e7cd17ca46cp-59}, // 32 * 0x1p-8 = 0x1p-3
141 {0x1.08000055ccp-3, 0x1.9789000f1f958p-58, 0x1.c5894dp-1, 0x1.663f701a36449p-3, -0x1.66ef1d80ba98cp-57}, // 33 * 0x1p-8 = 0x1.08p-3
142 {0x1.1000009100001p-3, -0x1.bbffffdbcp-57, 0x1.c3f8fp-1, 0x1.70742e079a632p-3, 0x1.bd6b99f1a542fp-59}, // 34 * 0x1p-8 = 0x1.1p-3
143 {0x1.17fffdcc30009p-3, -0x1.dce808447fcep-57, 0x1.c26b54p-1, 0x1.7a9fe9b17239p-3, 0x1.5e7a42808635dp-57}, // 35 * 0x1p-8 = 0x1.18p-3
144 {0x1.2000012400002p-3, 0x1.2000012400002p-57, 0x1.c0e07p-1, 0x1.84c2be7444b1ap-3, -0x1.95599ba086466p-57}, // 36 * 0x1p-8 = 0x1.2p-3
145 {0x1.27ffff8464p-3, 0x1.a12e7fea000c4p-57, 0x1.bf583fp-1, 0x1.8edcade78314dp-3, 0x1.24b65cd1dd74dp-57}, // 37 * 0x1p-8 = 0x1.28p-3
146 {0x1.2ffffde1f0008p-3, -0x1.89280e6563c4bp-58, 0x1.bdd2b9p-1, 0x1.98edcdcef3541p-3, 0x1.890aa22cbe631p-57}, // 38 * 0x1p-8 = 0x1.3p-3
147 {0x1.380001d628006p-3, -0x1.2b03f6ab91ca2p-58, 0x1.bc4fd6p-1, 0x1.a2f6347eaa238p-3, -0x1.3947af6cfd995p-57}, // 39 * 0x1p-8 = 0x1.38p-3
148 {0x1.4000019700004p-3, 0x1.7d0003017c008p-57, 0x1.bacf91p-1, 0x1.acf5e4d722ec2p-3, -0x1.d0389e7ca40dcp-58}, // 40 * 0x1p-8 = 0x1.4p-3
149 {0x1.47fffe59b4005p-3, -0x1.3c5f8355c5063p-57, 0x1.b951e3p-1, 0x1.b6ecef68d5468p-3, 0x1.f2fa768fd19b9p-57}, // 41 * 0x1p-8 = 0x1.48p-3
150 {0x1.4fffff45c0001p-3, -0x1.7300012303fffp-59, 0x1.b7d6c4p-1, 0x1.c0db6bf6c015p-3, -0x1.a829cc1512df9p-57}, // 42 * 0x1p-8 = 0x1.5p-3
151 {0x1.5800014708003p-3, -0x1.a4f3fcf18d5b9p-58, 0x1.b65e2ep-1, 0x1.cac1655b653e1p-3, -0x1.f429423a6ef0ap-61}, // 43 * 0x1p-8 = 0x1.58p-3
152 {0x1.600001af40005p-3, -0x1.413ff909b97ecp-58, 0x1.b4e81bp-1, 0x1.d49ee6d60f014p-3, 0x1.95845c18cb6e6p-58}, // 44 * 0x1p-8 = 0x1.6p-3
153 {0x1.67fffe37cc005p-3, 0x1.9b767be80c0d8p-57, 0x1.b37485p-1, 0x1.de73fc0b507ddp-3, -0x1.1e79902c3d7fap-58}, // 45 * 0x1p-8 = 0x1.68p-3
154 {0x1.70000025cp-3, 0x1.2e000004b8p-60, 0x1.b20364p-1, 0x1.e840bea311339p-3, 0x1.cbfe95c59cb8ap-57}, // 46 * 0x1p-8 = 0x1.7p-3
155 {0x1.780000a5b4001p-3, -0x1.2b0c7fce715acp-57, 0x1.b094b3p-1, 0x1.f205345c03233p-3, 0x1.36b400859e299p-60}, // 47 * 0x1p-8 = 0x1.78p-3
156 {0x1.7ffffed000002p-3, 0x1.7ffffed000002p-57, 0x1.af286cp-1, 0x1.fbc16a1ed20a6p-3, 0x1.a5e946d48367ep-57}, // 48 * 0x1p-8 = 0x1.8p-3
157 {0x1.87ffffd9ep-3, 0x1.30fffffb3cp-60, 0x1.adbe88p-1, 0x1.02baba0dbb1edp-2, 0x1.ad0869df3855cp-56}, // 49 * 0x1p-8 = 0x1.88p-3
158 {0x1.8ffffe21e0006p-3, -0x1.4ee0091e983e4p-58, 0x1.ac5702p-1, 0x1.0790ac9a79044p-2, 0x1.3ee2f0e46be64p-57}, // 50 * 0x1p-8 = 0x1.9p-3
159 {0x1.97ffffd4d4p-3, 0x1.848bfff92b8ap-60, 0x1.aaf1d3p-1, 0x1.0c62973b4ab8ap-2, -0x1.d1b4e1b85f444p-56}, // 51 * 0x1p-8 = 0x1.98p-3
160 {0x1.a00000268p-3, 0x1.34000004dp-60, 0x1.a98ef6p-1, 0x1.11307dc445fecp-2, 0x1.05224944efccp-57}, // 52 * 0x1p-8 = 0x1.ap-3
161 {0x1.a800006f0cp-3, 0x1.3f42800e577ccp-57, 0x1.a82e65p-1, 0x1.15fa67ae0dbd4p-2, -0x1.835b07373839fp-56}, // 53 * 0x1p-8 = 0x1.a8p-3
162 {0x1.b000027f6000ap-3, 0x1.35b00a9fd762cp-57, 0x1.a6d01ap-1, 0x1.1ac05ca5fe214p-2, -0x1.1c2140fbe02dbp-56}, // 54 * 0x1p-8 = 0x1.bp-3
163 {0x1.b80002bbc000cp-3, 0x1.33800dd67c03ep-57, 0x1.a5741p-1, 0x1.1f82610d07e69p-2, -0x1.7119b483d65e3p-56}, // 55 * 0x1p-8 = 0x1.b8p-3
164 {0x1.bffffdde00007p-3, 0x1.dbfff977e0017p-57, 0x1.a41a42p-1, 0x1.2440796db68c3p-2, 0x1.8de37e9a6110bp-57}, // 56 * 0x1p-8 = 0x1.cp-3
165 {0x1.c80002e76000ep-3, -0x1.a7bfdf3dccf64p-58, 0x1.a2c2a8p-1, 0x1.28fab511c6b5p-2, -0x1.9ec26959b16eep-56}, // 57 * 0x1p-8 = 0x1.c8p-3
166 {0x1.cffffd8c0000ap-3, -0x1.8000139ffffb2p-58, 0x1.a16d4p-1, 0x1.2db10e538534dp-2, 0x1.31cb428346b53p-57}, // 58 * 0x1p-8 = 0x1.dp-3
167 {0x1.d7fffdbb38008p-3, 0x1.7685f849af1fcp-57, 0x1.a01a02p-1, 0x1.326394e238a67p-2, -0x1.abc179fe7b4a3p-57}, // 59 * 0x1p-8 = 0x1.d8p-3
168 {0x1.e00001edc0006p-3, 0x1.be004b571c0ebp-61, 0x1.9ec8e9p-1, 0x1.37124e0ad6db6p-2, -0x1.66636d9999ce2p-56}, // 60 * 0x1p-8 = 0x1.ep-3
169 {0x1.e80002d81c00dp-3, 0x1.0c0a3c04f4f04p-59, 0x1.9d79f1p-1, 0x1.3bbd3bb244cfdp-2, -0x1.b12bb7a1584cdp-56}, // 61 * 0x1p-8 = 0x1.e8p-3
170 {0x1.efffff92bp-3, 0x1.2c9bfff3154cp-57, 0x1.9c2d15p-1, 0x1.4064637235c04p-2, 0x1.405468a8fd423p-57}, // 62 * 0x1p-8 = 0x1.fp-3
171 {0x1.f7fffdccc4008p-3, -0x1.d8a10db7b0748p-58, 0x1.9ae24fp-1, 0x1.4507cea7c86bfp-2, -0x1.ef9753db3d35cp-56}, // 63 * 0x1p-8 = 0x1.f8p-3
172 {0x1.fffffd800000ap-3, -0x1.3fffffbp-78, 0x1.99999ap-1, 0x1.49a7834b7d429p-2, -0x1.2a4397d8912bap-56}, // 64 * 0x1p-8 = 0x1p-2
173 {0x1.03ffff851e001p-2, -0x1.0f57c048081a2p-56, 0x1.9852f1p-1, 0x1.4e4387812d616p-2, -0x1.4aada8ecbe851p-56}, // 65 * 0x1p-8 = 0x1.04p-2
174 {0x1.07fffe6d80008p-2, -0x1.1c0013a73ff9ep-57, 0x1.970e5p-1, 0x1.52dbddf71fd7ap-2, -0x1.d9b1af94a58afp-56}, // 66 * 0x1p-8 = 0x1.08p-2
175 {0x1.0bffff2e8e002p-2, 0x1.f3fafa7ef2d06p-58, 0x1.95cbb1p-1, 0x1.577090c3bac8p-2, 0x1.35997fa38deabp-56}, // 67 * 0x1p-8 = 0x1.0cp-2
176 {0x1.0fffff5e00001p-2, 0x1.0fffff5e00001p-56, 0x1.948b1p-1, 0x1.5c01a2e7132d6p-2, -0x1.ebb9c6fdca778p-57}, // 68 * 0x1p-8 = 0x1.1p-2
177 {0x1.13ffffebbp-2, 0x1.44fffffaecp-60, 0x1.934c68p-1, 0x1.608f1b2b7f437p-2, 0x1.1c6a1e011a9d3p-56}, // 69 * 0x1p-8 = 0x1.14p-2
178 {0x1.17fffebf18005p-2, -0x1.06e8136f4ce33p-58, 0x1.920fb5p-1, 0x1.6518fcdae8962p-2, 0x1.a0f56285014a5p-58}, // 70 * 0x1p-8 = 0x1.18p-2
179 {0x1.1c000068be001p-2, -0x1.e7323fd503862p-56, 0x1.90d4f1p-1, 0x1.699f52bf1a597p-2, 0x1.c7e9aa36e3377p-58}, // 71 * 0x1p-8 = 0x1.1cp-2
180 {0x1.1fffffeb8p-2, 0x1.47fffffaep-60, 0x1.8f9c19p-1, 0x1.6e221cc2bb868p-2, 0x1.edf2c59ace244p-60}, // 72 * 0x1p-8 = 0x1.2p-2
181 {0x1.23fffef4b0003p-2, 0x1.930ffd3e20c09p-56, 0x1.8e6528p-1, 0x1.72a16250a7782p-2, 0x1.21efbc62ffae4p-56}, // 73 * 0x1p-8 = 0x1.24p-2
182 {0x1.27ffff6a78001p-2, 0x1.e0cffc2988707p-59, 0x1.8d3019p-1, 0x1.771d2b00956e3p-2, -0x1.6e767d0931aecp-56}, // 74 * 0x1p-8 = 0x1.28p-2
183 {0x1.2c000014bp-2, 0x1.4b0000052cp-60, 0x1.8bfce8p-1, 0x1.7b957adc2ff3bp-2, -0x1.4c06dd77b651ap-56}, // 75 * 0x1p-8 = 0x1.2cp-2
184 {0x1.2fffffe0ep-2, 0x1.757ffff73fp-59, 0x1.8acb91p-1, 0x1.800a560ec1da3p-2, -0x1.0b9e56cf905cep-56}, // 76 * 0x1p-8 = 0x1.3p-2
185 {0x1.3400014532005p-2, -0x1.3695d93bd3959p-59, 0x1.899c0fp-1, 0x1.847bc4a632949p-2, 0x1.52bd8b4db8954p-56}, // 77 * 0x1p-8 = 0x1.34p-2
186 {0x1.3800002488p-2, 0x1.ff70000dfc1p-59, 0x1.886e5fp-1, 0x1.88e9c756705f5p-2, -0x1.06c488ef0896dp-56}, // 78 * 0x1p-8 = 0x1.38p-2
187 {0x1.3bffff4e08001p-2, 0x1.e8bbff3717082p-56, 0x1.87427cp-1, 0x1.8d54667727585p-2, -0x1.0da1847e392aap-56}, // 79 * 0x1p-8 = 0x1.3cp-2
188 {0x1.3ffffe5c00008p-2, 0x1.9fffeb7e00067p-57, 0x1.861862p-1, 0x1.91bba6c447dcfp-2, -0x1.fc48be2eed2eap-57}, // 80 * 0x1p-8 = 0x1.4p-2
189 {0x1.44000088e8001p-2, -0x1.0c37ff4b3daffp-57, 0x1.84f00cp-1, 0x1.961f90e87e59dp-2, 0x1.0459ae579f766p-57}, // 81 * 0x1p-8 = 0x1.44p-2
190 {0x1.47fffed840004p-2, 0x1.63ffe3b220063p-59, 0x1.83c978p-1, 0x1.9a80224eb84b9p-2, -0x1.bcddc6a14952cp-58}, // 82 * 0x1p-8 = 0x1.48p-2
191 {0x1.4c000054cp-2, 0x1.530000153p-56, 0x1.82a4ap-1, 0x1.9edd67b6077b9p-2, 0x1.e66b4be819a59p-62}, // 83 * 0x1p-8 = 0x1.4cp-2
192 {0x1.4ffffe41c0009p-2, 0x1.367fe7fa1e07ep-57, 0x1.818182p-1, 0x1.a3375ec3372a1p-2, -0x1.995570a48531ep-57}, // 84 * 0x1p-8 = 0x1.5p-2
193 {0x1.540000155p-2, 0x1.5500000554p-60, 0x1.806018p-1, 0x1.a78e14869136bp-2, -0x1.5f8c8621ab322p-56}, // 85 * 0x1p-8 = 0x1.54p-2
194 {0x1.57ffff5500001p-2, 0x1.57ffff5500001p-56, 0x1.7f406p-1, 0x1.abe186df47b97p-2, 0x1.234b98e55c106p-60}, // 86 * 0x1p-8 = 0x1.58p-2
195 {0x1.5c00004db6p-2, 0x1.19b3c00ff4ae6p-56, 0x1.7e2255p-1, 0x1.b031bf51b3661p-2, 0x1.e098e06ca2c7fp-56}, // 87 * 0x1p-8 = 0x1.5cp-2
196 {0x1.60000056p-2, 0x1.580000158p-56, 0x1.7d05f4p-1, 0x1.b47ebfcfdd47ap-2, 0x1.d1fbd4b1ef502p-58}, // 88 * 0x1p-8 = 0x1.6p-2
197 {0x1.6400007eae001p-2, -0x1.17c1bfbbae492p-56, 0x1.7beb39p-1, 0x1.b8c88e47256b1p-2, 0x1.063a29db687f8p-57}, // 89 * 0x1p-8 = 0x1.64p-2
198 {0x1.67fffe5fb8008p-2, -0x1.652c12d491be5p-57, 0x1.7ad221p-1, 0x1.bd0f2ce21f64fp-2, 0x1.0111bb25b7302p-57}, // 90 * 0x1p-8 = 0x1.68p-2
199 {0x1.6bffff03e2003p-2, -0x1.1a468428ba31p-57, 0x1.79baa7p-1, 0x1.c152a5b5f5508p-2, -0x1.dc436fa3a276ep-57}, // 91 * 0x1p-8 = 0x1.6cp-2
200 {0x1.70000057p-2, 0x1.5c000015cp-56, 0x1.78a4c8p-1, 0x1.c592fb2eead3p-2, -0x1.0eb98c5df43eap-59}, // 92 * 0x1p-8 = 0x1.7p-2
201 {0x1.7400005f6ep-2, 0x1.a181401c8a55ep-56, 0x1.779081p-1, 0x1.c9d02fd1a193ap-2, -0x1.2d7ff6376746bp-56}, // 93 * 0x1p-8 = 0x1.74p-2
202 {0x1.780000fb90003p-2, -0x1.660ffbf056df4p-57, 0x1.767dcep-1, 0x1.ce0a4a2d1a3cfp-2, -0x1.c50ac20cc5c35p-62}, // 94 * 0x1p-8 = 0x1.78p-2
203 {0x1.7c000078a8001p-2, -0x1.6863ffc6f898p-56, 0x1.756cacp-1, 0x1.d2414cffb4308p-2, 0x1.c14cf0a11cb4dp-56}, // 95 * 0x1p-8 = 0x1.7cp-2
204 {0x1.8000010800003p-2, 0x1.800009480001cp-58, 0x1.745d17p-1, 0x1.d6753f182df9cp-2, 0x1.f98007f0a5227p-56}, // 96 * 0x1p-8 = 0x1.8p-2
205 {0x1.8400013fe8005p-2, -0x1.e15bfbe50ed71p-56, 0x1.734f0cp-1, 0x1.daa6236f1986fp-2, 0x1.e7a7aa5b58758p-59}, // 97 * 0x1p-8 = 0x1.84p-2
206 {0x1.87ffffd3cp-2, 0x1.61fffff4fp-58, 0x1.724288p-1, 0x1.ded3fd15f8d6p-2, -0x1.2caa8abe0356cp-56}, // 98 * 0x1p-8 = 0x1.88p-2
207 {0x1.8bffff6d02001p-2, -0x1.916a03267286bp-59, 0x1.713787p-1, 0x1.e2fed337aa309p-2, -0x1.5db766d2b662ap-56}, // 99 * 0x1p-8 = 0x1.8cp-2
208 {0x1.8fffff0b40003p-2, -0x1.7bc001cebaffbp-56, 0x1.702e06p-1, 0x1.e726a9208b3bep-2, -0x1.23b4c757e83b3p-57}, // 100 * 0x1p-8 = 0x1.9p-2
209 {0x1.940001b04e008p-2, 0x1.6fce93cf5909cp-57, 0x1.6f2601p-1, 0x1.eb4b863c52047p-2, 0x1.1bc6713d1d5cdp-58}, // 101 * 0x1p-8 = 0x1.94p-2
210 {0x1.97fffed788004p-2, -0x1.4f94065a865abp-57, 0x1.6e1f77p-1, 0x1.ef6d6600b4303p-2, -0x1.416600fbb0053p-56}, // 102 * 0x1p-8 = 0x1.98p-2
211 {0x1.9c0001997c007p-2, 0x1.31170852ff916p-56, 0x1.6d1a62p-1, 0x1.f38c582110ab4p-2, -0x1.0b8ee83775524p-59}, // 103 * 0x1p-8 = 0x1.9cp-2
212 {0x1.a00001ab80008p-2, -0x1.15ffda5287f4dp-58, 0x1.6c16c1p-1, 0x1.f7a8584344b9bp-2, 0x1.b27adfaae2d4ap-61}, // 104 * 0x1p-8 = 0x1.ap-2
213 {0x1.a3fffeaabe005p-2, 0x1.4c31d9e17e38p-59, 0x1.6b1491p-1, 0x1.fbc16a3304a8fp-2, 0x1.49b0116ffdab6p-58}, // 105 * 0x1p-8 = 0x1.a4p-2
214 {0x1.a8000054d8p-2, 0x1.3e2a0012a476p-56, 0x1.6a13cdp-1, 0x1.ffd799fecfc57p-2, -0x1.9db596f39084cp-56}, // 106 * 0x1p-8 = 0x1.a8p-2
215 {0x1.abfffea058005p-2, 0x1.4aabfad7ea594p-56, 0x1.691474p-1, 0x1.01f571c44164cp-1, 0x1.2eeb40ee79da5p-55}, // 107 * 0x1p-8 = 0x1.acp-2
216 {0x1.b00001a4e0008p-2, -0x1.95cff7354e1d7p-56, 0x1.681681p-1, 0x1.03fda98efe6c8p-1, -0x1.8603949cae8fp-55}, // 108 * 0x1p-8 = 0x1.bp-2
217 {0x1.b4000186aa007p-2, -0x1.dde0b901dea18p-56, 0x1.6719f3p-1, 0x1.06047264cb1e9p-1, 0x1.3f3fe82b9480ap-58}, // 109 * 0x1p-8 = 0x1.b4p-2
218 {0x1.b7fffe8c48006p-2, -0x1.9e4817f6cfb1fp-58, 0x1.661ec7p-1, 0x1.0809ce6c6a1fdp-1, 0x1.bce3988585c83p-55}, // 110 * 0x1p-8 = 0x1.b8p-2
219 {0x1.bc00015810005p-2, 0x1.478025ccc208ep-59, 0x1.6524f8p-1, 0x1.0a0dc3fcadb74p-1, 0x1.c438c2e4a4e9fp-55}, // 111 * 0x1p-8 = 0x1.bcp-2
220 {0x1.bffffe3400009p-2, -0x1.0000b3afffc7ep-60, 0x1.642c86p-1, 0x1.0c104f268ee09p-1, 0x1.7991c3b3db30ap-55}, // 112 * 0x1p-8 = 0x1.cp-2
221 {0x1.c3fffe102800ap-2, 0x1.a4a3f202b0ecbp-56, 0x1.63356cp-1, 0x1.0e11765cb301cp-1, -0x1.2aaa537074de6p-55}, // 113 * 0x1p-8 = 0x1.c4p-2
222 {0x1.c80001d448009p-2, 0x1.0ab20bb86255bp-56, 0x1.623fa7p-1, 0x1.10113bfef401bp-1, -0x1.7e0f121061ab1p-56}, // 114 * 0x1p-8 = 0x1.c8p-2
223 {0x1.cbfffdf36200cp-2, -0x1.a28950640a751p-56, 0x1.614b37p-1, 0x1.120f9c34c0c9p-1, -0x1.dfe1162f7b692p-55}, // 115 * 0x1p-8 = 0x1.ccp-2
224 {0x1.d00000174p-2, 0x1.74000005dp-60, 0x1.605816p-1, 0x1.140c9fb5a8f7fp-1, -0x1.b8e77375e280ep-56}, // 116 * 0x1p-8 = 0x1.dp-2
225 {0x1.d400011aaa003p-2, 0x1.634d428950232p-56, 0x1.5f6643p-1, 0x1.160844d54f014p-1, 0x1.8905ac4825bc1p-56}, // 117 * 0x1p-8 = 0x1.d4p-2
226 {0x1.d7fffe152000ap-2, 0x1.117fcb2642115p-58, 0x1.5e75bcp-1, 0x1.18028c04ca092p-1, 0x1.9995c81c00c2dp-55}, // 118 * 0x1p-8 = 0x1.d8p-2
227 {0x1.dc00010d88003p-2, 0x1.b9c022cf60864p-60, 0x1.5d867cp-1, 0x1.19fb7c13ec9cbp-1, -0x1.d0bd1c8ee7f6dp-55}, // 119 * 0x1p-8 = 0x1.dcp-2
228 {0x1.dffffece80004p-2, -0x1.f2000c9ad7fd7p-58, 0x1.5c9883p-1, 0x1.1bf3115352b0ep-1, -0x1.089d86505232dp-55}, // 120 * 0x1p-8 = 0x1.ep-2
229 {0x1.e40001b3e8008p-2, -0x1.feefdb93b1558p-58, 0x1.5babccp-1, 0x1.1de952af508efp-1, -0x1.f26b3411a7b5dp-55}, // 121 * 0x1p-8 = 0x1.e4p-2
230 {0x1.e7fffea388005p-2, 0x1.3e9fb5f691311p-60, 0x1.5ac057p-1, 0x1.1fde3c86ab23fp-1, -0x1.2f6561c930d55p-56}, // 122 * 0x1p-8 = 0x1.e8p-2
231 {0x1.ec00004ff2p-2, 0x1.0dd0c00e3a822p-56, 0x1.59d61fp-1, 0x1.21d1d5e261422p-1, -0x1.2a954f2219ae1p-57}, // 123 * 0x1p-8 = 0x1.ecp-2
232 {0x1.f0000023ap-2, 0x1.ab80000a05p-59, 0x1.58ed23p-1, 0x1.23c41d53c2721p-1, -0x1.b5408d57adfdep-56}, // 124 * 0x1p-8 = 0x1.fp-2
233 {0x1.f400005f4p-2, 0x1.7d000017dp-56, 0x1.58056p-1, 0x1.25b515b99e5f1p-1, 0x1.30c342a2944b9p-57}, // 125 * 0x1p-8 = 0x1.f4p-2
234 {0x1.f7fffef960003p-2, -0x1.6e4003e10cff5p-57, 0x1.571ed4p-1, 0x1.27a4bfd967b6ep-1, -0x1.2ebcc9e150d9dp-57}, // 126 * 0x1p-8 = 0x1.f8p-2
235 {0x1.fbfffe7508006p-2, 0x1.74fbf96fd709bp-56, 0x1.56397cp-1, 0x1.29931ea921c92p-1, -0x1.3ed67a542f9b6p-55}, // 127 * 0x1p-8 = 0x1.fcp-2
236 {0x1.000000c000003p-1, 0x1.8000006p-78, 0x1.555555p-1, 0x1.2b80352ca1e85p-1, -0x1.3d82406f24c25p-59}, // 128 * 0x1p-8 = 0x1p-1
237};
238
239static const int B_ORIGIN = 170;
240static const logdata_t B_LOOKUP[] = { //b{hi,lo}, vb, lg1pb{hi,lo}: 1/vb ~ 1+bhi+blo
241 {-0x1.540014ec115e4p-8, -0x1.feccae49893f5p-62, 0x1.0155c6p+0, -0x1.ebcb28ccb7d07p-8, -0x1.529c5874e9aefp-62}, // -170 * 0x1p-15 = -0x1.54p-8
242 {-0x1.52006aa07d176p-8, 0x1.0f47cf633c3d7p-62, 0x1.0153c1p+0, -0x1.e8e524ed8e1fep-8, -0x1.029055e430fe6p-62}, // -169 * 0x1p-15 = -0x1.52p-8
243 {-0x1.4fffbaeb22ed4p-8, -0x1.93a49d737bf67p-63, 0x1.0151bbp+0, -0x1.e5fdabcbdc26dp-8, -0x1.a86c6b5c667eap-63}, // -168 * 0x1p-15 = -0x1.5p-8
244 {-0x1.4e00008b4958p-8, 0x1.30b0707f595f8p-66, 0x1.014fb6p+0, -0x1.e3179c441682bp-8, -0x1.6a87d0f11e27ap-65}, // -167 * 0x1p-15 = -0x1.4ep-8
245 {-0x1.4c003e230180dp-8, -0x1.d771875d6ce1cp-62, 0x1.014db1p+0, -0x1.e03186e950e0cp-8, -0x1.e7115be6b3982p-62}, // -166 * 0x1p-15 = -0x1.4cp-8
246 {-0x1.4a0073b21afb7p-8, -0x1.60d73ca3fb3cp-63, 0x1.014bacp+0, -0x1.dd4b6bbb73d94p-8, -0x1.2a48f2a8de535p-62}, // -165 * 0x1p-15 = -0x1.4ap-8
247 {-0x1.47ffa3c6c15eap-8, 0x1.fcee8771439cbp-63, 0x1.0149a6p+0, -0x1.da63db3f261a7p-8, 0x1.8717493fc30afp-64}, // -164 * 0x1p-15 = -0x1.48p-8
248 {-0x1.45ffc94011984p-8, 0x1.212df869c7a77p-62, 0x1.0147a1p+0, -0x1.d77db467f19b3p-8, 0x1.a98be598bed68p-67}, // -163 * 0x1p-15 = -0x1.46p-8
249 {-0x1.43ffe6b031bd8p-8, 0x1.ef075dfd304b6p-63, 0x1.01459cp+0, -0x1.d49787bd5f6ffp-8, -0x1.a9bc11bf1fe42p-62}, // -162 * 0x1p-15 = -0x1.44p-8
250 {-0x1.41fffc16f15bfp-8, -0x1.4450ee973a761p-65, 0x1.014397p+0, -0x1.d1b1553f582ecp-8, 0x1.43c4e5abbb697p-62}, // -161 * 0x1p-15 = -0x1.42p-8
251 {-0x1.400009741fffap-8, -0x1.8c3400d54c12p-62, 0x1.014192p+0, -0x1.cecb1cedc46cep-8, -0x1.d8b692e1c94d3p-62}, // -160 * 0x1p-15 = -0x1.4p-8
252 {-0x1.3e000ec78d332p-8, -0x1.20163d9cf975bp-62, 0x1.013f8dp+0, -0x1.cbe4dec88cbf6p-8, 0x1.9dc91f7b3614bp-62}, // -159 * 0x1p-15 = -0x1.3ep-8
253 {-0x1.3c000c11087f7p-8, 0x1.2743848903ed6p-63, 0x1.013d88p+0, -0x1.c8fe9acf99ba6p-8, -0x1.bcace193c3eafp-64}, // -158 * 0x1p-15 = -0x1.3cp-8
254 {-0x1.3a000150616cp-8, 0x1.bc20a095b59cfp-64, 0x1.013b83p+0, -0x1.c6185102d3f1cp-8, -0x1.909baf9b77dfcp-63}, // -157 * 0x1p-15 = -0x1.3ap-8
255 {-0x1.37ffee85677edp-8, 0x1.7c8b2e879b4c6p-63, 0x1.01397ep+0, -0x1.c332016223f8bp-8, -0x1.cf106247d2e18p-63}, // -156 * 0x1p-15 = -0x1.38p-8
256 {-0x1.35ffd3afea3c5p-8, 0x1.3d6a41e2bc68fp-62, 0x1.013779p+0, -0x1.c04babed7261ep-8, 0x1.0928f24974b97p-62}, // -155 * 0x1p-15 = -0x1.36p-8
257 {-0x1.33ffb0cfb9276p-8, -0x1.c77da6f08ffd3p-63, 0x1.013574p+0, -0x1.bd6550a4a7bf5p-8, -0x1.cf2ea46b359a8p-62}, // -154 * 0x1p-15 = -0x1.34p-8
258 {-0x1.31ff85e4a3c18p-8, 0x1.02239f5a746e2p-62, 0x1.01336fp+0, -0x1.ba7eef87aca2bp-8, -0x1.eebd4a898a2ddp-63}, // -153 * 0x1p-15 = -0x1.32p-8
259 {-0x1.3000508fe2e68p-8, -0x1.e08ccf62117b3p-62, 0x1.01316bp+0, -0x1.b799f8344be5ep-8, -0x1.98e58512baac1p-63}, // -152 * 0x1p-15 = -0x1.3p-8
260 {-0x1.2e0015926f163p-8, 0x1.c0bfba4622c4ep-63, 0x1.012f66p+0, -0x1.b4b38b718c858p-8, -0x1.b9f30101e2686p-64}, // -151 * 0x1p-15 = -0x1.2ep-8
261 {-0x1.2bffd2898587ep-8, -0x1.d06f4d281b9b5p-63, 0x1.012d61p+0, -0x1.b1cd18da5667fp-8, -0x1.c7eb81e38d75ep-62}, // -150 * 0x1p-15 = -0x1.2cp-8
262 {-0x1.29ff8774f5b7p-8, 0x1.41395e8df23b1p-62, 0x1.012b5cp+0, -0x1.aee6a06e921cap-8, 0x1.c537fc230a8d1p-63}, // -149 * 0x1p-15 = -0x1.2ap-8
263 {-0x1.28003205e5f63p-8, 0x1.a8639298b2748p-64, 0x1.012958p+0, -0x1.ac0191d7954bp-8, 0x1.37a742b6f8924p-62}, // -148 * 0x1p-15 = -0x1.28p-8
264 {-0x1.25ffd6dd74256p-8, 0x1.dabb68204013bp-63, 0x1.012753p+0, -0x1.a91b0dc5517c5p-8, 0x1.c2da8e49db20cp-62}, // -147 * 0x1p-15 = -0x1.26p-8
265 {-0x1.2400716217bd9p-8, 0x1.47d7d0d265c0ap-64, 0x1.01254fp+0, -0x1.a635f38d6b455p-8, -0x1.d96d2999d57b9p-64}, // -146 * 0x1p-15 = -0x1.24p-8
266 {-0x1.220006250227ep-8, 0x1.7b1a537d7c398p-62, 0x1.01234ap+0, -0x1.a34f63d44a587p-8, -0x1.e98cc82fded6ap-62}, // -145 * 0x1p-15 = -0x1.22p-8
267 {-0x1.1fff92db53d14p-8, -0x1.95e23e31cf01ep-63, 0x1.012145p+0, -0x1.a068ce4626198p-8, 0x1.217488a6c409ap-62}, // -144 * 0x1p-15 = -0x1.2p-8
268 {-0x1.1e00154a1c824p-8, 0x1.cead66207aa84p-62, 0x1.011f41p+0, -0x1.9d83a29ac1a34p-8, -0x1.7ad7d5fd429d2p-62}, // -143 * 0x1p-15 = -0x1.1ep-8
269 {-0x1.1bff91eaa7907p-8, -0x1.39ff94df5c71cp-62, 0x1.011d3cp+0, -0x1.9a9d016533ca1p-8, 0x1.32f79d1a3a482p-62}, // -142 * 0x1p-15 = -0x1.1cp-8
270 {-0x1.1a00044b3fdffp-8, 0x1.4241bad812449p-63, 0x1.011b38p+0, -0x1.97b7ca17fc46p-8, -0x1.4a03b6f5dd193p-63}, // -141 * 0x1p-15 = -0x1.1ap-8
271 {-0x1.18006ea674cffp-8, -0x1.ffa2ce5e68743p-62, 0x1.011934p+0, -0x1.94d28cfb29357p-8, -0x1.6f07d9f9e4dfdp-62}, // -140 * 0x1p-15 = -0x1.18p-8
272 {-0x1.15ffd326e8d42p-8, 0x1.f4c6cf637a824p-63, 0x1.01172fp+0, -0x1.91ebda4b3f213p-8, 0x1.573e403234d26p-63}, // -139 * 0x1p-15 = -0x1.16p-8
273 {-0x1.14002d72cb27ep-8, -0x1.6d2ff5c4049f1p-62, 0x1.01152bp+0, -0x1.8f06918c0cd64p-8, 0x1.7391494fb5bc6p-63}, // -138 * 0x1p-15 = -0x1.14p-8
274 {-0x1.11ff81db93d99p-8, -0x1.54931b6bb53a5p-62, 0x1.011326p+0, -0x1.8c1fd333cf0c7p-8, -0x1.8a40419b19efbp-62}, // -137 * 0x1p-15 = -0x1.12p-8
275 {-0x1.0fffcc1761f57p-8, 0x1.bd2de6eca4f8ap-64, 0x1.011122p+0, -0x1.893a7ed1e006ep-8, 0x1.870dd5cd2f64cp-64}, // -136 * 0x1p-15 = -0x1.1p-8
276 {-0x1.0e000e4cdaf73p-8, -0x1.5433e5324ae6dp-63, 0x1.010f1ep+0, -0x1.8655249fe0b73p-8, 0x1.1306b3c97afa1p-63}, // -135 * 0x1p-15 = -0x1.0ep-8
277 {-0x1.0c00487bce8b6p-8, -0x1.234bdbb46f16fp-62, 0x1.010d1ap+0, -0x1.836fc49db9c74p-8, -0x1.03637ba59431ap-63}, // -134 * 0x1p-15 = -0x1.0cp-8
278 {-0x1.0a007aa40c5dp-8, -0x1.eefd92fde68ebp-64, 0x1.010b16p+0, -0x1.808a5ecb53e07p-8, 0x1.e7bb01c9b38bfp-63}, // -133 * 0x1p-15 = -0x1.0ap-8
279 {-0x1.07ffa6d45420dp-8, -0x1.c83067998b2dcp-66, 0x1.010911p+0, -0x1.7da3835100a94p-8, -0x1.b6a12ab73c0a1p-62}, // -132 * 0x1p-15 = -0x1.08p-8
280 {-0x1.05ffc8ea99c82p-8, 0x1.985ec9e1c8ca4p-62, 0x1.01070dp+0, -0x1.7abe11daf456ap-8, -0x1.e849a18d29e5cp-64}, // -131 * 0x1p-15 = -0x1.06p-8
281 {-0x1.03ffe2f9988cbp-8, -0x1.18b0b1fc537dp-63, 0x1.010509p+0, -0x1.77d89a9462fa2p-8, -0x1.7f41cb463e913p-62}, // -130 * 0x1p-15 = -0x1.04p-8
282 {-0x1.01fff50120138p-8, -0x1.a79b05e304355p-62, 0x1.010305p+0, -0x1.74f31d7d353afp-8, -0x1.b15641a138382p-64}, // -129 * 0x1p-15 = -0x1.02p-8
283 {-0x1.fffffe02p-9, 0x1.fe000001fep-65, 0x1.010101p+0, -0x1.720d9a9553bf9p-8, -0x1.bf85dcbd8a866p-62}, // -128 * 0x1p-15 = -0x1p-8
284 {-0x1.fc0001f20fe8p-9, 0x1.e663888e2502dp-65, 0x1.00fefdp+0, -0x1.6f2811dca72e2p-8, 0x1.31fd9a7343c6cp-62}, // -127 * 0x1p-15 = -0x1.fcp-9
285 {-0x1.f7fff5d20f1fdp-9, 0x1.00aeae626f7c8p-63, 0x1.00fcf9p+0, -0x1.6c428353182bfp-8, -0x1.c2d80dc3be2c9p-62}, // -126 * 0x1p-15 = -0x1.f8p-9
286 {-0x1.f3ffd9a19ce52p-9, 0x1.72d845e2c5a8fp-64, 0x1.00faf5p+0, -0x1.695ceef88f5e1p-8, -0x1.9dd67838d6355p-62}, // -125 * 0x1p-15 = -0x1.f4p-9
287 {-0x1.efffad605872ap-9, 0x1.265617822dc22p-64, 0x1.00f8f1p+0, -0x1.667754ccf568ep-8, 0x1.cd8a71277c813p-62}, // -124 * 0x1p-15 = -0x1.fp-9
288 {-0x1.ebff710de0fffp-9, -0x1.8367f374d15bbp-66, 0x1.00f6edp+0, -0x1.6391b4d032f01p-8, -0x1.35d7f5f9f0eccp-65}, // -123 * 0x1p-15 = -0x1.ecp-9
289 {-0x1.e7ff24a9d5c1bp-9, 0x1.47109a7ea2afbp-68, 0x1.00f4e9p+0, -0x1.60ac0f023097p-8, -0x1.e43f527d44679p-63}, // -122 * 0x1p-15 = -0x1.e8p-9
290 {-0x1.e400c46d9fe46p-9, 0x1.c34aedb5f869bp-64, 0x1.00f2e6p+0, -0x1.5dc7d35a2ba4ep-8, -0x1.712f884949123p-62}, // -121 * 0x1p-15 = -0x1.e4p-9
291 {-0x1.e00057ed43f0ep-9, 0x1.f15578d147249p-63, 0x1.00f0e2p+0, -0x1.5ae221ec466a2p-8, -0x1.1a15ac97b3c44p-63}, // -120 * 0x1p-15 = -0x1.ep-9
292 {-0x1.dbffdb5a31ed6p-9, 0x1.f941ceaacbfe4p-65, 0x1.00eedep+0, -0x1.57fc6aacdb413p-8, -0x1.ccdd271019a7fp-62}, // -119 * 0x1p-15 = -0x1.dcp-9
293 {-0x1.d7ff4eb409026p-9, -0x1.10c0c6054a7edp-64, 0x1.00ecdap+0, -0x1.5516ad9bd2cb3p-8, -0x1.f4588de1ad38p-62}, // -118 * 0x1p-15 = -0x1.d8p-9
294 {-0x1.d400ae5414bc7p-9, 0x1.a71deb4ccb30cp-65, 0x1.00ead7p+0, -0x1.52325abbf500dp-8, -0x1.e1983b9964fcep-63}, // -117 * 0x1p-15 = -0x1.d4p-9
295 {-0x1.d000018e958p-9, 0x1.3764cbff0cb94p-65, 0x1.00e8d3p+0, -0x1.4f4c920a4ef74p-8, -0x1.e1b5e8b410a84p-64}, // -116 * 0x1p-15 = -0x1.dp-9
296 {-0x1.cbff44b4dcf34p-9, 0x1.331bdca43d086p-65, 0x1.00e6cfp+0, -0x1.4c66c386c58c2p-8, -0x1.124b274c37dafp-64}, // -115 * 0x1p-15 = -0x1.ccp-9
297 {-0x1.c800743821658p-9, -0x1.bdb923ec78c4p-63, 0x1.00e4ccp+0, -0x1.49825f3cc8db3p-8, -0x1.04107e1153097p-62}, // -114 * 0x1p-15 = -0x1.c8p-9
298 {-0x1.c3ff973cce2a8p-9, 0x1.49f5b34fbf82ap-64, 0x1.00e2c8p+0, -0x1.469c851815d16p-8, 0x1.d7894fdf56dcfp-66}, // -113 * 0x1p-15 = -0x1.c4p-9
299 {-0x1.c000a6ada7c99p-9, 0x1.3cf79b6d759dep-64, 0x1.00e0c5p+0, -0x1.43b8153285f6fp-8, 0x1.358b31a848ca2p-62}, // -112 * 0x1p-15 = -0x1.cp-9
300 {-0x1.bbffa98f36f96p-9, 0x1.2bcb7b8679427p-63, 0x1.00dec1p+0, -0x1.40d22f6c4bf3ep-8, 0x1.5a879c7800e56p-64}, // -111 * 0x1p-15 = -0x1.bcp-9
301 {-0x1.b80098ec23923p-9, 0x1.01123d8795d0ap-63, 0x1.00dcbep+0, -0x1.3dedb3eacbc18p-8, 0x1.b0e64f24676a1p-64}, // -110 * 0x1p-15 = -0x1.b8p-9
302 {-0x1.b3ff7ba9122dbp-9, 0x1.0da28fa98d3c9p-64, 0x1.00dabap+0, -0x1.3b07c282ad665p-8, -0x1.634d7f2b8b24cp-64}, // -109 * 0x1p-15 = -0x1.b4p-9
303 {-0x1.b0004af08f75p-9, 0x1.439116487be9ap-65, 0x1.00d8b7p+0, -0x1.38233b64dfa94p-8, 0x1.982f74c31560ep-64}, // -108 * 0x1p-15 = -0x1.bp-9
304 {-0x1.abff0d875a64dp-9, 0x1.1da7ca00d112bp-63, 0x1.00d6b3p+0, -0x1.353d3e5a7f92ap-8, -0x1.10c62c49e2fa1p-62}, // -107 * 0x1p-15 = -0x1.acp-9
305 {-0x1.a7ffbcb7e5f72p-9, -0x1.3e9154a1ffa8fp-65, 0x1.00d4bp+0, -0x1.3258aba00713bp-8, -0x1.6576c1eee2a93p-62}, // -106 * 0x1p-15 = -0x1.a8p-9
306 {-0x1.a4005be063d77p-9, -0x1.7231ad147342ap-63, 0x1.00d2adp+0, -0x1.2f7413188758ep-8, 0x1.64b9181d3c228p-62}, // -105 * 0x1p-15 = -0x1.a4p-9
307 {-0x1.a000eb007393dp-9, 0x1.354deb4b14bf5p-63, 0x1.00d0aap+0, -0x1.2c8f74c3e91e3p-8, -0x1.6ac95ada8cf5fp-62}, // -104 * 0x1p-15 = -0x1.ap-9
308 {-0x1.9bff6d4e6a05dp-9, -0x1.a3643d639a0b7p-63, 0x1.00cea6p+0, -0x1.29a96076d1119p-8, 0x1.89adb4b4205a5p-63}, // -103 * 0x1p-15 = -0x1.9cp-9
309 {-0x1.97ffdc54835d8p-9, -0x1.d7fe34e6fc3ffp-65, 0x1.00cca3p+0, -0x1.26c4b684cdb0cp-8, 0x1.7437881e837d2p-62}, // -102 * 0x1p-15 = -0x1.98p-9
310 {-0x1.94003b510cf92p-9, 0x1.2ad07cbb46458p-63, 0x1.00caap+0, -0x1.23e006c565f5bp-8, 0x1.72e0d995ddf6dp-63}, // -101 * 0x1p-15 = -0x1.94p-9
311 {-0x1.90008a43a65a9p-9, 0x1.e18bcb764fca2p-64, 0x1.00c89dp+0, -0x1.20fb5138829a6p-8, 0x1.eaf265fa527c4p-62}, // -100 * 0x1p-15 = -0x1.9p-9
312 {-0x1.8c00c92bef00bp-9, -0x1.eae0b6e75b087p-63, 0x1.00c69ap+0, -0x1.1e1695de0c582p-8, -0x1.3d57f1f088769p-63}, // -99 * 0x1p-15 = -0x1.8cp-9
313 {-0x1.8800f80986678p-9, 0x1.6034a7f05cea1p-63, 0x1.00c497p+0, -0x1.1b31d4b5ebe7ep-8, -0x1.87958a7341c31p-62}, // -98 * 0x1p-15 = -0x1.88p-9
314 {-0x1.83ff19e2e6304p-9, -0x1.4f73d99596b2ep-63, 0x1.00c293p+0, -0x1.184b9d8375c28p-8, 0x1.bb613de7ce4cbp-62}, // -97 * 0x1p-15 = -0x1.84p-9
315 {-0x1.7fff28a1ffa52p-9, -0x1.15f66ad543f51p-63, 0x1.00c09p+0, -0x1.1566d0bcd8805p-8, 0x1.e0f078be4b2d8p-62}, // -96 * 0x1p-15 = -0x1.8p-9
316 {-0x1.7bff2755460c1p-9, 0x1.2149dfd62ec05p-63, 0x1.00be8dp+0, -0x1.1281fe284b2bcp-8, -0x1.5c0f51ed16ea2p-62}, // -95 * 0x1p-15 = -0x1.7cp-9
317 {-0x1.77ff15fc58d4cp-9, 0x1.072a0f4020af7p-63, 0x1.00bc8ap+0, -0x1.0f9d25c5b67bap-8, 0x1.8994be2a0e53ep-62}, // -94 * 0x1p-15 = -0x1.78p-9
318 {-0x1.7400f1afe5cd9p-9, -0x1.a2d9af52f8935p-63, 0x1.00ba88p+0, -0x1.0cb9b7dd2223fp-8, 0x1.51f85647d7e8fp-62}, // -93 * 0x1p-15 = -0x1.74p-9
319 {-0x1.7000c0456a379p-9, -0x1.f6fe001df468cp-63, 0x1.00b885p+0, -0x1.09d4d3e11baadp-8, -0x1.481f798d26cf1p-67}, // -92 * 0x1p-15 = -0x1.7p-9
320 {-0x1.6c007ecd99708p-9, -0x1.0c304d786511p-64, 0x1.00b682p+0, -0x1.06efea16c8025p-8, -0x1.8be819d261b66p-62}, // -91 * 0x1p-15 = -0x1.6cp-9
321 {-0x1.68002d4812dcp-9, 0x1.02130a951ce7bp-63, 0x1.00b47fp+0, -0x1.040afa7e0fdefp-8, -0x1.95af21b72e885p-62}, // -90 * 0x1p-15 = -0x1.68p-9
322 {-0x1.63ffcbb475daap-9, -0x1.38dc7f24cad52p-63, 0x1.00b27cp+0, -0x1.01260516dbf4ap-8, 0x1.05b02149895fcp-63}, // -89 * 0x1p-15 = -0x1.64p-9
323 {-0x1.5fff5a1261ca1p-9, -0x1.3649b6a994141p-63, 0x1.00b079p+0, -0x1.fc8213c229ed6p-9, 0x1.d954b8288a764p-64}, // -88 * 0x1p-15 = -0x1.6p-9
324 {-0x1.5c00d5aa62deap-9, 0x1.d052a7fb670a2p-63, 0x1.00ae77p+0, -0x1.f6baf26c253fbp-9, 0x1.3effcb2430d22p-64}, // -87 * 0x1p-15 = -0x1.5cp-9
325 {-0x1.580043f23a76fp-9, -0x1.654622fcb65bp-63, 0x1.00ac74p+0, -0x1.f0f0e4cb85497p-9, 0x1.790485c704bc4p-65}, // -86 * 0x1p-15 = -0x1.58p-9
326 {-0x1.53ffa22a7936cp-9, -0x1.10f4e4e3e79f9p-64, 0x1.00aa71p+0, -0x1.eb26cb8d3370ep-9, -0x1.4ea8f48d27c99p-68}, // -85 * 0x1p-15 = -0x1.54p-9
327 {-0x1.5000edb39b116p-9, 0x1.d092a653433dcp-64, 0x1.00a86fp+0, -0x1.e55f87752efb1p-9, 0x1.c65f26750c3c8p-63}, // -84 * 0x1p-15 = -0x1.5p-9
328 {-0x1.4c002bd3825c4p-9, 0x1.674bed302ab4p-64, 0x1.00a66cp+0, -0x1.df955700b3ed8p-9, 0x1.f6c14de3e616bp-63}, // -83 * 0x1p-15 = -0x1.4cp-9
329 {-0x1.47ff59e2aeeap-9, 0x1.e844eb94d00abp-63, 0x1.00a469p+0, -0x1.d9cb1aedfb38ap-9, 0x1.409622fa3ec2ap-64}, // -82 * 0x1p-15 = -0x1.48p-9
330 {-0x1.440075598e1d1p-9, 0x1.a36a49fd69de1p-63, 0x1.00a267p+0, -0x1.d403b41254c17p-9, -0x1.2bf6856ac2e2ap-63}, // -81 * 0x1p-15 = -0x1.44p-9
331 {-0x1.3fff834e1fe19p-9, 0x1.6d376eb12a088p-65, 0x1.00a064p+0, -0x1.ce3960c85b894p-9, -0x1.2a30252bab452p-63}, // -80 * 0x1p-15 = -0x1.4p-9
332 {-0x1.3c007eb998f09p-9, 0x1.04560f39a895ep-65, 0x1.009e62p+0, -0x1.c871e2c0a1f71p-9, -0x1.63e280fe28547p-65}, // -79 * 0x1p-15 = -0x1.3cp-9
333 {-0x1.37ff6c920db57p-9, -0x1.2bfe799a76bf5p-64, 0x1.009c5fp+0, -0x1.c2a7783eae0bdp-9, -0x1.33688a6a0ec66p-63}, // -78 * 0x1p-15 = -0x1.38p-9
334 {-0x1.340047f09f1dep-9, 0x1.c588e6e25ff21p-65, 0x1.009a5dp+0, -0x1.bcdfe30a27871p-9, 0x1.91aebc6c6eaacp-66}, // -77 * 0x1p-15 = -0x1.34p-9
335 {-0x1.2fff15ab74948p-9, -0x1.ae95bfb586d22p-66, 0x1.00985ap+0, -0x1.b715614f7eb05p-9, 0x1.0402e54a14afep-65}, // -76 * 0x1p-15 = -0x1.3p-9
336 {-0x1.2bffd0fb9cbbbp-9, 0x1.ebb17cfbc1861p-64, 0x1.009658p+0, -0x1.b14db4ed7158bp-9, -0x1.b2029f221ad61p-64}, // -75 * 0x1p-15 = -0x1.2cp-9
337 {-0x1.28007c47fca1cp-9, -0x1.ce48e2908854ap-64, 0x1.009456p+0, -0x1.ab85fcf73d0e3p-9, -0x1.764c4a765b8a4p-63}, // -74 * 0x1p-15 = -0x1.28p-9
338 {-0x1.23ff19d78db05p-9, 0x1.7cf03380bfdfdp-65, 0x1.009253p+0, -0x1.a5bb58690b41cp-9, -0x1.942799dc997c7p-63}, // -73 * 0x1p-15 = -0x1.24p-9
339 {-0x1.1fffa51341efdp-9, -0x1.3d6c3ead7e93ep-65, 0x1.009051p+0, -0x1.9ff38944395adp-9, 0x1.6af69dcd18f29p-64}, // -72 * 0x1p-15 = -0x1.2p-9
340 {-0x1.1c00204a0cf5fp-9, -0x1.6478931d30692p-63, 0x1.008e4fp+0, -0x1.9a2bae8ab539ep-9, -0x1.373a4b8968074p-63}, // -71 * 0x1p-15 = -0x1.1cp-9
341 {-0x1.18008b7b8e79fp-9, 0x1.21dc70434d6d7p-63, 0x1.008c4dp+0, -0x1.9463c83c50779p-9, 0x1.23755eb9b6477p-65}, // -70 * 0x1p-15 = -0x1.18p-9
342 {-0x1.1400e6a7662fep-9, 0x1.7cbf912f9ccc8p-66, 0x1.008a4bp+0, -0x1.8e9bd658dcab3p-9, -0x1.6c3024e887bcfp-63}, // -69 * 0x1p-15 = -0x1.14p-9
343 {-0x1.0fff33eca3ae8p-9, 0x1.5dcfc73bb83d5p-64, 0x1.008848p+0, -0x1.88d0f7bfa8ccdp-9, -0x1.6a4b439bc0a37p-63}, // -68 * 0x1p-15 = -0x1.1p-9
344 {-0x1.0bff6f040b86ep-9, 0x1.df1557d430ea6p-64, 0x1.008646p+0, -0x1.8308eeabc6b1cp-9, -0x1.a59faf4522eefp-63}, // -67 * 0x1p-15 = -0x1.0cp-9
345 {-0x1.07ff9a14a86bbp-9, 0x1.104a01838fc2fp-63, 0x1.008444p+0, -0x1.7d40da024a355p-9, 0x1.4056394cb8282p-63}, // -66 * 0x1p-15 = -0x1.08p-9
346 {-0x1.03ffb51e1a05p-9, -0x1.af5209243541ap-63, 0x1.008242p+0, -0x1.7778b9c304ea7p-9, -0x1.b13b4dd4e19c7p-66}, // -65 * 0x1p-15 = -0x1.04p-9
347 {-0x1.ffff803ffffp-10, -0x1.ffff803ffffp-64, 0x1.00804p+0, -0x1.71b08dedc8633p-9, 0x1.f7eccd83c2e4dp-66}, // -64 * 0x1p-15 = -0x1p-9
348 {-0x1.f7ff7633f3cd7p-10, 0x1.09b540706314p-64, 0x1.007e3ep+0, -0x1.6be8568266306p-9, -0x1.502131b4fdafcp-63}, // -63 * 0x1p-15 = -0x1.f8p-10
349 {-0x1.efff4c174ee05p-10, -0x1.3694973beb87ep-64, 0x1.007c3cp+0, -0x1.66201380afe1ep-9, 0x1.ed90e871b1216p-64}, // -62 * 0x1p-15 = -0x1.fp-10
350 {-0x1.e7ff01e95060dp-10, -0x1.690fd4a712338p-64, 0x1.007a3ap+0, -0x1.6057c4e877064p-9, -0x1.45970c611e849p-63}, // -61 * 0x1p-15 = -0x1.e8p-10
351 {-0x1.dffe97a93780fp-10, -0x1.d9f44dce16607p-64, 0x1.007838p+0, -0x1.5a8f6ab98d2b4p-9, 0x1.700065234dd49p-63}, // -60 * 0x1p-15 = -0x1.ep-10
352 {-0x1.d7fe0d56436ccp-10, 0x1.95a0d24f23292p-64, 0x1.007636p+0, -0x1.54c704f3c3dd4p-9, 0x1.7640c15343ef9p-65}, // -59 * 0x1p-15 = -0x1.d8p-10
353 {-0x1.d0015f5086c74p-10, -0x1.ceed9c7de58dfp-66, 0x1.007435p+0, -0x1.4f0174f125349p-9, 0x1.3ba413f5070ffp-64}, // -58 * 0x1p-15 = -0x1.dp-10
354 {-0x1.c80094e5941a5p-10, 0x1.c624e916d963ap-69, 0x1.007233p+0, -0x1.4938f802d785cp-9, 0x1.e6c4cf3373071p-65}, // -57 * 0x1p-15 = -0x1.c8p-10
355 {-0x1.bfffaa6583f8dp-10, -0x1.380f4994e1c7cp-64, 0x1.007031p+0, -0x1.43706f7d1f1a2p-9, 0x1.ca15f500601a9p-66}, // -56 * 0x1p-15 = -0x1.cp-10
356 {-0x1.b7fe9fcf9576bp-10, 0x1.5b85010c21985p-64, 0x1.006e2fp+0, -0x1.3da7db5fcd79dp-9, -0x1.a75f4daee51e1p-63}, // -55 * 0x1p-15 = -0x1.b8p-10
357 {-0x1.b00171c3befa4p-10, -0x1.0d9255d37f5a4p-65, 0x1.006c2ep+0, -0x1.37e21d1c01f2fp-9, -0x1.7021c3e81404dp-67}, // -54 * 0x1p-15 = -0x1.bp-10
358 {-0x1.a800270fccbe8p-10, -0x1.ed755899255c3p-66, 0x1.006a2cp+0, -0x1.321971d4b8bddp-9, -0x1.65fe3b555c2d4p-63}, // -53 * 0x1p-15 = -0x1.a8p-10
359 {-0x1.9ffebc43b9998p-10, 0x1.67056ae5af273p-65, 0x1.00682ap+0, -0x1.2c50baf54afd2p-9, 0x1.445f371f4576fp-64}, // -52 * 0x1p-15 = -0x1.ap-10
360 {-0x1.98012e2f68b6bp-10, 0x1.1e521d6d1fceep-67, 0x1.006629p+0, -0x1.268ada002821fp-9, 0x1.6227a24679193p-63}, // -51 * 0x1p-15 = -0x1.98p-10
361 {-0x1.8fff8340cdb0cp-10, -0x1.e7062766abe43p-64, 0x1.006427p+0, -0x1.20c20bf5ac5a1p-9, -0x1.0288c235480aep-66}, // -50 * 0x1p-15 = -0x1.9p-10
362 {-0x1.8801b52865a51p-10, -0x1.ed9aa986257bcp-64, 0x1.006226p+0, -0x1.1afc13e0a8d59p-9, 0x1.5c45b1b03d85p-71}, // -49 * 0x1p-15 = -0x1.88p-10
363 {-0x1.7fffca143ffd3p-10, 0x1.fba80998c55c8p-64, 0x1.006024p+0, -0x1.15332eaa65699p-9, -0x1.e60625ef3c27ep-66}, // -48 * 0x1p-15 = -0x1.8p-10
364 {-0x1.7801bbf4bf6f4p-10, 0x1.0555a6d20911fp-66, 0x1.005e23p+0, -0x1.0f6d1f74c7f6ep-9, 0x1.d96948b89040ep-63}, // -47 * 0x1p-15 = -0x1.78p-10
365 {-0x1.6fff90b80c33ep-10, -0x1.e3b9facee4514p-65, 0x1.005c21p+0, -0x1.09a423120341p-9, 0x1.5c72fb3e13bd5p-63}, // -46 * 0x1p-15 = -0x1.7p-10
366 {-0x1.6801428e719a4p-10, -0x1.91aa97d14d70ap-66, 0x1.005a2p+0, -0x1.03ddfcbb12927p-9, 0x1.46a838e01e676p-64}, // -45 * 0x1p-15 = -0x1.68p-10
367 {-0x1.5ffed7262da9dp-10, -0x1.1148571b944fdp-64, 0x1.00581ep+0, -0x1.fc29d25625c88p-10, 0x1.a809ec755c51ap-66}, // -44 * 0x1p-15 = -0x1.6p-10
368 {-0x1.580048ef774adp-10, 0x1.d21001d392b7cp-65, 0x1.00561dp+0, -0x1.f09d57642b472p-10, 0x1.6a3f6c51c28cap-64}, // -43 * 0x1p-15 = -0x1.58p-10
369 {-0x1.50019ab90e5b1p-10, 0x1.b909f87d5faeep-65, 0x1.00541cp+0, -0x1.e510c5555d8b9p-10, -0x1.ed886f33b3fa1p-64}, // -42 * 0x1p-15 = -0x1.5p-10
370 {-0x1.47fecf11cb451p-10, -0x1.4e8bcd3e0f46dp-64, 0x1.00521ap+0, -0x1.d97e58b0bc281p-10, -0x1.70d89c61734e2p-64}, // -41 * 0x1p-15 = -0x1.48p-10
371 {-0x1.3fffe0c9c3ff1p-10, 0x1.ebda63b8829a3p-65, 0x1.005019p+0, -0x1.cdf1985ba952fp-10, 0x1.11de0907e9af9p-65}, // -40 * 0x1p-15 = -0x1.4p-10
372 {-0x1.3800d27fc954bp-10, 0x1.565fceb609282p-65, 0x1.004e18p+0, -0x1.c264c0e8ad848p-10, 0x1.415244b2e8412p-65}, // -39 * 0x1p-15 = -0x1.38p-10
373 {-0x1.3001a4331b136p-10, 0x1.2ee3993810971p-66, 0x1.004c17p+0, -0x1.b6d7d2576c32cp-10, -0x1.783365ce8cbd1p-65}, // -38 * 0x1p-15 = -0x1.3p-10
374 {-0x1.27fe5832a4206p-10, -0x1.cae13d3fd1873p-64, 0x1.004a15p+0, -0x1.ab450900b9ad1p-10, -0x1.8132e8db56ee2p-65}, // -37 * 0x1p-15 = -0x1.28p-10
375 {-0x1.1ffee9ce53b45p-10, -0x1.af60fb05d2c04p-64, 0x1.004814p+0, -0x1.9fb7ec264ddc8p-10, 0x1.5c8ff88f79e1fp-64}, // -36 * 0x1p-15 = -0x1.2p-10
376 {-0x1.17ff5b650e958p-10, -0x1.8489659805e42p-65, 0x1.004613p+0, -0x1.942ab82c86af6p-10, 0x1.5287c3bcfb294p-64}, // -35 * 0x1p-15 = -0x1.18p-10
377 {-0x1.0fffacf614794p-10, -0x1.2cecbbf56d97ap-65, 0x1.004412p+0, -0x1.889d6d130793p-10, -0x1.8c240857cf4e9p-66}, // -34 * 0x1p-15 = -0x1.1p-10
378 {-0x1.07ffde80a50eep-10, -0x1.cc99e9bb85224p-64, 0x1.004211p+0, -0x1.7d100ad973f29p-10, -0x1.2da85cf4eb57ap-66}, // -33 * 0x1p-15 = -0x1.08p-10
379 {-0x1.ffffe007ffff8p-11, -0x1.ffffe007ffff8p-71, 0x1.00401p+0, -0x1.7182917f6f37p-10, 0x1.384f05ed47078p-68}, // -32 * 0x1p-15 = -0x1p-10
380 {-0x1.efffc2fec9de3p-11, 0x1.a33f2e2220084p-67, 0x1.003e0fp+0, -0x1.65f501049cc71p-10, -0x1.c65a2fab0be0ep-64}, // -31 * 0x1p-15 = -0x1.fp-11
381 {-0x1.dfff65e426f46p-11, -0x1.25c3c60ce026cp-65, 0x1.003c0ep+0, -0x1.5a675968a0077p-10, -0x1.4f0b1baad130ap-64}, // -30 * 0x1p-15 = -0x1.ep-11
382 {-0x1.cffec8b69670ap-11, -0x1.35bbbbbceea95p-65, 0x1.003a0dp+0, -0x1.4ed99aab1c5a9p-10, 0x1.11e2a44bfe00dp-64}, // -29 * 0x1p-15 = -0x1.dp-11
383 {-0x1.bffdeb7497756p-11, -0x1.cdfabb7f3b611p-65, 0x1.00380cp+0, -0x1.434bc4cbb520ap-10, 0x1.eb530413510f2p-70}, // -28 * 0x1p-15 = -0x1.cp-11
384 {-0x1.affcce1ca9192p-11, 0x1.a3dc7574c0537p-65, 0x1.00360bp+0, -0x1.37bdd7ca0db7dp-10, 0x1.54baae9e6d3ddp-64}, // -27 * 0x1p-15 = -0x1.bp-11
385 {-0x1.a0036d6da007dp-11, 0x1.dd4475962c718p-65, 0x1.00340bp+0, -0x1.2c3597cb8e8f4p-10, -0x1.38dc1f165312ap-64}, // -26 * 0x1p-15 = -0x1.ap-11
386 {-0x1.9001d0054cd6dp-11, 0x1.bcea10e78e1d3p-65, 0x1.00320ap+0, -0x1.20a77c8fdca83p-10, 0x1.7bd0fbd788e32p-64}, // -25 * 0x1p-15 = -0x1.9p-11
387 {-0x1.7ffff28287fffp-11, 0x1.b0eea0099a92bp-65, 0x1.003009p+0, -0x1.15194a30d4cdap-10, -0x1.c660f3a4e9f4fp-65}, // -24 * 0x1p-15 = -0x1.8p-11
388 {-0x1.6ffdd4e3d0697p-11, 0x1.7528671437257p-67, 0x1.002e08p+0, -0x1.098b00ae1a552p-10, 0x1.af36b1ff765acp-64}, // -23 * 0x1p-15 = -0x1.7p-11
389 {-0x1.60037467e281dp-11, -0x1.4ddf532eb95ebp-66, 0x1.002c08p+0, -0x1.fc04c8b6805ep-11, -0x1.5038ae376b2e1p-65}, // -22 * 0x1p-15 = -0x1.6p-11
390 {-0x1.5000d6acc1c98p-11, 0x1.16b2df088481p-65, 0x1.002a07p+0, -0x1.e4e7d9372df1ap-11, 0x1.6275688d64fecp-68}, // -21 * 0x1p-15 = -0x1.5p-11
391 {-0x1.3ffdf8d12b7c5p-11, 0x1.38841409c600dp-66, 0x1.002806p+0, -0x1.cdcabb6e4a8c1p-11, 0x1.d6c5366f679fcp-66}, // -20 * 0x1p-15 = -0x1.4p-11
392 {-0x1.3002d873cdbccp-11, 0x1.ad9931311b8ecp-68, 0x1.002606p+0, -0x1.b6b8f8483cb8ap-11, -0x1.a420a70defa7ep-66}, // -19 * 0x1p-15 = -0x1.3p-11
393 {-0x1.1fff7a72ca775p-11, 0x1.aea88be309574p-65, 0x1.002405p+0, -0x1.9f9b7e01254bbp-11, -0x1.c8a232d7c8e17p-65}, // -18 * 0x1p-15 = -0x1.2p-11
394 {-0x1.1003da2cf2c4ep-11, -0x1.1c41d9b3ccde4p-67, 0x1.002205p+0, -0x1.88895e899a0e7p-11, -0x1.3415020e9821cp-70}, // -17 * 0x1p-15 = -0x1.1p-11
395 {-0x1.fffff801p-12, 0x1.ffc00000ffep-67, 0x1.002004p+0, -0x1.716b87c16a4f1p-11, 0x1.c6eac065f85abp-65}, // -16 * 0x1p-15 = -0x1p-11
396 {-0x1.e007b7985d46bp-12, -0x1.08f5ef0a25138p-70, 0x1.001e04p+0, -0x1.5a590bf57ebcep-11, 0x1.151eeb7ec0e04p-65}, // -15 * 0x1p-15 = -0x1.ep-12
397 {-0x1.bffefadc92ef6p-12, 0x1.f99c34fd5faa9p-66, 0x1.001c03p+0, -0x1.433ad8a9523d2p-11, 0x1.d2953a8738b2p-68}, // -14 * 0x1p-15 = -0x1.cp-12
398 {-0x1.a005ba8afcb2bp-12, -0x1.38e2315c560b3p-66, 0x1.001a03p+0, -0x1.2c28008623486p-11, 0x1.2bb8ac53bf8bap-65}, // -13 * 0x1p-15 = -0x1.ap-12
399 {-0x1.7ffbfd6046fe9p-12, -0x1.e4f33d6857bcfp-66, 0x1.001802p+0, -0x1.150970b31577bp-11, -0x1.312211364d9acp-65}, // -12 * 0x1p-15 = -0x1.8p-12
400 {-0x1.6001bd19bc4fap-12, 0x1.28162bc81077p-67, 0x1.001602p+0, -0x1.fbec786b7fep-12, 0x1.b62f5eef321d9p-72}, // -11 * 0x1p-15 = -0x1.6p-12
401 {-0x1.4006fcf42ef27p-12, 0x1.a7315cd65c872p-67, 0x1.001402p+0, -0x1.cdc5b32b9541cp-12, -0x1.ecbff88929b1bp-67}, // -10 * 0x1p-15 = -0x1.4p-12
402 {-0x1.1ffbbf2c931e8p-12, 0x1.2df263c7099d9p-66, 0x1.001201p+0, -0x1.9f877dfd195aep-12, -0x1.743a3a7d1d1c6p-67}, // -9 * 0x1p-15 = -0x1.2p-12
403 {-0x1.fffffe002p-13, 0x1.ffe000001ffep-73, 0x1.001001p+0, -0x1.71600000383c6p-12, 0x1.9526447913a46p-67}, // -8 * 0x1p-15 = -0x1p-12
404 {-0x1.c0077dd716befp-13, 0x1.61e46020d9d3fp-67, 0x1.000e01p+0, -0x1.433825b9c3cfcp-12, -0x1.14efc90dff243p-67}, // -7 * 0x1p-15 = -0x1.cp-13
405 {-0x1.800dfdd80be1ap-13, 0x1.a7c48921cde13p-67, 0x1.000c01p+0, -0x1.150fef284b018p-12, -0x1.469f0e824b16fp-66}, // -6 * 0x1p-15 = -0x1.8p-13
406 {-0x1.3ff3807cfb1e3p-13, -0x1.a42f96242296ap-70, 0x1.000ap+0, -0x1.cda08fd39db35p-13, -0x1.a3a134d498d23p-68}, // -5 * 0x1p-15 = -0x1.4p-13
407 {-0x1.fff0007ffc002p-14, 0x1.fff0007ffcp-79, 0x1.0008p+0, -0x1.714eb11fa5363p-13, -0x1.d523885ac824cp-67}, // -4 * 0x1p-15 = -0x1p-13
408 {-0x1.7ff70035febcp-14, -0x1.e5f49c445666p-68, 0x1.0006p+0, -0x1.14fc19ccfba78p-13, -0x1.b48516b2c97bp-67}, // -3 * 0x1p-15 = -0x1.8p-14
409 {-0x1.fff8001fff8p-15, -0x1.fff8001fff8p-71, 0x1.0004p+0, -0x1.715193b17d35dp-14, -0x1.945957f63330ap-69}, // -2 * 0x1p-15 = -0x1p-14
410 {-0x1.fffc0007fffp-16, -0x1.fffc0007fffp-76, 0x1.0002p+0, -0x1.715305002e4aep-15, -0x1.19bb4192806b9p-69}, // -1 * 0x1p-15 = -0x1p-15
411 {0x0p+0, 0x0p+0, 0x1p+0, 0x0p+0, 0x0p+0}, // 0 * 0x1p-15 = 0x0p+0
412 {0x1.000200040008p-15, 0x1.000200040008p-75, 0x1.fffcp-1, 0x1.7155e7a91af62p-15, -0x1.79ddac1de6789p-69}, // 1 * 0x1p-15 = 0x1p-15
413 {0x1.00040010004p-14, 0x1.00040010004p-70, 0x1.fff8p-1, 0x1.7157590356aeep-14, -0x1.88fb2ea8bf9eap-70}, // 2 * 0x1p-15 = 0x1p-14
414 {0x1.800900360144p-14, 0x1.e60b6444599a2p-68, 0x1.fff4p-1, 0x1.150297c91090ap-13, -0x1.39f3d5431038p-70}, // 3 * 0x1p-15 = 0x1.8p-14
415 {0x1.0008004002001p-13, 0x1.0008004002p-78, 0x1.fffp-1, 0x1.715a3bc3593d5p-13, -0x1.5aeaee345d04ep-68}, // 4 * 0x1p-15 = 0x1p-13
416 {0x1.3ffc7f3cfa222p-13, 0x1.b61cd8456449dp-67, 0x1.ffec01p-1, 0x1.cd9b82452b0eap-13, 0x1.562dcc044f7b1p-67}, // 5 * 0x1p-15 = 0x1.4p-13
417 {0x1.8001ff57f71ffp-13, -0x1.9f277309d0bc4p-67, 0x1.ffe801p-1, 0x1.14fa4bbfda6edp-12, -0x1.296f743dffc8dp-67}, // 6 * 0x1p-15 = 0x1.8p-13
418 {0x1.bff87dd6e942fp-13, -0x1.501b1c2b6f43fp-67, 0x1.ffe402p-1, 0x1.431ba7759d6ebp-12, 0x1.96aff97160e09p-67}, // 7 * 0x1p-15 = 0x1.cp-13
419 {0x1.fffffdffep-13, 0x1.000fffffefffp-72, 0x1.ffe002p-1, 0x1.7148eab8c7863p-12, 0x1.8d1a70a989346p-66}, // 8 * 0x1p-15 = 0x1p-12
420 {0x1.1ffc3e0c6281ep-12, -0x1.5c9934bacf538p-66, 0x1.ffdc03p-1, 0x1.9f6afee927edap-12, 0x1.1a07a42134f5bp-67}, // 9 * 0x1p-15 = 0x1.2p-12
421 {0x1.4000fe33da8fcp-12, 0x1.5ce557df8572ap-66, 0x1.ffd803p-1, 0x1.cd98fad7fc194p-12, 0x1.4a28b4d5b941fp-66}, // 10 * 0x1p-15 = 0x1.4p-12
422 {0x1.5ffe3d1943b1ap-12, -0x1.43bf0fe3df757p-68, 0x1.ffd404p-1, 0x1.fbbbc788bd7dbp-12, -0x1.a1ecb71fc14d1p-66}, // 11 * 0x1p-15 = 0x1.6p-12
423 {0x1.8003fd5fb8feap-12, -0x1.e4ecc26860443p-66, 0x1.ffd004p-1, 0x1.14f53e1480736p-11, -0x1.be81d6fe3c64bp-67}, // 12 * 0x1p-15 = 0x1.8p-12
424 {0x1.a0023c2a16afep-12, 0x1.29203e5f85179p-66, 0x1.ffcc05p-1, 0x1.2c0700aff3916p-11, -0x1.7e0b0a3055e38p-65}, // 13 * 0x1p-15 = 0x1.ap-12
425 {0x1.c000fadb6d0f6p-12, -0x1.264bb4d4e42a7p-66, 0x1.ffc806p-1, 0x1.4318f1683f912p-11, -0x1.41125302f1e13p-66}, // 14 * 0x1p-15 = 0x1.cp-12
426 {0x1.e0003976bb20dp-12, -0x1.b6c63d3b7721ap-68, 0x1.ffc407p-1, 0x1.5a2b103e1cccdp-11, -0x1.9c7a50b63aa7ep-68}, // 15 * 0x1p-15 = 0x1.ep-12
427 {0x1.fffff7ffp-12, 0x1.001fffff7ffp-66, 0x1.ffc008p-1, 0x1.713d5d3243a2ep-11, 0x1.cffa276bae12fp-65}, // 16 * 0x1p-15 = 0x1p-11
428 {0x1.10001b3b9d706p-11, -0x1.ac15ab5a607dcp-66, 0x1.ffbc09p-1, 0x1.884fd8456c763p-11, -0x1.15393c2de35d6p-68}, // 17 * 0x1p-15 = 0x1.1p-11
429 {0x1.20007a7135875p-11, 0x1.f77da3d595d5ep-68, 0x1.ffb80ap-1, 0x1.9f6281784fadcp-11, 0x1.b945ee8a950fp-66}, // 18 * 0x1p-15 = 0x1.2p-11
430 {0x1.300119a1c7f6bp-11, 0x1.34c29c41034b1p-65, 0x1.ffb40bp-1, 0x1.b67558cba5b51p-11, 0x1.9b0f7d5ba9b96p-68}, // 19 * 0x1p-15 = 0x1.3p-11
431 {0x1.4001f8ced47c6p-11, -0x1.6332077dff83p-65, 0x1.ffb00cp-1, 0x1.cd885e4026fbdp-11, 0x1.cd357e7f321a1p-65}, // 20 * 0x1p-15 = 0x1.4p-11
432 {0x1.4fff16a9be3a9p-11, 0x1.684120d59b25ap-67, 0x1.ffac0ep-1, 0x1.e495cb9252742p-11, 0x1.4073ecda6d7b7p-65}, // 21 * 0x1p-15 = 0x1.5p-11
433 {0x1.600075c43a46cp-11, 0x1.1d2c5343832a1p-65, 0x1.ffa80fp-1, 0x1.fba92d3fc7f97p-11, -0x1.d0c0c2d8d7106p-65}, // 22 * 0x1p-15 = 0x1.6p-11
434 {0x1.6ffe136f8e666p-11, 0x1.159ec14ef6c54p-66, 0x1.ffa411p-1, 0x1.095b7b5aa1f56p-10, -0x1.db7ef19c74ad4p-64}, // 23 * 0x1p-15 = 0x1.7p-11
435 {0x1.7ffff27d78001p-11, 0x1.b3115ff661d2bp-65, 0x1.ffa012p-1, 0x1.14e55a4f47745p-10, 0x1.3953723c61a5cp-64}, // 24 * 0x1p-15 = 0x1.8p-11
436 {0x1.8ffe0fff33381p-11, -0x1.c39c4ae285513p-65, 0x1.ff9c14p-1, 0x1.206c6d1d1df2fp-10, 0x1.dc61965f32a93p-65}, // 25 * 0x1p-15 = 0x1.9p-11
437 {0x1.a0006f0688c6p-11, 0x1.ce4e54f30ae24p-66, 0x1.ff9815p-1, 0x1.2bf67a311edcbp-10, -0x1.5801b43c1ca0dp-64}, // 26 * 0x1p-15 = 0x1.ap-11
438 {0x1.afff0c64a82cfp-11, 0x1.f6b790232870fp-66, 0x1.ff9417p-1, 0x1.377dbb137e3cp-10, 0x1.f0791610bacfp-66}, // 27 * 0x1p-15 = 0x1.bp-11
439 {0x1.c001eb6b6875dp-11, 0x1.c0567de77cbc7p-68, 0x1.ff9018p-1, 0x1.4307f6484b502p-10, -0x1.c3e70188b37e3p-64}, // 28 * 0x1p-15 = 0x1.cp-11
440 {0x1.d00108abe9823p-11, -0x1.aebfb9904e456p-66, 0x1.ff8c1ap-1, 0x1.4e8f6540a3fc3p-10, -0x1.f1b9086283c46p-64}, // 29 * 0x1p-15 = 0x1.dp-11
441 {0x1.e00065d7d9051p-11, -0x1.5d5f8f4a5b976p-68, 0x1.ff881cp-1, 0x1.5a16eb41a0f0ep-10, 0x1.f9d41d99af255p-64}, // 30 * 0x1p-15 = 0x1.ep-11
442 {0x1.f00002f0b62p-11, 0x1.1462dfc0657c5p-67, 0x1.ff841ep-1, 0x1.659e884b9e38cp-10, 0x1.1a03298288426p-66}, // 31 * 0x1p-15 = 0x1.fp-11
443 {0x1.ffffdff800008p-11, 0x1.ffffdff800008p-71, 0x1.ff802p-1, 0x1.71263c5ef7e04p-10, 0x1.288c11a74fc32p-64}, // 32 * 0x1p-15 = 0x1p-10
444 {0x1.07fffe779afp-10, 0x1.2c6d603f8cfe2p-67, 0x1.ff7c22p-1, 0x1.7cae077c09f63p-10, -0x1.3afdeb3cf5486p-64}, // 33 * 0x1p-15 = 0x1.08p-10
445 {0x1.10002cebeb81fp-10, 0x1.fdae868575fdfp-64, 0x1.ff7824p-1, 0x1.8835e9a3308b5p-10, 0x1.360a818e955aep-64}, // 34 * 0x1p-15 = 0x1.1p-10
446 {0x1.18007b59b15edp-10, 0x1.f13d75e6ad534p-64, 0x1.ff7426p-1, 0x1.93bde2d4c7b2dp-10, -0x1.70c8c3a9c376cp-64}, // 35 * 0x1p-15 = 0x1.18p-10
447 {0x1.2000e9c1ac355p-10, -0x1.3b2dac38de8a2p-65, 0x1.ff7028p-1, 0x1.9f45f3112b81cp-10, -0x1.1e2ccb3307d2cp-64}, // 36 * 0x1p-15 = 0x1.2p-10
448 {0x1.27ff76fc707a5p-10, -0x1.72c68e4171f87p-70, 0x1.ff6c2bp-1, 0x1.aacb36da463f7p-10, -0x1.a3d5e7a67d81dp-64}, // 37 * 0x1p-15 = 0x1.28p-10
449 {0x1.3000255311616p-10, -0x1.07f200a56c0d9p-64, 0x1.ff682dp-1, 0x1.b653752791d5ep-10, 0x1.49eeaee3e7e22p-64}, // 38 * 0x1p-15 = 0x1.3p-10
450 {0x1.3800f3a62641ep-10, 0x1.e46064e7e564ap-64, 0x1.ff642fp-1, 0x1.c1dbca80be495p-10, -0x1.2bad1331ec7f7p-64}, // 39 * 0x1p-15 = 0x1.38p-10
451 {0x1.3fffe0b63c00fp-10, 0x1.1c12ce2294ad1p-64, 0x1.ff6032p-1, 0x1.cd61535665a58p-10, -0x1.e3b9cbe22421ep-65}, // 40 * 0x1p-15 = 0x1.4p-10
452 {0x1.4800eefc7497bp-10, 0x1.301f5325738d3p-64, 0x1.ff5c34p-1, 0x1.d8e9d6c2a2198p-10, -0x1.020e70a4fe47p-65}, // 41 * 0x1p-15 = 0x1.48p-10
453 {0x1.50001bf12820cp-10, 0x1.7838fa4800bd8p-65, 0x1.ff5837p-1, 0x1.e46f8da086d2ep-10, -0x1.3b01368943604p-65}, // 42 * 0x1p-15 = 0x1.5p-10
454 {0x1.57ff68d548c65p-10, -0x1.a8742af1442f9p-64, 0x1.ff543ap-1, 0x1.eff55b8031c2ap-10, 0x1.ba7b9ae7bd98bp-64}, // 43 * 0x1p-15 = 0x1.58p-10
455 {0x1.6000d709d22d2p-10, -0x1.c82f0ab62b5d9p-64, 0x1.ff503cp-1, 0x1.fb7e2408d562ep-10, -0x1.5dcbd30b0022cp-64}, // 44 * 0x1p-15 = 0x1.6p-10
456 {0x1.680063d70d51cp-10, -0x1.da2a40827aef3p-64, 0x1.ff4c3fp-1, 0x1.03820ff972b21p-9, 0x1.3dda8489194dfp-65}, // 45 * 0x1p-15 = 0x1.68p-10
457 {0x1.70001095f3c04p-10, 0x1.2b39520716f95p-64, 0x1.ff4842p-1, 0x1.0945196fe7ae9p-9, -0x1.92d80f790e27dp-64}, // 46 * 0x1p-15 = 0x1.7p-10
458 {0x1.77ffdd4744d93p-10, -0x1.8460e33c618c3p-65, 0x1.ff4445p-1, 0x1.0f082e67f79acp-9, -0x1.2d7918e1c1793p-63}, // 47 * 0x1p-15 = 0x1.78p-10
459 {0x1.7fffc9ebc002ep-10, -0x1.7ba8099ffaa38p-64, 0x1.ff4048p-1, 0x1.14cb4ee1d06b9p-9, -0x1.3d0449b698d96p-63}, // 48 * 0x1p-15 = 0x1.8p-10
460 {0x1.87ffd68424a9bp-10, -0x1.3533d48c46104p-65, 0x1.ff3c4bp-1, 0x1.1a8e7adda017p-9, -0x1.05480904c87d1p-64}, // 49 * 0x1p-15 = 0x1.88p-10
461 {0x1.90000311324p-10, 0x1.2c953c80e6224p-65, 0x1.ff384ep-1, 0x1.2051b25b94943p-9, -0x1.b10b812d27a9bp-63}, // 50 * 0x1p-15 = 0x1.9p-10
462 {0x1.98004f93a83e3p-10, -0x1.ac0592817deabp-65, 0x1.ff3451p-1, 0x1.2614f55bdbdb3p-9, 0x1.5f1b3571315bp-63}, // 51 * 0x1p-15 = 0x1.98p-10
463 {0x1.a000bc0c46228p-10, -0x1.5ff9036a88b81p-64, 0x1.ff3054p-1, 0x1.2bd843dea3e56p-9, -0x1.3aaab92869c01p-65}, // 52 * 0x1p-15 = 0x1.ap-10
464 {0x1.a7ff46d373617p-10, -0x1.7cfcbf2bb73e6p-66, 0x1.ff2c58p-1, 0x1.319a2bf6b7476p-9, 0x1.87699b4e05189p-63}, // 53 * 0x1p-15 = 0x1.a8p-10
465 {0x1.affff3329ba03p-10, -0x1.c5ed5170ad8fbp-64, 0x1.ff285bp-1, 0x1.375d917c27e0bp-9, 0x1.f5df5dccce818p-65}, // 54 * 0x1p-15 = 0x1.bp-10
466 {0x1.b800bf8a2a33cp-10, 0x1.1fbb5daedaefp-64, 0x1.ff245ep-1, 0x1.3d210284a323cp-9, -0x1.f578a6f395acdp-64}, // 55 * 0x1p-15 = 0x1.b8p-10
467 {0x1.bfffaa1a7c073p-10, 0x1.683d25ccd5612p-66, 0x1.ff2062p-1, 0x1.42e30d1a4b89ep-9, 0x1.c35ac071e3f6p-63}, // 56 * 0x1p-15 = 0x1.cp-10
468 {0x1.c800b65d11787p-10, -0x1.1493791cd773cp-64, 0x1.ff1c65p-1, 0x1.48a6952683107p-9, -0x1.d37a56220787dp-68}, // 57 * 0x1p-15 = 0x1.c8p-10
469 {0x1.cfffe0c9e1e0fp-10, 0x1.8dc34eed35cccp-65, 0x1.ff1869p-1, 0x1.4e68b6ba7e475p-9, -0x1.89323eb9ff693p-63}, // 58 * 0x1p-15 = 0x1.dp-10
470 {0x1.d7ff2b220f043p-10, -0x1.118eeba3b048fp-64, 0x1.ff146dp-1, 0x1.542ae3cc7690dp-9, -0x1.ab0ef1276d28p-66}, // 59 * 0x1p-15 = 0x1.d8p-10
471 {0x1.e0009746c8165p-10, -0x1.4ffeb5e58bcf5p-66, 0x1.ff107p-1, 0x1.59ee8e5e2f905p-9, 0x1.f466a629b4413p-63}, // 60 * 0x1p-15 = 0x1.ep-10
472 {0x1.e800217fef612p-10, -0x1.fda2bc16c43c6p-64, 0x1.ff0c74p-1, 0x1.5fb0d26f8e1c8p-9, 0x1.971f054294b07p-63}, // 61 * 0x1p-15 = 0x1.e8p-10
473 {0x1.efffcba6b102bp-10, -0x1.0c5a0cb90ea7cp-64, 0x1.ff0878p-1, 0x1.657321ff7367fp-9, -0x1.13863f56c3cbap-63}, // 62 * 0x1p-15 = 0x1.fp-10
474 {0x1.f7ff95bbcc2bp-10, 0x1.b86e5ba661b1dp-66, 0x1.ff047cp-1, 0x1.6b357d0e0d55p-9, 0x1.570efd19d249fp-63}, // 63 * 0x1p-15 = 0x1.f8p-10
475 {0x1.ffff7fc0001p-10, 0x1.ffff7fc0001p-64, 0x1.ff008p-1, 0x1.70f7e39b89c76p-9, 0x1.d4c4a05fc792p-64}, // 64 * 0x1p-15 = 0x1p-9
476 {0x1.03ffc4da05f6dp-9, 0x1.cce7f6f79c117p-65, 0x1.fefc84p-1, 0x1.76ba55a816a3bp-9, -0x1.92f8c9f16636dp-63}, // 65 * 0x1p-15 = 0x1.04p-9
477 {0x1.07ffd9cc5782ep-9, -0x1.f1d10b8e6e5f1p-63, 0x1.fef888p-1, 0x1.7c7cd333e1cf9p-9, -0x1.4a74c729efcc7p-64}, // 66 * 0x1p-15 = 0x1.08p-9
478 {0x1.0bfffeb7545p-9, 0x1.a51bf97ef23a1p-66, 0x1.fef48cp-1, 0x1.823f5c3f1931dp-9, 0x1.e6be82f9936a4p-63}, // 67 * 0x1p-15 = 0x1.0cp-9
479 {0x1.1000339b5c053p-9, 0x1.c1030b552a0e6p-66, 0x1.fef09p-1, 0x1.8801f0c9eab26p-9, 0x1.fb21627ede9cap-64}, // 68 * 0x1p-15 = 0x1.1p-9
480 {0x1.14007878ce4c5p-9, -0x1.a09be39ba21a6p-63, 0x1.feec94p-1, 0x1.8dc490d4843a2p-9, 0x1.1df60724d15b3p-65}, // 69 * 0x1p-15 = 0x1.14p-9
481 {0x1.17ffcc37bdf54p-9, -0x1.8a096f691bb04p-63, 0x1.fee899p-1, 0x1.9385ca40a2f84p-9, 0x1.b2d801a1718c5p-64}, // 70 * 0x1p-15 = 0x1.18p-9
482 {0x1.1c00310521d0bp-9, -0x1.1d7bfb3ad6193p-65, 0x1.fee49dp-1, 0x1.99488148735bdp-9, 0x1.4bca52ef093abp-63}, // 71 * 0x1p-15 = 0x1.1cp-9
483 {0x1.1fffa4acbe104p-9, 0x1.016c3b6e2f2cbp-65, 0x1.fee0a2p-1, 0x1.9f09d1ac5f8c3p-9, -0x1.178499ab07001p-63}, // 72 * 0x1p-15 = 0x1.2p-9
484 {0x1.2400296b91eb5p-9, 0x1.fa355249a451dp-63, 0x1.fedca6p-1, 0x1.a4cc9fb21e4e2p-9, -0x1.f6c361e551821p-63}, // 73 * 0x1p-15 = 0x1.24p-9
485 {0x1.27ffbcfd58d8cp-9, 0x1.157f10c7c3624p-68, 0x1.fed8abp-1, 0x1.aa8e070e8f496p-9, 0x1.ddf7110a08fbap-64}, // 74 * 0x1p-15 = 0x1.28p-9
486 {0x1.2c0061af1b36ap-9, -0x1.f3ff38a575161p-63, 0x1.fed4afp-1, 0x1.b050ec12f3f4cp-9, 0x1.9f4f4b855ee07p-63}, // 75 * 0x1p-15 = 0x1.2cp-9
487 {0x1.3000152c8b00ep-9, -0x1.660f1b16c5ff9p-67, 0x1.fed0b4p-1, 0x1.b6126a68a11c6p-9, -0x1.111e0077b33e7p-63}, // 76 * 0x1p-15 = 0x1.3p-9
488 {0x1.33ffd89e5d7fp-9, 0x1.683f53ed9b1bfp-63, 0x1.feccb9p-1, 0x1.bbd3f439bfe2ap-9, 0x1.129f92e605dffp-63}, // 77 * 0x1p-15 = 0x1.34p-9
489 {0x1.37ffac04f22dcp-9, -0x1.ff31042b59debp-65, 0x1.fec8bep-1, 0x1.c19589867e17bp-9, -0x1.990d948d9f518p-63}, // 78 * 0x1p-15 = 0x1.38p-9
490 {0x1.3bff8f60a88cbp-9, 0x1.a9c8e5d3d5357p-63, 0x1.fec4c3p-1, 0x1.c7572a4f098c8p-9, 0x1.d45d2d574df26p-63}, // 79 * 0x1p-15 = 0x1.3cp-9
491 {0x1.3fff82b1e01e9p-9, 0x1.e4b221ffaa82bp-63, 0x1.fec0c8p-1, 0x1.cd18d69390137p-9, -0x1.2e623eb44a04bp-63}, // 80 * 0x1p-15 = 0x1.4p-9
492 {0x1.43ff85f8f869p-9, 0x1.7eec78527601bp-64, 0x1.febccdp-1, 0x1.d2da8e543f7f9p-9, 0x1.65d0701b3da64p-63}, // 81 * 0x1p-15 = 0x1.44p-9
493 {0x1.47ff993650f49p-9, 0x1.5edc71502ce2ep-63, 0x1.feb8d2p-1, 0x1.d89c519145a56p-9, -0x1.d56cec800da7fp-63}, // 82 * 0x1p-15 = 0x1.48p-9
494 {0x1.4bffbc6a494cep-9, 0x1.8559d0be24239p-63, 0x1.feb4d7p-1, 0x1.de5e204ad05a2p-9, -0x1.b1d7a3b123d4ep-63}, // 83 * 0x1p-15 = 0x1.4cp-9
495 {0x1.4fffef9541008p-9, 0x1.9a7ef2ecdf10ap-63, 0x1.feb0dcp-1, 0x1.e41ffa810d745p-9, -0x1.a993481e299bdp-65}, // 84 * 0x1p-15 = 0x1.5p-9
496 {0x1.540032b797a1p-9, 0x1.64cc12b8c075ap-64, 0x1.feace1p-1, 0x1.e9e1e0342acb8p-9, 0x1.7b883d781fdd4p-65}, // 85 * 0x1p-15 = 0x1.54p-9
497 {0x1.57ff8479392dcp-9, -0x1.a4e312ac18b3fp-63, 0x1.fea8e7p-1, 0x1.efa25f17bb226p-9, 0x1.c71d718c58d2ap-67}, // 86 * 0x1p-15 = 0x1.58p-9
498 {0x1.5bffe78769513p-9, -0x1.581c4c9f08c6bp-63, 0x1.fea4ecp-1, 0x1.f5645bc23f8e1p-9, 0x1.cee36238719a1p-64}, // 87 * 0x1p-15 = 0x1.5cp-9
499 {0x1.60005a8e171p-9, -0x1.b7efa5ad99dd9p-63, 0x1.fea0f1p-1, 0x1.fb2663ea2db85p-9, -0x1.552e795894889p-63}, // 88 * 0x1p-15 = 0x1.6p-9
500 {0x1.63ffdc2925e68p-9, 0x1.f28eb6b7323b9p-67, 0x1.fe9cf7p-1, 0x1.0073829d38167p-8, -0x1.c5c6221acedf4p-67}, // 89 * 0x1p-15 = 0x1.64p-9
501 {0x1.68006f1dea581p-9, -0x1.b73ff0c3d12ebp-64, 0x1.fe98fcp-1, 0x1.0354922d6c2aep-8, -0x1.62a9bee9f7522p-63}, // 90 * 0x1p-15 = 0x1.68p-9
502 {0x1.6c00109fc9389p-9, -0x1.8ce1845671c55p-63, 0x1.fe9502p-1, 0x1.0634ee4f15805p-8, -0x1.2973908f16839p-62}, // 91 * 0x1p-15 = 0x1.6cp-9
503 {0x1.6fffc2139e077p-9, 0x1.f894365aa51ffp-63, 0x1.fe9108p-1, 0x1.0915502cec9cfp-8, 0x1.c26341891fb94p-62}, // 92 * 0x1p-15 = 0x1.7p-9
504 {0x1.73ff8379c8263p-9, 0x1.9a87c6285fd65p-64, 0x1.fe8d0ep-1, 0x1.0bf5b7c7085fbp-8, -0x1.a6ae1b5a0fc18p-62}, // 93 * 0x1p-15 = 0x1.74p-9
505 {0x1.7800564b30de8p-9, 0x1.4df109a61f504p-66, 0x1.fe8913p-1, 0x1.0ed6de4f57c53p-8, 0x1.04149239acf29p-62}, // 94 * 0x1p-15 = 0x1.78p-9
506 {0x1.7c00379b26a2p-9, 0x1.630c806af2e59p-63, 0x1.fe8519p-1, 0x1.11b75163b2bbdp-8, 0x1.9ea9a295d7e25p-62}, // 95 * 0x1p-15 = 0x1.7cp-9
507 {0x1.800028de90034p-9, 0x1.6d6c848d15831p-66, 0x1.fe811fp-1, 0x1.1497ca3496fddp-8, 0x1.34ca92074b5e6p-65}, // 96 * 0x1p-15 = 0x1.8p-9
508 {0x1.84002a15cc6f7p-9, 0x1.7bac132085b33p-64, 0x1.fe7d25p-1, 0x1.177848c21b6c1p-8, -0x1.fb96ec6aab17cp-65}, // 97 * 0x1p-15 = 0x1.84p-9
509 {0x1.88003b413b56dp-9, 0x1.9538b4c5c9dd1p-63, 0x1.fe792bp-1, 0x1.1a58cd0c56e8p-8, 0x1.c91427cdc0a92p-62}, // 98 * 0x1p-15 = 0x1.88p-9
510 {0x1.8c005c613c2cap-9, -0x1.d63fed50775dep-65, 0x1.fe7531p-1, 0x1.1d3957136053bp-8, 0x1.d5b40059cf7f2p-62}, // 99 * 0x1p-15 = 0x1.8cp-9
511 {0x1.8fff8be5921a4p-9, -0x1.0ccf5e333a9e9p-66, 0x1.fe7138p-1, 0x1.20192d9cce658p-8, -0x1.0ef8613c770a8p-66}, // 100 * 0x1p-15 = 0x1.9p-9
512 {0x1.93ffccebd1cd1p-9, 0x1.20f4111deaf9dp-63, 0x1.fe6d3ep-1, 0x1.22f9c31c46ecdp-8, 0x1.e687045f12bdep-63}, // 101 * 0x1p-15 = 0x1.94p-9
513 {0x1.98001de7c1c1cp-9, -0x1.1cafe805939e2p-64, 0x1.fe6944p-1, 0x1.25da5e58d2075p-8, -0x1.2780ef22d42f2p-64}, // 102 * 0x1p-15 = 0x1.98p-9
514 {0x1.9c007ed9c1775p-9, 0x1.14fc8cb270e7dp-63, 0x1.fe654ap-1, 0x1.28baff5286991p-8, 0x1.662631716e756p-63}, // 103 * 0x1p-15 = 0x1.9cp-9
515 {0x1.9fffee218700ap-9, -0x1.b534bb12ca226p-66, 0x1.fe6151p-1, 0x1.2b9aecc935e56p-8, -0x1.bc5d90b8f1d66p-62}, // 104 * 0x1p-15 = 0x1.ap-9
516 {0x1.a4006efcc0fcp-9, -0x1.2524335057878p-63, 0x1.fe5d57p-1, 0x1.2e7b993c10914p-8, 0x1.f628411d6d3ap-62}, // 105 * 0x1p-15 = 0x1.a4p-9
517 {0x1.a7fffe26792p-9, 0x1.b488567e6d925p-65, 0x1.fe595ep-1, 0x1.315b9229310e3p-8, 0x1.32c89a9297db7p-63}, // 106 * 0x1p-15 = 0x1.a8p-9
518 {0x1.abff9d3fb81fp-9, -0x1.fd773e728eb87p-64, 0x1.fe5565p-1, 0x1.343b90d0f3d29p-8, -0x1.2bee748b1f835p-63}, // 107 * 0x1p-15 = 0x1.acp-9
519 {0x1.b0004df9934bdp-9, 0x1.8395f5bc85576p-63, 0x1.fe516bp-1, 0x1.371c4e797a6cdp-8, 0x1.cb72f84415034p-63}, // 108 * 0x1p-15 = 0x1.bp-9
520 {0x1.b4000cf700f85p-9, 0x1.e1f0223699c58p-64, 0x1.fe4d72p-1, 0x1.39fc5898377e4p-8, -0x1.3ca140097dc4fp-66}, // 109 * 0x1p-15 = 0x1.b4p-9
521 {0x1.b7ffdbe513729p-9, -0x1.98e4f9b1fb184p-63, 0x1.fe4979p-1, 0x1.3cdc6871db5f2p-8, -0x1.9345680cc160ap-62}, // 110 * 0x1p-15 = 0x1.b8p-9
522 {0x1.bbffbac42a095p-9, 0x1.24156f86a31c8p-63, 0x1.fe458p-1, 0x1.3fbc7e067ce68p-8, 0x1.d359695e8eea6p-62}, // 111 * 0x1p-15 = 0x1.bcp-9
523 {0x1.bfffa994a40e9p-9, -0x1.a4362c7f90a32p-63, 0x1.fe4187p-1, 0x1.429c995632ec3p-8, 0x1.b08bee8756463p-62}, // 112 * 0x1p-15 = 0x1.cp-9
524 {0x1.c3ffa856e0d6fp-9, 0x1.3f4bc4afbd407p-63, 0x1.fe3d8ep-1, 0x1.457cba6114486p-8, -0x1.16f1c6f118e6ap-64}, // 113 * 0x1p-15 = 0x1.c4p-9
525 {0x1.c7ffb70b3fba6p-9, -0x1.f7754e3b6281cp-64, 0x1.fe3995p-1, 0x1.485ce12737d3cp-8, -0x1.9831ce103ecbep-65}, // 114 * 0x1p-15 = 0x1.c8p-9
526 {0x1.cbffd5b220138p-9, -0x1.13a306aace17bp-63, 0x1.fe359cp-1, 0x1.4b3d0da8b467ap-8, -0x1.33f8c2e5f53b8p-66}, // 115 * 0x1p-15 = 0x1.ccp-9
527 {0x1.d000044be1401p-9, -0x1.b36474bb14031p-63, 0x1.fe31a3p-1, 0x1.4e1d3fe5a0dddp-8, 0x1.19489e0a375efp-64}, // 116 * 0x1p-15 = 0x1.dp-9
528 {0x1.d40042d8e2a0bp-9, 0x1.29a5e1f98912bp-64, 0x1.fe2daap-1, 0x1.50fd77de1410bp-8, -0x1.9fbaf9e3baa81p-63}, // 117 * 0x1p-15 = 0x1.d4p-9
529 {0x1.d7ff8f80a9f8ap-9, 0x1.20c9a519465a7p-65, 0x1.fe29b2p-1, 0x1.53dcfc3dacbd4p-8, 0x1.ca9cdb11dc86bp-64}, // 118 * 0x1p-15 = 0x1.d8p-9
530 {0x1.dbffedf145dcap-9, 0x1.393e42134e08fp-64, 0x1.fe25b9p-1, 0x1.56bd3fac00842p-8, -0x1.8e164f95b2c0ap-62}, // 119 * 0x1p-15 = 0x1.dcp-9
531 {0x1.e0005c5640109p-9, 0x1.dfe0bece3a625p-63, 0x1.fe21cp-1, 0x1.599d88d61f942p-8, -0x1.3e38aab655813p-62}, // 120 * 0x1p-15 = 0x1.ep-9
532 {0x1.e3ffd8cb12e3p-9, -0x1.1f2470b617c04p-64, 0x1.fe1dc8p-1, 0x1.5c7d1e6354942p-8, -0x1.672c401514e5bp-62}, // 121 * 0x1p-15 = 0x1.e4p-9
533 {0x1.e8006715e3a4bp-9, -0x1.32fa14c2a3be1p-64, 0x1.fe19cfp-1, 0x1.5f5d7303dd44ap-8, 0x1.9de715026a889p-64}, // 122 * 0x1p-15 = 0x1.e8p-9
534 {0x1.ec0003694404p-9, 0x1.72f7a4b5765adp-63, 0x1.fe15d7p-1, 0x1.623d1404c6e1bp-8, -0x1.5ed53db89a97ap-62}, // 123 * 0x1p-15 = 0x1.ecp-9
535 {0x1.efffafaa784c9p-9, -0x1.6175d77b00108p-65, 0x1.fe11dfp-1, 0x1.651cbabef46dbp-8, 0x1.d58bed52db82ep-64}, // 124 * 0x1p-15 = 0x1.fp-9
536 {0x1.f4006dced3bf7p-9, 0x1.7e9e6780b774p-63, 0x1.fe0de6p-1, 0x1.67fd20910e165p-8, -0x1.1478031fd6a56p-63}, // 125 * 0x1p-15 = 0x1.f4p-9
537 {0x1.f80039f0d1269p-9, -0x1.f78b02ffd3efdp-63, 0x1.fe09eep-1, 0x1.6adcd2bf792abp-8, 0x1.1800de5a06799p-62}, // 126 * 0x1p-15 = 0x1.f8p-9
538 {0x1.fc001601c028fp-9, 0x1.373040c3f2eaep-65, 0x1.fe05f6p-1, 0x1.6dbc8aa76c9d9p-8, -0x1.49107de58e8a5p-62}, // 127 * 0x1p-15 = 0x1.fcp-9
539 {0x1.00000101p-8, 0x1.0100000101p-64, 0x1.fe01fep-1, 0x1.709c4848ff3ddp-8, -0x1.f86284455f0dfp-62}, // 128 * 0x1p-15 = 0x1p-8
540};
541
542#define LOG2_OVERFLOW_GUARANTEED 1025.
543#define POW_OVERFLOW_GUARANTEED 1025.
544// If |ylg(x)| < 2^-55 then |1 - |x**y|| < 2^-55/ln(2) < ulpd(1.0)
545#define POW_1_GUARANTEED 0x1p-55
546#define POW_UNDERFLOW_GUARANTEED -1100.
547
548static const double lgehi = 0x1.7154768p0, lgelo = -0x2.D47D01E8882F0p-28;
549static const double lge = 0x1.71547652B82FE1777D0p0;
550
551// gcc -Impfr/include -Lmpfr/lib -lmpfr -lgmp powtables.c -O3 -o xpowtables -std=gnu99 -Wall && ./xpowtables
552static const double Exp2Table[][2] = { // d, y-1 for x=i/2**8, d = R(lg(R53(2**x))), thi=R53(2**d1)
553 {0x0p+0, 0x1p+0}, // rerr = 0x0p+0, 2**(0/2**8) + 0/2**53
554 {0x1.000002006be8p-8, 0x1.00b1afa70ff17p+0}, // rerr = -0x1.62b1fe056654p-77, 2**(1/2**8) + 4197757/2**53
555 {0x1.00000278a56cp-7, 0x1.0163daa324ff2p+0}, // rerr = 0x1.986caf551eb28p-77, 2**(2/2**8) + 10365275/2**53
556 {0x1.80000052e12p-7, 0x1.0216814423fd2p+0}, // rerr = 0x1.18df196373e1p-77, 2**(3/2**8) + 1357896/2**53
557 {0x1.000000b822fap-6, 0x1.02c9a3e97c1e4p+0}, // rerr = -0x1.e05b6534c5c5p-79, 2**(4/2**8) + 6033789/2**53
558 {0x1.40000009f2ep-6, 0x1.037d42e137b27p+0}, // rerr = -0x1.a2dbf94bbb808p-78, 2**(5/2**8) + 326000/2**53
559 {0x1.8000018938b2p-6, 0x1.04315e8b3c115p+0}, // rerr = 0x1.87894f515755cp-77, 2**(6/2**8) + 12885081/2**53
560 {0x1.c000004b5a74p-6, 0x1.04e5f7303a36fp+0}, // rerr = 0x1.c84b8bfd7e2c4p-76, 2**(7/2**8) + 2469178/2**53
561 {0x1.0000000b3ce6p-5, 0x1.059b0d3198058p+0}, // rerr = -0x1.9aa2b29072e8cp-77, 2**(8/2**8) + 736486/2**53
562 {0x1.20000036d022p-5, 0x1.0650a0e4f96aap+0}, // rerr = 0x1.b3825dad8318p-78, 2**(9/2**8) + 3592226/2**53
563 {0x1.4000001213b8p-5, 0x1.0706b29e466bbp+0}, // rerr = 0x1.fef036f8868ep-76, 2**(10/2**8) + 1184696/2**53
564 {0x1.60000053dd6p-5, 0x1.07bd42b9099ep+0}, // rerr = 0x1.e7f68d8c79fp-77, 2**(11/2**8) + 5496160/2**53
565 {0x1.8000004f61bfp-5, 0x1.087451892075bp+0}, // rerr = -0x1.7cdf72f7bd5fp-76, 2**(12/2**8) + 5202367/2**53
566 {0x1.a000003a9d64p-5, 0x1.092bdf67b12a8p+0}, // rerr = 0x1.f71f0e8bb465p-76, 2**(13/2**8) + 3841380/2**53
567 {0x1.c00000e28345p-5, 0x1.09e3ecb187ccbp+0}, // rerr = 0x1.8b7368d9b92p-83, 2**(14/2**8) + 14844741/2**53
568 {0x1.e000005ccf04p-5, 0x1.0a9c79b40b8a8p+0}, // rerr = -0x1.6a68fda914206p-76, 2**(15/2**8) + 6082308/2**53
569 {0x1.00000020b2a88p-4, 0x1.0b5586d11340ap+0}, // rerr = 0x1.44f0078506318p-76, 2**(16/2**8) + 4285777/2**53
570 {0x1.1000000a2dbd8p-4, 0x1.0c0f145ebcfc3p+0}, // rerr = -0x1.ce9c6095ecce4p-76, 2**(17/2**8) + 1334139/2**53
571 {0x1.2000001591738p-4, 0x1.0cc922b81fa4ap+0}, // rerr = -0x1.b09f95d5884p-79, 2**(18/2**8) + 2826983/2**53
572 {0x1.300000127c128p-4, 0x1.0d83b2346db19p+0}, // rerr = 0x1.d9f200154e56p-78, 2**(19/2**8) + 2422821/2**53
573 {0x1.40000001ac3bp-4, 0x1.0e3ec32d50afap+0}, // rerr = 0x1.7c0531f62ed3cp-77, 2**(20/2**8) + 219254/2**53
574 {0x1.50000000e57e8p-4, 0x1.0efa55fe05226p+0}, // rerr = -0x1.9d8037e6ffde4p-76, 2**(21/2**8) + 117501/2**53
575 {0x1.60000013bce1p-4, 0x1.0fb66b00d5876p+0}, // rerr = 0x1.805d531027d3ep-76, 2**(22/2**8) + 2587074/2**53
576 {0x1.70000000136cp-4, 0x1.1073028d73192p+0}, // rerr = -0x1.e1836ed7a5476p-76, 2**(23/2**8) + 9944/2**53
577 {0x1.8000005a20d3p-4, 0x1.11301d05505f2p+0}, // rerr = -0x1.09318b5a1ec3p-78, 2**(24/2**8) + 11813286/2**53
578 {0x1.900000053835p-4, 0x1.11edbab6209c3p+0}, // rerr = 0x1.6f92b52dc72b8p-78, 2**(25/2**8) + 684138/2**53
579 {0x1.a000000c21f28p-4, 0x1.12abdc07537b2p+0}, // rerr = 0x1.544e8ecbb05cp-78, 2**(26/2**8) + 1590245/2**53
580 {0x1.b000000715768p-4, 0x1.136a814f74dp+0}, // rerr = 0x1.a0a5b1f9411bep-76, 2**(27/2**8) + 928493/2**53
581 {0x1.c0000006f2418p-4, 0x1.1429aaeae5f8cp+0}, // rerr = -0x1.4e345d15b56dp-77, 2**(28/2**8) + 910467/2**53
582 {0x1.d000001a57828p-4, 0x1.14e959362f13ep+0}, // rerr = -0x1.07e8f8212c3dp-76, 2**(29/2**8) + 3452677/2**53
583 {0x1.e000000cae79p-4, 0x1.15a98c8af1704p+0}, // rerr = -0x1.0e3bcb39671ep-77, 2**(30/2**8) + 1662194/2**53
584 {0x1.f0000045e3cep-4, 0x1.166a454a6734ap+0}, // rerr = 0x1.7aea0ef55fde6p-76, 2**(31/2**8) + 9160604/2**53
585 {0x1.0000000383cecp-3, 0x1.172b83c82a1c7p+0}, // rerr = 0x1.d355c0f1c68fcp-77, 2**(32/2**8) + 921403/2**53
586 {0x1.0800001438468p-3, 0x1.17ed486b46247p+0}, // rerr = 0x1.c0678f09aeffcp-76, 2**(33/2**8) + 5300506/2**53
587 {0x1.10000002d00dp-3, 0x1.18af93890d45fp+0}, // rerr = 0x1.9a333bc270ep-83, 2**(34/2**8) + 737332/2**53
588 {0x1.1800000c1682cp-3, 0x1.197265849c983p+0}, // rerr = 0x1.435da5a20b4b8p-78, 2**(35/2**8) + 3168779/2**53
589 {0x1.20000017a069cp-3, 0x1.1a35beb93e6cep+0}, // rerr = -0x1.7a3ebf29a7a52p-76, 2**(36/2**8) + 6193575/2**53
590 {0x1.2800000cb57fcp-3, 0x1.1af99f82703adp+0}, // rerr = -0x1.2a749979b094p-77, 2**(37/2**8) + 3331583/2**53
591 {0x1.30000032ca86p-3, 0x1.1bbe084526787p+0}, // rerr = -0x1.5d7944954c6b8p-77, 2**(38/2**8) + 13314584/2**53
592 {0x1.3800000a24a88p-3, 0x1.1c82f9537bd11p+0}, // rerr = -0x1.d5c75f60c3204p-76, 2**(39/2**8) + 2658978/2**53
593 {0x1.40000011652f8p-3, 0x1.1d4873183994p+0}, // rerr = 0x1.e96ae1ae7acfp-77, 2**(40/2**8) + 4560062/2**53
594 {0x1.480000077f894p-3, 0x1.1e0e75ebfdd9fp+0}, // rerr = 0x1.f45d7a992ca1cp-76, 2**(41/2**8) + 1965605/2**53
595 {0x1.500000246a5ecp-3, 0x1.1ed5023356925p+0}, // rerr = -0x1.4bd720d687eep-76, 2**(42/2**8) + 9546107/2**53
596 {0x1.5800000d3437p-3, 0x1.1f9c1844d5eep+0}, // rerr = -0x1.2c3079d66a7bdp-75, 2**(43/2**8) + 3461340/2**53
597 {0x1.6000002d6a13cp-3, 0x1.2063b88a9792cp+0}, // rerr = 0x1.724a435fba248p-76, 2**(44/2**8) + 11905103/2**53
598 {0x1.6800000135064p-3, 0x1.212be357a8c02p+0}, // rerr = 0x1.913d1828f76b4p-77, 2**(45/2**8) + 316441/2**53
599 {0x1.7000000af236p-3, 0x1.21f49918f0c89p+0}, // rerr = -0x1.2f6ed549704bcp-77, 2**(46/2**8) + 2869464/2**53
600 {0x1.7800000ddc324p-3, 0x1.22bdda28ee532p+0}, // rerr = 0x1.45fd96c1409dcp-76, 2**(47/2**8) + 3633353/2**53
601 {0x1.80000027763f8p-3, 0x1.2387a6eb3ae9ap+0}, // rerr = 0x1.e9cd979d7eae4p-77, 2**(48/2**8) + 10344702/2**53
602 {0x1.88000005b9428p-3, 0x1.2451ffb8b2383p+0}, // rerr = 0x1.979c186dccfcap-76, 2**(49/2**8) + 1500426/2**53
603 {0x1.9000000cb401cp-3, 0x1.251ce4fc6d00ep+0}, // rerr = 0x1.c9b0bd49e857cp-77, 2**(50/2**8) + 3330055/2**53
604 {0x1.98000011eb0a4p-3, 0x1.25e85713b531p+0}, // rerr = 0x1.0840a8e92d50cp-77, 2**(51/2**8) + 4697129/2**53
605 {0x1.a000000cc720cp-3, 0x1.26b4565f6e137p+0}, // rerr = -0x1.aec71b6c26dp-77, 2**(52/2**8) + 3349635/2**53
606 {0x1.a800000515df8p-3, 0x1.2780e3426027p+0}, // rerr = 0x1.0e0ccc8cbf958p-76, 2**(53/2**8) + 1333118/2**53
607 {0x1.b000000ccc9bp-3, 0x1.284dfe209ecfdp+0}, // rerr = -0x1.71831ed3ebe2p-79, 2**(54/2**8) + 3355244/2**53
608 {0x1.b8000019bdbap-3, 0x1.291ba75bb25abp+0}, // rerr = -0x1.ab229e72f3b46p-76, 2**(55/2**8) + 6747880/2**53
609 {0x1.c0000004cde7cp-3, 0x1.29e9df5279f0bp+0}, // rerr = -0x1.8b22546e8dd5p-78, 2**(56/2**8) + 1259423/2**53
610 {0x1.c800000919978p-3, 0x1.2ab8a66dfc783p+0}, // rerr = -0x1.eec5db085e5ap-76, 2**(57/2**8) + 2385502/2**53
611 {0x1.d000000cfdaf4p-3, 0x1.2b87fd0efebe8p+0}, // rerr = 0x1.7ee8a312cf4p-79, 2**(58/2**8) + 3405501/2**53
612 {0x1.d8000005887fp-3, 0x1.2c57e39801b01p+0}, // rerr = 0x1.4a5833e7f6394p-76, 2**(59/2**8) + 1450492/2**53
613 {0x1.e000001fea1ep-3, 0x1.2d285a7180f23p+0}, // rerr = -0x1.9300a8852457ep-76, 2**(60/2**8) + 8366200/2**53
614 {0x1.e800000c9e278p-3, 0x1.2df961f78b7a9p+0}, // rerr = -0x1.905e58c363b98p-76, 2**(61/2**8) + 3307678/2**53
615 {0x1.f0000001fc51p-3, 0x1.2ecafa94170d1p+0}, // rerr = 0x1.b395bbfe2a218p-77, 2**(62/2**8) + 520516/2**53
616 {0x1.f80000019e5acp-3, 0x1.2f9d24ac031acp+0}, // rerr = 0x1.411c65ec1dd4p-76, 2**(63/2**8) + 424299/2**53
617 {0x1.000000039d02cp-2, 0x1.306fe0a3da103p+0}, // rerr = -0x1.47ede2f09f9f4p-76, 2**(64/2**8) + 1894422/2**53
618 {0x1.040000084e494p-2, 0x1.31432ee0a28cp+0}, // rerr = 0x1.b25242b646b1fp-75, 2**(65/2**8) + 4354634/2**53
619 {0x1.0800000bf724p-2, 0x1.32170fc7482c4p+0}, // rerr = 0x1.99080c4f72cap-76, 2**(66/2**8) + 6273312/2**53
620 {0x1.0c000002b1b18p-2, 0x1.32eb83bb1dec9p+0}, // rerr = 0x1.0a33e6baad39p-79, 2**(67/2**8) + 1412492/2**53
621 {0x1.1000000cd9c0cp-2, 0x1.33c08b28eec07p+0}, // rerr = 0x1.f11773776d14cp-76, 2**(68/2**8) + 6737414/2**53
622 {0x1.1400000505e38p-2, 0x1.3496266f4c3c6p+0}, // rerr = 0x1.df3f0186f2892p-76, 2**(69/2**8) + 2633500/2**53
623 {0x1.18000000237fp-2, 0x1.356c55f9316e5p+0}, // rerr = 0x1.96f4fba7c756p-76, 2**(70/2**8) + 72696/2**53
624 {0x1.1c000006b6204p-2, 0x1.36431a2f51599p+0}, // rerr = -0x1.687783f0dacaap-76, 2**(71/2**8) + 3518722/2**53
625 {0x1.200000051ad3p-2, 0x1.371a7374bdcfbp+0}, // rerr = -0x1.ffc122977cc1p-78, 2**(72/2**8) + 2676376/2**53
626 {0x1.24000009d994ep-2, 0x1.37f26233fbc7ep+0}, // rerr = 0x1.2395568506adp-76, 2**(73/2**8) + 5164199/2**53
627 {0x1.28000002c2c5p-2, 0x1.38cae6d0f32b4p+0}, // rerr = 0x1.8ece6e31b288p-78, 2**(74/2**8) + 1447464/2**53
628 {0x1.2c00000c8eb8ap-2, 0x1.39a401b9be8e5p+0}, // rerr = -0x1.363ab7052fad8p-76, 2**(75/2**8) + 6583749/2**53
629 {0x1.300000140e2d8p-2, 0x1.3a7db3529ef57p+0}, // rerr = -0x1.52e9005d78ee6p-76, 2**(76/2**8) + 10514796/2**53
630 {0x1.34000004ba08ap-2, 0x1.3b57fbffc9197p+0}, // rerr = -0x1.2bb6cd0db1dep-78, 2**(77/2**8) + 2478149/2**53
631 {0x1.380000146a8dcp-2, 0x1.3c32dc3599392p+0}, // rerr = 0x1.2e217844246a4p-77, 2**(78/2**8) + 10703982/2**53
632 {0x1.3c000003cefdep-2, 0x1.3d0e544faf56dp+0}, // rerr = -0x1.b73e4bae72738p-76, 2**(79/2**8) + 1996783/2**53
633 {0x1.40000002a7356p-2, 0x1.3dea64c1b56c2p+0}, // rerr = -0x1.0f0f4e553c1c7p-75, 2**(80/2**8) + 1391019/2**53
634 {0x1.440000097819ep-2, 0x1.3ec70df3d02a8p+0}, // rerr = -0x1.644867ff3185cp-77, 2**(81/2**8) + 4964559/2**53
635 {0x1.480000054f35p-2, 0x1.3fa4504bee17dp+0}, // rerr = 0x1.d9b58eea5fe42p-76, 2**(82/2**8) + 2783656/2**53
636 {0x1.4c0000013328p-2, 0x1.40822c36bca5bp+0}, // rerr = -0x1.83d5673885644p-77, 2**(83/2**8) + 629056/2**53
637 {0x1.50000005ea89ap-2, 0x1.4160a220bc5bfp+0}, // rerr = 0x1.645ba5496caap-80, 2**(84/2**8) + 3101773/2**53
638 {0x1.5400001a036c2p-2, 0x1.423fb27641088p+0}, // rerr = -0x1.9e52dd9156d24p-76, 2**(85/2**8) + 13638497/2**53
639 {0x1.5800000234f8cp-2, 0x1.431f5d95861bdp+0}, // rerr = -0x1.ed2aabd4e05b4p-77, 2**(86/2**8) + 1157062/2**53
640 {0x1.5c0000052762cp-2, 0x1.43ffa3f96cf9cp+0}, // rerr = 0x1.a9154e8cf37f8p-78, 2**(87/2**8) + 2702102/2**53
641 {0x1.600000003a7aap-2, 0x1.44e08606256fp+0}, // rerr = -0x1.704135d92e7a8p-78, 2**(88/2**8) + 119765/2**53
642 {0x1.640000033ef46p-2, 0x1.45c2042b345e2p+0}, // rerr = -0x1.0a4dc0a325af8p-76, 2**(89/2**8) + 1701795/2**53
643 {0x1.68000007c88acp-2, 0x1.46a41ed388948p+0}, // rerr = -0x1.918ed4f605b28p-78, 2**(90/2**8) + 4080726/2**53
644 {0x1.6c00000b3ba4ap-2, 0x1.4786d66b30ad9p+0}, // rerr = -0x1.3da552f77f8b8p-77, 2**(91/2**8) + 5889317/2**53
645 {0x1.7000000e3699ap-2, 0x1.486a2b5f3cad8p+0}, // rerr = -0x1.18fc4f1b34c9cp-77, 2**(92/2**8) + 7451853/2**53
646 {0x1.740000076ef96p-2, 0x1.494e1e1ad31cep+0}, // rerr = -0x1.6b53f17e13962p-76, 2**(93/2**8) + 3897291/2**53
647 {0x1.78000007f7b2p-2, 0x1.4a32af0f45232p+0}, // rerr = 0x1.bdd5ee20a3eb8p-76, 2**(94/2**8) + 4177296/2**53
648 {0x1.7c000002eba2ep-2, 0x1.4b17dea7830c6p+0}, // rerr = 0x1.90ea63d75de3p-79, 2**(95/2**8) + 1531159/2**53
649 {0x1.800000036178ep-2, 0x1.4bfdad542520cp+0}, // rerr = 0x1.2ac7034158eep-79, 2**(96/2**8) + 1772487/2**53
650 {0x1.840000044522p-2, 0x1.4ce41b8272635p+0}, // rerr = 0x1.2d5278c01febp-76, 2**(97/2**8) + 2238736/2**53
651 {0x1.88000004b65dcp-2, 0x1.4dcb29a0ee638p+0}, // rerr = 0x1.933be8241edc8p-76, 2**(98/2**8) + 2470638/2**53
652 {0x1.8c0000040b6dap-2, 0x1.4eb2d81e75559p+0}, // rerr = 0x1.e3ce42f270acap-76, 2**(99/2**8) + 2120557/2**53
653 {0x1.9000000901b68p-2, 0x1.4f9b276bde95bp+0}, // rerr = -0x1.b6a9bfcbe070cp-76, 2**(100/2**8) + 4722100/2**53
654 {0x1.94000005a887ap-2, 0x1.508417f59d142p+0}, // rerr = -0x1.05a86b0c3ce86p-76, 2**(101/2**8) + 2966589/2**53
655 {0x1.98000002beea4p-2, 0x1.516daa2d96f0ep+0}, // rerr = -0x1.824dbe0941d9ap-76, 2**(102/2**8) + 1439570/2**53
656 {0x1.9c00000b659b6p-2, 0x1.5257de8691237p+0}, // rerr = -0x1.1526fa34170ccp-76, 2**(103/2**8) + 5975259/2**53
657 {0x1.a0000001fe31cp-2, 0x1.5342b56a4a222p+0}, // rerr = -0x1.b9a12074e76b4p-76, 2**(104/2**8) + 1044878/2**53
658 {0x1.a400000079cacp-2, 0x1.542e2f4f86ddfp+0}, // rerr = -0x1.b2d11bbfb09p-80, 2**(105/2**8) + 249430/2**53
659 {0x1.a800000347522p-2, 0x1.551a4ca69aecp+0}, // rerr = 0x1.7b15ecce99eb6p-76, 2**(106/2**8) + 1718929/2**53
660 {0x1.ac0000057f2eap-2, 0x1.56070ddfd6d73p+0}, // rerr = -0x1.080fb2eba1e3p-75, 2**(107/2**8) + 2881909/2**53
661 {0x1.b00000082fdaep-2, 0x1.56f4736d39096p+0}, // rerr = 0x1.89b0ba59efb86p-76, 2**(108/2**8) + 4292311/2**53
662 {0x1.b4000006e9be4p-2, 0x1.57e27dbfc8412p+0}, // rerr = -0x1.5d1a770e068dp-76, 2**(109/2**8) + 3624434/2**53
663 {0x1.b80000059f30cp-2, 0x1.58d12d4acc6abp+0}, // rerr = -0x1.a57054486751p-79, 2**(110/2**8) + 2947462/2**53
664 {0x1.bc000006196bep-2, 0x1.59c082815dec2p+0}, // rerr = 0x1.3f4a466bd80ccp-76, 2**(111/2**8) + 3197791/2**53
665 {0x1.c0000000bbacap-2, 0x1.5ab07dd4b14d7p+0}, // rerr = -0x1.2f9aad7fc6f7cp-76, 2**(112/2**8) + 384357/2**53
666 {0x1.c4000004077c6p-2, 0x1.5ba11fbb7a587p+0}, // rerr = -0x1.a640c2a4ea848p-76, 2**(113/2**8) + 2112483/2**53
667 {0x1.c8000002f06c2p-2, 0x1.5c9268a645f3fp+0}, // rerr = 0x1.0d3a841a0800ap-76, 2**(114/2**8) + 1540961/2**53
668 {0x1.cc00000cac3c2p-2, 0x1.5d84590c9845bp+0}, // rerr = -0x1.4077cd0cae724p-77, 2**(115/2**8) + 6644193/2**53
669 {0x1.d000000631f8cp-2, 0x1.5e76f15c4a52p+0}, // rerr = 0x1.a600b8636a5bcp-77, 2**(116/2**8) + 3248070/2**53
670 {0x1.d400000c5f88ep-2, 0x1.5f6a3210c02fdp+0}, // rerr = 0x1.73fb23d3ddf38p-77, 2**(117/2**8) + 6487111/2**53
671 {0x1.d800000648fe2p-2, 0x1.605e1b98ed86bp+0}, // rerr = 0x1.f2029d885f0a4p-77, 2**(118/2**8) + 3295217/2**53
672 {0x1.dc00000480196p-2, 0x1.6152ae6df2f9fp+0}, // rerr = -0x1.030ba459c3d88p-77, 2**(119/2**8) + 2359499/2**53
673 {0x1.e0000013fb67cp-2, 0x1.6247eb0870165p+0}, // rerr = -0x1.640a0710ce668p-77, 2**(120/2**8) + 10476350/2**53
674 {0x1.e4000001864acp-2, 0x1.633dd1d1f079bp+0}, // rerr = 0x1.95681a5b33bb4p-77, 2**(121/2**8) + 799318/2**53
675 {0x1.e8000001fd876p-2, 0x1.6434634d470cfp+0}, // rerr = 0x1.4256471d94056p-76, 2**(122/2**8) + 1043515/2**53
676 {0x1.ec000001eb9e2p-2, 0x1.652b9fec3fd71p+0}, // rerr = -0x1.e4a4a7761ebc8p-76, 2**(123/2**8) + 1006833/2**53
677 {0x1.f0000005a7522p-2, 0x1.66238826b1001p+0}, // rerr = -0x1.2e8ee2c22b778p-78, 2**(124/2**8) + 2964113/2**53
678 {0x1.f4000007ccecep-2, 0x1.671c1c7268aap+0}, // rerr = -0x1.41afb2ed9f76ep-76, 2**(125/2**8) + 4089703/2**53
679 {0x1.f8000004d45fep-2, 0x1.68155d45f7f22p+0}, // rerr = -0x1.cbe1403b7a3bep-76, 2**(126/2**8) + 2532095/2**53
680 {0x1.fc00000d00828p-2, 0x1.690f4b1d16d2p+0}, // rerr = 0x1.18520f7489d98p-77, 2**(127/2**8) + 6816788/2**53
681 {0x1.000000006d6f2p-1, 0x1.6a09e668295fdp+0}, // rerr = -0x1.612e072fd04dep-76, 2**(128/2**8) + 448242/2**53
682 {0x1.020000006f2eep-1, 0x1.6b052fa788183p+0}, // rerr = 0x1.d4ffee14f461p-76, 2**(129/2**8) + 455406/2**53
683 {0x1.0400000205a67p-1, 0x1.6c012751bcc3cp+0}, // rerr = 0x1.ce1092eed39bp-79, 2**(130/2**8) + 2120295/2**53
684 {0x1.06000000bb46ap-1, 0x1.6cfdcddda3ee1p+0}, // rerr = -0x1.332188aeeaeeap-76, 2**(131/2**8) + 767082/2**53
685 {0x1.08000006234b3p-1, 0x1.6dfb23c95c28dp+0}, // rerr = -0x1.09996143c9e6p-77, 2**(132/2**8) + 6436019/2**53
686 {0x1.0a000002360edp-1, 0x1.6ef92986ace76p+0}, // rerr = -0x1.e6d8c20280c84p-76, 2**(133/2**8) + 2318573/2**53
687 {0x1.0c00000224115p-1, 0x1.6ff7df962a4e4p+0}, // rerr = 0x1.5fb5d4ac30c14p-76, 2**(134/2**8) + 2244885/2**53
688 {0x1.0e0000007f94fp-1, 0x1.70f7466f82a2dp+0}, // rerr = -0x1.0a3116230c27cp-76, 2**(135/2**8) + 522575/2**53
689 {0x1.100000056865ep-1, 0x1.71f75e917b5b8p+0}, // rerr = -0x1.8a254fba747ccp-77, 2**(136/2**8) + 5670494/2**53
690 {0x1.12000003209b2p-1, 0x1.72f828703f1d1p+0}, // rerr = 0x1.61bbc2d9a610ep-76, 2**(137/2**8) + 3279282/2**53
691 {0x1.1400000084352p-1, 0x1.73f9a48a9aabp+0}, // rerr = 0x1.5041c822ef9c4p-77, 2**(138/2**8) + 541522/2**53
692 {0x1.16000003ce3c2p-1, 0x1.74fbd35f68af9p+0}, // rerr = 0x1.552f7c9b745a4p-76, 2**(139/2**8) + 3990466/2**53
693 {0x1.18000005a047fp-1, 0x1.75feb566ffb92p+0}, // rerr = -0x1.8a420f2e709cap-76, 2**(140/2**8) + 5899391/2**53
694 {0x1.1a000003a11e5p-1, 0x1.77024b1c8e947p+0}, // rerr = -0x1.c3c3879c1d3eep-76, 2**(141/2**8) + 3805669/2**53
695 {0x1.1c0000087d61bp-1, 0x1.7806950238385p+0}, // rerr = 0x1.6f0c2a0ed22fcp-76, 2**(142/2**8) + 8902171/2**53
696 {0x1.1e00000132e4ap-1, 0x1.790b938b5e765p+0}, // rerr = 0x1.94455bedaa408p-77, 2**(143/2**8) + 1257034/2**53
697 {0x1.20000002ed0b2p-1, 0x1.7a1147402f7a4p+0}, // rerr = 0x1.64c9057f85b9p-78, 2**(144/2**8) + 3068082/2**53
698 {0x1.220000021e1cap-1, 0x1.7b17b09883363p+0}, // rerr = 0x1.902e87a0586dcp-76, 2**(145/2**8) + 2220490/2**53
699 {0x1.240000041fbb2p-1, 0x1.7c1ed0152b5cdp+0}, // rerr = 0x1.60b19c1c5df26p-76, 2**(146/2**8) + 4324274/2**53
700 {0x1.2600000191ef4p-1, 0x1.7d26a630c7d55p+0}, // rerr = -0x1.a6af9f8eb0dfcp-77, 2**(147/2**8) + 1646324/2**53
701 {0x1.2800000294a37p-1, 0x1.7e2f336e4ab7p+0}, // rerr = 0x1.6bf358629ap-81, 2**(148/2**8) + 2705975/2**53
702 {0x1.2a0000002d5e9p-1, 0x1.7f38784933d2cp+0}, // rerr = -0x1.71ab65610adap-76, 2**(149/2**8) + 185833/2**53
703 {0x1.2c000000368bfp-1, 0x1.80427543fe015p+0}, // rerr = 0x1.b89d3c468d384p-77, 2**(150/2**8) + 223423/2**53
704 {0x1.2e00000e5d239p-1, 0x1.814d2ae48e817p+0}, // rerr = 0x1.c211b2451b2e8p-76, 2**(151/2**8) + 15061561/2**53
705 {0x1.30000000aa7bep-1, 0x1.82589995260c8p+0}, // rerr = 0x1.46e1ddacaa168p-78, 2**(152/2**8) + 698302/2**53
706 {0x1.32000000c6923p-1, 0x1.8364c1ebfc43bp+0}, // rerr = -0x1.dd723e087c47ep-76, 2**(153/2**8) + 813347/2**53
707 {0x1.34000007a46eep-1, 0x1.8471a46641527p+0}, // rerr = -0x1.e7a3b0892d30cp-76, 2**(154/2**8) + 8013550/2**53
708 {0x1.360000000875ap-1, 0x1.857f4179fa28p+0}, // rerr = 0x1.162f06718426ap-76, 2**(155/2**8) + 34650/2**53
709 {0x1.38000005c1f5bp-1, 0x1.868d99b754833p+0}, // rerr = -0x1.9472e4d5ec4b2p-76, 2**(156/2**8) + 6037339/2**53
710 {0x1.3a000002822d9p-1, 0x1.879cad946eb95p+0}, // rerr = -0x1.587f77246a9ep-76, 2**(157/2**8) + 2630361/2**53
711 {0x1.3c0000054b58fp-1, 0x1.88ac7d9b76eb5p+0}, // rerr = 0x1.65b2a7fa143d6p-76, 2**(158/2**8) + 5551503/2**53
712 {0x1.3e000001d6803p-1, 0x1.89bd0a48804d3p+0}, // rerr = 0x1.0b44d93e63a18p-77, 2**(159/2**8) + 1927171/2**53
713 {0x1.400000046b3ep-1, 0x1.8ace542506b0dp+0}, // rerr = -0x1.dbf51052d6878p-76, 2**(160/2**8) + 4633568/2**53
714 {0x1.420000022acb8p-1, 0x1.8be05bae8acd9p+0}, // rerr = 0x1.83c795c92b8ep-77, 2**(161/2**8) + 2272440/2**53
715 {0x1.4400000110a71p-1, 0x1.8cf3216be6ce3p+0}, // rerr = -0x1.2b2e2db7629e8p-76, 2**(162/2**8) + 1116785/2**53
716 {0x1.460000008527ep-1, 0x1.8e06a5e0ce2dcp+0}, // rerr = -0x1.dc847b4af427p-78, 2**(163/2**8) + 545406/2**53
717 {0x1.4800000c48632p-1, 0x1.8f1ae997fa64dp+0}, // rerr = -0x1.8f5a9af024aep-79, 2**(164/2**8) + 12879410/2**53
718 {0x1.4a0000019c4d6p-1, 0x1.902fed036228ap+0}, // rerr = 0x1.07441d8df5368p-77, 2**(165/2**8) + 1688790/2**53
719 {0x1.4c0000090e1a2p-1, 0x1.9145b0be0b47ap+0}, // rerr = 0x1.c74c25a2410d8p-76, 2**(166/2**8) + 9494946/2**53
720 {0x1.4e00000749b6dp-1, 0x1.925c353e9b472p+0}, // rerr = -0x1.4d277fe326c7p-77, 2**(167/2**8) + 7641965/2**53
721 {0x1.500000009941fp-1, 0x1.93737b0d3013ap+0}, // rerr = -0x1.7fa155a5bb44cp-76, 2**(168/2**8) + 627743/2**53
722 {0x1.52000000fd26bp-1, 0x1.948b82b684334p+0}, // rerr = 0x1.1d2ae492ec038p-77, 2**(169/2**8) + 1036907/2**53
723 {0x1.54000002865aap-1, 0x1.95a44cbde8147p+0}, // rerr = 0x1.bb8400b3f7d3ep-76, 2**(170/2**8) + 2647466/2**53
724 {0x1.560000023c506p-1, 0x1.96bdd9a8a22ffp+0}, // rerr = 0x1.b80f9430795p-81, 2**(171/2**8) + 2344198/2**53
725 {0x1.58000000868bdp-1, 0x1.97d829fe2f2edp+0}, // rerr = -0x1.8bcc83a1676b6p-76, 2**(172/2**8) + 551101/2**53
726 {0x1.5a000001cce14p-1, 0x1.98f33e48a1534p+0}, // rerr = 0x1.696b17d47cfap-78, 2**(173/2**8) + 1887764/2**53
727 {0x1.5c00000284415p-1, 0x1.9a0f170e06225p+0}, // rerr = 0x1.daca0d829af5cp-76, 2**(174/2**8) + 2638869/2**53
728 {0x1.5e000000d6ebfp-1, 0x1.9b2bb4d5b7835p+0}, // rerr = -0x1.d7a8884fb0eacp-77, 2**(175/2**8) + 880319/2**53
729 {0x1.60000000e65c2p-1, 0x1.9c49182abf9c8p+0}, // rerr = 0x1.bc13cdadcbd78p-77, 2**(176/2**8) + 943554/2**53
730 {0x1.620000008c1d6p-1, 0x1.9d67419509f83p+0}, // rerr = -0x1.df8118650d772p-76, 2**(177/2**8) + 573910/2**53
731 {0x1.640000015c9dep-1, 0x1.9e86319ef5d59p+0}, // rerr = 0x1.e15ac2ea849p-78, 2**(178/2**8) + 1427934/2**53
732 {0x1.6600000414b42p-1, 0x1.9fa5e8d2cb063p+0}, // rerr = -0x1.33a879cdaa2ap-78, 2**(179/2**8) + 4279106/2**53
733 {0x1.68000001214ccp-1, 0x1.a0c667b68191bp+0}, // rerr = 0x1.ff8266b943e58p-78, 2**(180/2**8) + 1184972/2**53
734 {0x1.6a000001843bcp-1, 0x1.a1e7aed9c7317p+0}, // rerr = -0x1.96b9f4f017b2p-76, 2**(181/2**8) + 1590204/2**53
735 {0x1.6c000000758a2p-1, 0x1.a309bec4e5813p+0}, // rerr = -0x1.6c13008ffda84p-77, 2**(182/2**8) + 481442/2**53
736 {0x1.6e00000477098p-1, 0x1.a42c9806eaep+0}, // rerr = -0x1.3fc8ad68e4f24p-76, 2**(183/2**8) + 4681880/2**53
737 {0x1.700000019cc89p-1, 0x1.a5503b24cdc6dp+0}, // rerr = 0x1.8259fddf3b62p-76, 2**(184/2**8) + 1690761/2**53
738 {0x1.7200000062f88p-1, 0x1.a674a8af7e9fap+0}, // rerr = 0x1.d878513c97132p-76, 2**(185/2**8) + 405384/2**53
739 {0x1.740000011ec75p-1, 0x1.a799e133afab3p+0}, // rerr = 0x1.ea11daeea77a8p-78, 2**(186/2**8) + 1174645/2**53
740 {0x1.76000002de3b8p-1, 0x1.a8bfe53db919bp+0}, // rerr = 0x1.e2989a88cdbdep-76, 2**(187/2**8) + 3007416/2**53
741 {0x1.7800000249e28p-1, 0x1.a9e6b558f1ac2p+0}, // rerr = 0x1.980ac6341caap-77, 2**(188/2**8) + 2399784/2**53
742 {0x1.7a000000c9999p-1, 0x1.ab0e5213cb79bp+0}, // rerr = 0x1.e0e67808108p-81, 2**(189/2**8) + 825753/2**53
743 {0x1.7c000000f0acfp-1, 0x1.ac36bbfdcabdbp+0}, // rerr = -0x1.cf047b2d1b6c6p-76, 2**(190/2**8) + 985807/2**53
744 {0x1.7e000003b665fp-1, 0x1.ad5ff3a5eaecp+0}, // rerr = -0x1.8498bb3ac2c6ep-76, 2**(191/2**8) + 3892831/2**53
745 {0x1.800000015becfp-1, 0x1.ae89f9967806p+0}, // rerr = -0x1.5f6531c4d4968p-76, 2**(192/2**8) + 1425103/2**53
746 {0x1.82000001bc2bp-1, 0x1.afb4ce6332c77p+0}, // rerr = 0x1.67d89569ee91p-77, 2**(193/2**8) + 1819312/2**53
747 {0x1.8400000b96bedp-1, 0x1.b0e0729fa6005p+0}, // rerr = 0x1.65cb85df845cp-76, 2**(194/2**8) + 12151789/2**53
748 {0x1.86000005d181ap-1, 0x1.b20ce6cd13d83p+0}, // rerr = -0x1.54efbec6d8d28p-76, 2**(195/2**8) + 6101018/2**53
749 {0x1.880000017a522p-1, 0x1.b33a2b85d048fp+0}, // rerr = -0x1.1d955e2b98608p-76, 2**(196/2**8) + 1549602/2**53
750 {0x1.8a00000dfe0bcp-1, 0x1.b4684163b8e99p+0}, // rerr = -0x1.500e9cb5b8e48p-78, 2**(197/2**8) + 14672060/2**53
751 {0x1.8c000003afe5bp-1, 0x1.b59728e084c08p+0}, // rerr = 0x1.18bb874b2acc2p-76, 2**(198/2**8) + 3866203/2**53
752 {0x1.8e00000069dadp-1, 0x1.b6c6e29f5b33dp+0}, // rerr = -0x1.fcf236a3f0d78p-76, 2**(199/2**8) + 433581/2**53
753 {0x1.90000000a0b5ep-1, 0x1.b7f76f30159dbp+0}, // rerr = -0x1.ebc6e25ae6ebcp-76, 2**(200/2**8) + 658270/2**53
754 {0x1.92000008ff77dp-1, 0x1.b928cf27d4592p+0}, // rerr = -0x1.33ef3048c662p-76, 2**(201/2**8) + 9435005/2**53
755 {0x1.9400000829798p-1, 0x1.ba5b030ef3b35p+0}, // rerr = -0x1.f549986b92d38p-76, 2**(202/2**8) + 8558488/2**53
756 {0x1.96000005646a8p-1, 0x1.bb8e0b7ce3dd9p+0}, // rerr = 0x1.7aa61ead88454p-76, 2**(203/2**8) + 5654184/2**53
757 {0x1.98000002f2f09p-1, 0x1.bcc1e90682ac7p+0}, // rerr = -0x1.9b148c173ef26p-76, 2**(204/2**8) + 3092233/2**53
758 {0x1.9a00000bdd595p-1, 0x1.bdf69c4663ea6p+0}, // rerr = 0x1.57358fd52d874p-77, 2**(205/2**8) + 12440981/2**53
759 {0x1.9c000000373fep-1, 0x1.bf2c25bd9353p+0}, // rerr = -0x1.69beada96139p-79, 2**(206/2**8) + 226302/2**53
760 {0x1.9e000001d6e5ep-1, 0x1.c0628615390c9p+0}, // rerr = 0x1.03a4772b8d6a8p-78, 2**(207/2**8) + 1928798/2**53
761 {0x1.a00000035f465p-1, 0x1.c199bdda629cfp+0}, // rerr = 0x1.97091bedb437cp-76, 2**(208/2**8) + 3535973/2**53
762 {0x1.a2000006d882p-1, 0x1.c2d1cda3d3ea5p+0}, // rerr = 0x1.ecb1b5783b808p-77, 2**(209/2**8) + 7178272/2**53
763 {0x1.a4000003c5ae4p-1, 0x1.c40ab6024c00cp+0}, // rerr = -0x1.6766bf3cfdda4p-77, 2**(210/2**8) + 3955428/2**53
764 {0x1.a6000002476bbp-1, 0x1.c544779115b4p+0}, // rerr = -0x1.2123916fa81b2p-76, 2**(211/2**8) + 2389691/2**53
765 {0x1.a80000067077ep-1, 0x1.c67f12e973619p+0}, // rerr = -0x1.ae847b118c45ep-76, 2**(212/2**8) + 6752126/2**53
766 {0x1.aa00000b8ac35p-1, 0x1.c7ba889fab90dp+0}, // rerr = -0x1.15b171c7205cp-77, 2**(213/2**8) + 12102709/2**53
767 {0x1.ac00000079d36p-1, 0x1.c8f6d940b9d91p+0}, // rerr = 0x1.630468b4c39e2p-76, 2**(214/2**8) + 498998/2**53
768 {0x1.ae00000244398p-1, 0x1.ca340576843ap+0}, // rerr = -0x1.01de9fc4174fp-76, 2**(215/2**8) + 2376600/2**53
769 {0x1.b0000006c9425p-1, 0x1.cb720dd331994p+0}, // rerr = -0x1.d15bb756d5a1ap-76, 2**(216/2**8) + 7115813/2**53
770 {0x1.b20000040a06bp-1, 0x1.ccb0f2e9564f7p+0}, // rerr = -0x1.098ee7c4f236p-76, 2**(217/2**8) + 4235371/2**53
771 {0x1.b4000001b8c3dp-1, 0x1.cdf0b556efe47p+0}, // rerr = 0x1.ece880a75ef6p-79, 2**(218/2**8) + 1805373/2**53
772 {0x1.b600000473d9bp-1, 0x1.cf3155b8857bdp+0}, // rerr = -0x1.9573ac0495accp-77, 2**(219/2**8) + 4668827/2**53
773 {0x1.b800000218d64p-1, 0x1.d072d4a1ca24p+0}, // rerr = -0x1.1cfe9f616a16ap-76, 2**(220/2**8) + 2198884/2**53
774 {0x1.ba00000319e46p-1, 0x1.d1b532b2811e5p+0}, // rerr = -0x1.63d611f50796p-78, 2**(221/2**8) + 3251782/2**53
775 {0x1.bc00000563c24p-1, 0x1.d2f8708440e2cp+0}, // rerr = -0x1.e57164290f518p-76, 2**(222/2**8) + 5651492/2**53
776 {0x1.be0000033cec4p-1, 0x1.d43c8eaeb791bp+0}, // rerr = -0x1.f8be852f0ecc4p-77, 2**(223/2**8) + 3395268/2**53
777 {0x1.c00000092181ap-1, 0x1.d5818dd5880bcp+0}, // rerr = 0x1.319c562533444p-77, 2**(224/2**8) + 9574426/2**53
778 {0x1.c2000000b2765p-1, 0x1.d6c76e86a02bp+0}, // rerr = 0x1.85b3a89263c14p-76, 2**(225/2**8) + 730981/2**53
779 {0x1.c40000002af22p-1, 0x1.d80e316cb3ab8p+0}, // rerr = 0x1.0bb88e6c1c144p-77, 2**(226/2**8) + 175906/2**53
780 {0x1.c600000cb4a9ap-1, 0x1.d955d7281a581p+0}, // rerr = -0x1.26ac3b93430afp-75, 2**(227/2**8) + 13322906/2**53
781 {0x1.c8000001b543fp-1, 0x1.da9e603ecc1e4p+0}, // rerr = 0x1.15b9e96c22aep-77, 2**(228/2**8) + 1791039/2**53
782 {0x1.ca000004a9829p-1, 0x1.dbe7cd66a9266p+0}, // rerr = 0x1.4aad5365d4bfap-76, 2**(229/2**8) + 4888617/2**53
783 {0x1.cc00000551605p-1, 0x1.dd321f338ac32p+0}, // rerr = 0x1.ab2393040a7cap-76, 2**(230/2**8) + 5576197/2**53
784 {0x1.ce000003a354ap-1, 0x1.de7d56441bb1cp+0}, // rerr = -0x1.79e6ee7922864p-77, 2**(231/2**8) + 3814730/2**53
785 {0x1.d0000000b27afp-1, 0x1.dfc973382da3ep+0}, // rerr = -0x1.74a8fa8b0d63cp-77, 2**(232/2**8) + 731055/2**53
786 {0x1.d200000202f1bp-1, 0x1.e11676b2e7334p+0}, // rerr = 0x1.6613a0d76cdd8p-76, 2**(233/2**8) + 2109211/2**53
787 {0x1.d40000050a8e2p-1, 0x1.e2646152a4e33p+0}, // rerr = -0x1.9ee8f0b8050d8p-76, 2**(234/2**8) + 5286114/2**53
788 {0x1.d6000003d0c08p-1, 0x1.e3b333b3ee7d8p+0}, // rerr = 0x1.ca018c9c92838p-76, 2**(235/2**8) + 4000776/2**53
789 {0x1.d8000000c7cebp-1, 0x1.e502ee7937317p+0}, // rerr = -0x1.f94b3c342a728p-78, 2**(236/2**8) + 818411/2**53
790 {0x1.da0000060dd41p-1, 0x1.e653924a733bbp+0}, // rerr = -0x1.296907c87557cp-77, 2**(237/2**8) + 6348097/2**53
791 {0x1.dc00000504b69p-1, 0x1.e7a51fbfc4ebp+0}, // rerr = 0x1.5591c4548c4cp-77, 2**(238/2**8) + 5262185/2**53
792 {0x1.de0000018f6ccp-1, 0x1.e8f7977de3dbcp+0}, // rerr = 0x1.a0a35302713ccp-76, 2**(239/2**8) + 1636044/2**53
793 {0x1.e0000003582ap-1, 0x1.ea4afa2c81573p+0}, // rerr = -0x1.27e1391d9ceep-77, 2**(240/2**8) + 3506848/2**53
794 {0x1.e2000008640cdp-1, 0x1.eb9f486d624ebp+0}, // rerr = 0x1.2528e74e6725p-77, 2**(241/2**8) + 8798413/2**53
795 {0x1.e400000ef29b3p-1, 0x1.ecf482e2e03c7p+0}, // rerr = 0x1.0abe05c0c1538p-75, 2**(242/2**8) + 15673779/2**53
796 {0x1.e600000a86731p-1, 0x1.ee4aaa28935efp+0}, // rerr = 0x1.0ca2cf2357d2p-79, 2**(243/2**8) + 11036465/2**53
797 {0x1.e8000001232a3p-1, 0x1.efa1bee6d900bp+0}, // rerr = 0x1.a57825775f29p-77, 2**(244/2**8) + 1192611/2**53
798 {0x1.ea000001d8024p-1, 0x1.f0f9c1cca1a4cp+0}, // rerr = -0x1.39af31e7fa1p-78, 2**(245/2**8) + 1933348/2**53
799 {0x1.ec00000144453p-1, 0x1.f252b377966ccp+0}, // rerr = 0x1.5624dbae6e198p-78, 2**(246/2**8) + 1328211/2**53
800 {0x1.ee0000077b4a6p-1, 0x1.f3ac9492e6c58p+0}, // rerr = -0x1.1348d0c7d7718p-77, 2**(247/2**8) + 7845030/2**53
801 {0x1.f0000002820d1p-1, 0x1.f50765b897d3fp+0}, // rerr = 0x1.80c50ae84ff8p-81, 2**(248/2**8) + 2629841/2**53
802 {0x1.f20000040e7ffp-1, 0x1.f663279b46a11p+0}, // rerr = -0x1.8dad50d78db9p-79, 2**(249/2**8) + 4253695/2**53
803 {0x1.f4000000101a1p-1, 0x1.f7bfdad9d6dc6p+0}, // rerr = 0x1.ee11d24059678p-78, 2**(250/2**8) + 65953/2**53
804 {0x1.f60000056fb82p-1, 0x1.f91d8025fb7a6p+0}, // rerr = -0x1.8957a80f6faep-79, 2**(251/2**8) + 5700482/2**53
805 {0x1.f800000132d42p-1, 0x1.fa7c181abb707p+0}, // rerr = -0x1.09be52642a214p-75, 2**(252/2**8) + 1256770/2**53
806 {0x1.fa000008dcd22p-1, 0x1.fbdba36f4538cp+0}, // rerr = -0x1.0db4b6b63134ap-76, 2**(253/2**8) + 9293090/2**53
807 {0x1.fc000000d9586p-1, 0x1.fd3c22b98cf5cp+0}, // rerr = 0x1.f57d4da4c3dc8p-76, 2**(254/2**8) + 890246/2**53
808 {0x1.fe000001c6485p-1, 0x1.fe9d96b3dc461p+0}, // rerr = -0x1.7531858abd466p-76, 2**(255/2**8) + 1860741/2**53
809 {0x1p+0, 0x1p+1}, // rerr = 0x0p+0, 2**(256/2**8) + 0/2**53
810};
811 //Worst case: 0x1.b25242b646b1fp-75 from 4354634 (0x1.040000084e494p-2) with r=16777216
812
813/* We design a minimax poly for
814 2^x-1 � x
815Approximating g(x) = (2^x-1)/x over [0,2^-7]:
816 p(x) =
817 .693147180559945318193472330348557 +
818 ( .240226506959044553084155309067230 +
819 ( 0.555041087223186432940320239932465e-1 +
820 ( 0.961810850574698526660046525532774e-2 +
821 0.133636821875765095445302638781823e-2 * x
822 ) * x
823 ) * x
824 ) * x
825
826for 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.
827We then check that it is ok for [0,2^-53].
828
829You can go to -2^-16 and still maintain the error.
830The minimax however is very nice from [-2^-16,2^-7].
831*/
832
833static const double Exp2Poly2m7[5] = {
834 0.00133636821875765095445302638781823,
835 0.00961810850574698526660046525532774,
836 0.0555041087223186432940320239932465,
837 0.240226506959044553084155309067230,
838 0.693147180559945318193472330348557,
839};
840
841static const double Ln2 = 0x1.62E42FEFA39EFp-1; // log(2) = 0x1.62E42FEFA39EF...35793C7673007Ep-1
842//static const double Ln2tail = 0x0.35793C7673007Ep-53; // log(2) = 0x1.62E42FEFA39EF...35793C7673007Ep-1
843static const double one = 1.0;
844
845#define N1 8
846#define TWO_N1 0x1.0p8 // 2**N1
847
848
849//static const xUInt64 pow_specialop_boundary = {0x7fefffffffffffffULL, 0};
850static const xUInt64 mask_of_ones = {0xffffffffffffffffULL, 0};
851static const xDouble double_exp_lsb = (const xDouble)(const xUInt64){0x0010000000000000ULL, 0};
852static const xDouble double_exp_mask = (const xDouble)(const xUInt64){0x7ff0000000000000ULL, 0};
853static const xDouble double_mant_mask = (const xDouble)(const xUInt64){0x000fffffffffffffULL, 0};
854static const xDouble frexp_mant_mask = (const xDouble)(const xUInt64){0x800fffffffffffffULL, 0};
855static const xDouble frexp_half_mask = (const xDouble)(const xUInt64){0x0008000000000000ULL, 0};
856static const xDouble xMZEROd = {-0.0, -0.0};
857
858//Infs, zeros and NaNs -- not supported. you get what you get.
859//Assumes x>0.
860//For normals and denorms this returns frexp(x) in [0.75,1.5)
861//And the coresponding exponent.
862static inline double frexp_near1( double absx, int *exp ) ALWAYS_INLINE;
863static inline double frexp_near1( double absx, int *exp )
864#if AVOID_64_BIT_INTS
865{
866 const xDouble vx = DOUBLE_2_XDOUBLE(absx);
867 static const double smallestNormal = 0x1.0p-1022;
868 const xDouble xOne = _mm_load_sd( &one );
869
870 xDouble exponent = _mm_and_pd(vx,double_exp_mask);
871 xDouble mantissa = _mm_and_pd(vx,frexp_mant_mask);
872 const xDouble isDenormal = _mm_cmplt_sdm( vx, &smallestNormal );
873 const int isdenorm = _mm_cvtsi128_si32( (xSInt64) isDenormal );
874
875 *exp = -1023; //pre-remove the bias
876 if( EXPECT_FALSE( isdenorm ) ) //if denormal or zero
877 {
878 //denormal or zero -- this gives the wrong result for 0
879 // or in bias to the new exponent for the mantissa
880 mantissa = _mm_or_pd(mantissa, xOne);
881// const xDouble v = _mm_and_pd(mantissa, double_exp_mask);
882 const xDouble u = mantissa - xOne;
883
884 exponent = _mm_and_pd(u, double_exp_mask);
885 mantissa = _mm_and_pd(u, frexp_mant_mask);
886
887 *exp += -1022;
888 }
889
890 // or in -1 + bias to the new exponent for the mantissa
891 const xDouble upperhalf = _mm_and_pd(mantissa, frexp_half_mask);
892 const xUInt64 nudge = _mm_slli_epi64((xUInt64)upperhalf, 1);
893 mantissa = _mm_xor_pd(_mm_or_pd(mantissa, xOne), (xDouble)nudge); // Divide by two if significand >= 3/2 (0x3ff... -> 0x3fe...)
894 const int true_exp = _mm_cvtsi128_si32( _mm_srli_epi64(nudge+(xUInt64)exponent,52));
895 *exp += (int) true_exp; //right shift exponent and remove the bias, and store
896
897 return XDOUBLE_2_DOUBLE(mantissa);
898}
899#else
900{
901 union{ double d; uint64_t u; } u = { absx };
902
903 uint64_t exponent = u.u & 0x7ff0000000000000ULL;
904 uint64_t mantissa = u.u & 0x800fffffffffffffULL;
905 *exp = -1023; //pre-remove the bias
906 if( __builtin_expect( (int64_t) exponent == 0x0000000000000000LL, 0 ) ) //if denormal, NaN or Inf
907 {
908 //denormal or zero -- this gives the wrong result for 0
909 // or in bias to the new exponent for the mantissa
910 mantissa |= 0x3ff0000000000000ULL;
911
912 //TODO: don't need v since we aren't dealing with NaN/Inf
913// union{ uint64_t u; double d; } v = { mantissa & 0xfff0000000000000ULL };
914 u.u = mantissa;
915// u.d = u.d - v.d;
916 u.d = u.d - one;
917
918 exponent = u.u & 0x7ff0000000000000ULL;
919 mantissa = u.u & 0x800fffffffffffffULL;
920
921 *exp += -1022;
922 }
923
924 // or in -1 + bias to the new exponent for the mantissa
925 uint64_t upperhalf = u.u & 0x0008000000000000ULL;
926 mantissa = (mantissa | 0x3ff0000000000000ULL) ^ (upperhalf << 1); // Divide by two if significand >= 3/2
927 *exp += (int) ( exponent >> 52 ) + (upperhalf != 0ULL); //right shift exponent and remove the bias, and store
928 u.u = mantissa;
929
930// const double f = (fp1 > 1.5) ? (0.5 * fp1 - 1.0) : (fp1 - 1.0);
931// n += (f < 0) ? 1 : 0;
932 *exp = (int)exponent;
933 return u.d;
934}
935#endif
936
937
938static inline double twoton(int n) ALWAYS_INLINE;
939static inline double twoton(int n)
940#if AVOID_64_BIT_INTS
941{
942 return XDOUBLE_2_DOUBLE(twoToTheM(n));
943}
944#else
945{
946 union{ double d; uint64_t u; } ux;
947 ux.u = (uint64_t)(0x3ff + n) << 52;
948 return ux.d;
949}
950#endif
951
952static const xUInt64 ROUND26 = {0x0000000004000000ULL, 0};
953static const xUInt64 ROUND26_MASK= {0xfffffffff8000000ULL, 0};
954
955static inline double round26nearest(double x) ALWAYS_INLINE;
956static inline double round26nearest(double x)
957#if AVOID_64_BIT_INTS
958{
959 const xDouble vx = DOUBLE_2_XDOUBLE(x);
960 const xDouble vs = _mm_and_pd((xDouble)_mm_add_epi64((xUInt64)vx,ROUND26),(xDouble)ROUND26_MASK) ;
961 return XDOUBLE_2_DOUBLE(vs);
962}
963#else
964{
965 union{ double d; uint64_t u; } ux;
966 ux.d = x;
967 ux.u = (ux.u + 0x0000000004000000ULL) & 0xfffffffff8000000ULL;
968 return ux.d;
969}
970#endif
971
972// TODO use minimax poly for the smaller range we are actually using.
973static const double LogTaylor[]=
974{
975 0x0.24628E2A4CB513Ep0, /* ~1/7 */
976 -0x0.2AAAA7C79E594CFp0, /* ~1/6 */
977 0x0.333333441E488E8p0, /* ~1/5 */
978 -0x0.400000000286788p0, /* ~1/4 */
979 0x0.555555555553FDFp0, /* ~1/3 */
980 -0x0.7FFFFFFFFFFFFFFp0, /* ~1/2 */
981};
982
983static const xDouble small = {0x1p-1020, 0.};
984static const xDouble big = {0x1p+1020, 0.};
985
986double pow(double x, double y) {
987 //Handle special input conditions.
988 //Either return early or set yisint and yisodd with finite non-zero non-one x and y.
989 int yisint = 0;
990 int yisodd = 0;
991#if AVOID_64_BIT_INTS
992 {
993 if( x == one || y == one)
994 return x;
995
996 const xDouble vx = DOUBLE_2_XDOUBLE(x);
997 const xDouble vy = DOUBLE_2_XDOUBLE(y);
998 const xDouble xOne = _mm_load_sd( &one );
999 //Move the arguments to the integer registers for bitwise inspection
1000 xDouble absux = _mm_andnot_pd(xMZEROd, vx);
1001 xDouble absuy = _mm_andnot_pd(xMZEROd, vy);
1002 uint32_t absuyhi = _mm_cvtsi128_si32((xUInt32)_mm_srli_epi64((xUInt64)absuy,32));
1003 uint32_t absuxhi = _mm_cvtsi128_si32((xUInt32)_mm_srli_epi64((xUInt64)absux,32));
1004
1005 //figure out if y is an odd integer
1006 //Find out if y is an integer or not without raising inexact
1007 //Fails for Inf/NaN. We don't care about that here.
1008 if (EXPECT_FALSE(absuyhi >= 0x43400000U)) { // |y| >= 0x1p53 implies y is an even int
1009 yisint = 1;
1010#if DEBUG
1011 printf("Guaranteed int: %d (%x >= %x), odd: %d\n", yisint, absuyhi, 0x43400000U, yisodd);
1012#endif
1013 } else if (EXPECT_TRUE(absuyhi < 0x40000000U)) { // |y| < 2.0: for our purposes -1, 0, 1 are special ops and not integers ;->
1014 yisint = yisodd = (y == -1.0);
1015 } else {
1016 xDouble mask = _mm_and_pd(absuy, double_exp_mask); // 2^(floor(lg|y|))
1017 const xDouble onesMask = mask + xOne; // 1 in ones position of significand (for y >= 2)
1018 const xDouble sigy = _mm_and_pd(absuy, double_mant_mask);
1019 const xDouble onesBit = _mm_and_pd(sigy, onesMask);
1020
1021 mask = (xDouble)_mm_add_epi64((xUInt64)mask, (xUInt64)double_exp_lsb); // 2^(floor(lg|y|)+1)
1022 const xDouble fractUnMask = mask - xOne; // 1s in all the integer valued bits of significand
1023 const xUInt32 fractionalBits = _mm_andnot_si128((xUInt32)fractUnMask, (xUInt32)absuy);
1024 const int anyFractionBit = 0xff & _mm_movemask_epi8( _mm_cmpeq_epi8(fractionalBits, _mm_setzero_si128() ) ) ;
1025 const int anyOnesBit = 0xff & _mm_movemask_epi8( _mm_cmpeq_epi8((xUInt32)onesBit, _mm_setzero_si128() ) ); // Is there a faster way to do this?
1026 yisint = (0xff == anyFractionBit);
1027 yisodd = (yisint && (0xff != anyOnesBit));
1028#if DEBUG
1029 printf("int: %d (%d), odd: %d (%d) %vllx %vllx %vllx\n", yisint, anyFractionBit, yisodd, anyOnesBit, fractionalBits, fractUnMask, onesBit);
1030#endif
1031 }
1032#if DEBUG
1033 printf("y hi: %a %x int: %d, odd: %d\n",y,absuyhi, yisint, yisodd);
1034#endif
1035
1036 // Handle most edge cases
1037 //If |x| or |y| is in { +-0, +-Inf, +-NaN }
1038 if( EXPECT_FALSE(absuxhi >= 0x7ff00000U
1039 || absuyhi >= 0x7ff00000U
1040 || _mm_istrue_sd( _mm_or_pd(_mm_cmpeq_pd(_mm_setzero_pd(), vx),_mm_cmpeq_pd(_mm_setzero_pd(), vy)))
1041 )
1042 )
1043 {
1044 // any**0 = 1.0f for all values, including NaN
1045 if( 0. == y )
1046 return one;
1047
1048 // handle NaNs
1049 if( x != x || y != y )
1050 return x + y;
1051
1052 if( 0. == x )
1053 {
1054 //if y is an odd integer
1055 if( yisodd )
1056 {
1057 if( y < 0.0 )
1058 return one / x;
1059
1060 return x;
1061 }
1062
1063 // y is not an odd integer
1064 if( 0.0 < y )
1065 return 0.0;
1066
1067 return one / __builtin_fabs(x); // return Inf and set div/0
1068 }
1069
1070 // deal with infinite y (already dealt with NaN)
1071 if( 0x7ff00000U == absuyhi )
1072 {
1073 if( -1.0 == x )
1074 return one;
1075
1076 if( absuxhi >= 0x3ff00000U ) // |x| > 1.0 (already handled == 1.0)
1077 { // |x| > 1.0
1078 if( 0.0 < y )
1079 return y;
1080 else
1081 return 0.0;
1082 }
1083 else
1084 { // |x| < 1.0
1085 if( 0.0 < y )
1086 return 0.0;
1087 else
1088 return __builtin_fabs(y);
1089 }
1090 }
1091
1092 // we can also deal with x == +inf at this point.
1093 if( x == __builtin_inf() )
1094 {
1095 if( y < 0.0 )
1096 return 0.0;
1097 else
1098 return x;
1099 }
1100
1101 // At this point, we know that x is in { +-0, -Inf } and y is finite non-zero.
1102 // Deal with y is odd integer cases
1103 if( yisodd ) // if( |y| >= 1.0 || |y| < 0x1.0p53 )
1104 {
1105 // x == -inf
1106 if( 0.0 < y )
1107 return x;
1108
1109 return -0.0;
1110 }
1111
1112 // x == -inf
1113 if( 0.0 < y )
1114 return -x;
1115
1116 return 0.0;
1117 }
1118
1119 const double absy = __builtin_fabs(y);
1120 //one last edge case -- pow(x, y) returns NaN and raises invalid for x < 0 and finite non-integer y
1121 // and one special case -- call sqrt for |y| == 0.5
1122 if( EXPECT_FALSE((x < 0.0 && !yisint) || (0.5 == absy)) )
1123 {
1124 if( x < 0.0 || y > 0.0 )
1125 return sqrt(x);
1126
1127 return one / sqrt( x );
1128 }
1129
1130 //Handle yisint at this point using long double
1131// if( yisint && (absuy < 0x41e0000000000000ULL)) {
1132 if( yisint && (absy < 0x1p8)) {
1133 //calculate ix = f**i
1134 long double ix = 1.0, lx = (long double) x;
1135
1136 //if y is negative, we will need to take the reciprocal eventually
1137 //Do it now to avoid underflow when we should get overflow
1138 //but don't do it if iy is zero to avoid spurious overflow
1139 if( y < 0. )
1140 lx = 1.0L/ lx;
1141
1142 //calculate x**i by doing lots of multiplication
1143 int i = (int)absy; // take abs of y since we have done the recip.
1144 int mask = 1;
1145
1146 //for each of the bits set in i, multiply ix by x**(2**bit_position)
1147 while(i != 0)
1148 {
1149 if( i & mask )
1150 {
1151 ix *= lx;
1152 i -= mask;
1153 }
1154 mask += mask;
1155 lx *= lx; // In double this might overflow spuriously, but not in long double
1156 }
1157 return (double)ix; // May legitimately under/overflow at this point.
1158 }
1159 }
1160#else
1161 {
1162 if( x == one || y == one)
1163 return x;
1164
1165 //Move the arguments to the integer registers for bitwise inspection
1166 union{ double d; uint64_t u; } ux, uy;
1167 ux.d = x;
1168 uy.d = y;
1169 uint64_t absux = ux.u & 0x7fffffffffffffffULL;
1170 uint64_t absuy = uy.u & 0x7fffffffffffffffULL;
1171
1172 //figure out if y is an odd integer
1173 //Find out if y is an integer or not without raising inexact
1174 //Fails for Inf/NaN. We don't care about that here.
1175 if (EXPECT_FALSE(absuy >= 0x4340000000000000ULL)) { // |y| >= 0x1p53 implies y is an even int
1176 yisint = 1;
1177 } else if (EXPECT_TRUE(absuy < 0x4000000000000000ULL)) { // |y| < 2.0: for our purposes -1, 0, 1 are special ops and not integers ;->
1178 yisint = yisodd = (y == -1.0);
1179 } else {
1180 union{ double d; uint64_t u; } mask, onesMask, fractUnMask;
1181
1182 mask.u = (absuy & 0x7ff0000000000000ULL); // 2^(floor(lg|y|))
1183 onesMask.d = mask.d + one; // 1 in ones position of significand (for y >= 2)
1184 const uint64_t sigy = absuy & 0x000fffffffffffffULL;
1185 const uint64_t onesBit = sigy & onesMask.u;
1186
1187 mask.u = mask.u + 0x0010000000000000ULL; // 2^(floor(lg|y|)+1)
1188 fractUnMask.d = mask.d - one; // 1s in all the integer valued bits of significand
1189 const uint64_t fractionalBits = absuy & ~fractUnMask.u;
1190 yisint = (0 == fractionalBits);
1191 yisodd = (yisint && (0 != onesBit));
1192 }
1193
1194 // Handle most edge cases
1195 //If |x| or |y| is in { +-0, +-Inf, +-NaN }
1196 if( EXPECT_FALSE((absux - 1ULL) >= 0x7fefffffffffffffULL || (absuy - 1ULL) >= 0x7fefffffffffffffULL) )
1197 {
1198 // any**0 = 1.0f for all values, including NaN
1199 if( 0 == absuy )
1200 return one;
1201
1202 // handle NaNs
1203 if( x != x || y != y )
1204 return x + y;
1205
1206 if( 0 == absux )
1207 {
1208 //if y is an odd integer
1209 if( yisodd )
1210 {
1211 if( y < 0.0 )
1212 return one / x;
1213
1214 return x;
1215 }
1216
1217 // y is not an odd integer
1218 if( 0.0 < y )
1219 return 0.0;
1220
1221 return one / __builtin_fabs(x); // return Inf and set div/0
1222 }
1223
1224 // deal with infinite y
1225 if( 0x7ff0000000000000ULL == absuy )
1226 {
1227 if( -1.0 == x )
1228 return one;
1229
1230 if( absux >= 0x3ff0000000000000ULL ) // |x| > 1.0 (already handled == 1.0)
1231 { // |x| > 1.0
1232 if( 0.0 < y )
1233 return y;
1234 else
1235 return 0.0;
1236 }
1237 else
1238 { // |x| < 1.0
1239 if( 0.0 < y )
1240 return 0.0;
1241 else
1242 return __builtin_fabs(y);
1243 }
1244 }
1245
1246 // we can also deal with x == +inf at this point.
1247 if( x == __builtin_inf() )
1248 {
1249 if( y < 0.0 )
1250 return 0.0;
1251 else
1252 return x;
1253 }
1254
1255 // At this point, we know that x is in { +-0, -Inf } and y is finite non-zero.
1256 // Deal with y is odd integer cases
1257 if( yisodd ) // if( |y| >= 1.0 || |y| < 0x1.0p53 )
1258 {
1259 // x == -inf
1260 if( 0.0 < y )
1261 return x;
1262
1263 return -0.0;
1264 }
1265
1266 // x == -inf
1267 if( 0.0 < y )
1268 return -x;
1269
1270 return 0.0;
1271 }
1272
1273 //one last edge case -- pow(x, y) returns NaN and raises invalid for x < 0 and finite non-integer y
1274 // and one special case -- call sqrt for |y| == 0.5
1275 if( EXPECT_FALSE((x < 0.0 && !yisint) || (0x3fe0000000000000ULL == absuy)) )
1276 {
1277 if( x < 0.0 || y > 0.0 )
1278 return sqrt(x);
1279
1280 return one / sqrt( x );
1281 }
1282
1283 //Handle yisint at this point using long double
1284// if( yisint && (absuy < 0x41e0000000000000ULL)) {
1285 const double absy = fabs(y);
1286 if( yisint && (absy < 0x1p8)) {
1287 //calculate ix = f**i
1288 long double ix = 1.0, lx = (long double) x;
1289
1290 //if y is negative, we will need to take the reciprocal eventually
1291 //Do it now to avoid underflow when we should get overflow
1292 //but don't do it if iy is zero to avoid spurious overflow
1293 if( y < 0. )
1294 lx = 1.0L/ lx;
1295
1296 //calculate x**i by doing lots of multiplication
1297 int i = (int)absy; // take abs of y since we have done the recip.
1298 int mask = 1;
1299
1300 //for each of the bits set in i, multiply ix by x**(2**bit_position)
1301 while(i != 0)
1302 {
1303 if( i & mask )
1304 {
1305 ix *= lx;
1306 i -= mask;
1307 }
1308 mask += mask;
1309 lx *= lx; // In double this might overflow spuriously, but not in long double
1310 }
1311 return (double)ix; // May legitimately under/overflow at this point.
1312 }
1313 }
1314#endif
1315
1316 // end of special ops handling
1317
1318/*
1319 We have ruled out all cases with x or y in {nan, -inf, 0, 1, inf}, x=-1, invalid cases.
1320 Still need to worry about numeric overflow and underflow.
1321*/
1322
1323 const double absx = __builtin_fabs(x);
1324 const double signx = (x < 0.0 && yisodd)?-1.0:1.0; // adjustment to the sign if needed
1325 if(x == -1.0) return signx;
1326
1327 long double temp;
1328
1329 //use fyl2x to get y*log2(x)
1330 const double *py = &y;
1331 const double *pabsx = &absx;
1332 asm volatile( "fldl (%1)\n fldl (%2)\n fyl2x \n fstpt %0" : "=m" (*(&temp)) : "r" (py), "r" (pabsx), "m"(absx), "m"(y) );
1333 const long double lw = temp;
1334 const long double abslw = __builtin_fabsl(lw);
1335
1336 //const long double lw = __fyl2x((long double)y, (long double)absx);
1337
1338 // Compute exp2(lw)
1339 if (lw > POW_OVERFLOW_GUARANTEED) return signx * XDOUBLE_2_DOUBLE(REQUIRED_MULTIPLY_sd(big,big)); //big*big, raise overflow
1340
1341 // TODO fix this for directed modes lw < 0 ? 0x1.fffffffffffffp-1|1 : 1|0x1.0000000000001p0
1342 if (abslw < POW_1_GUARANTEED) return signx * 1.0; // Avoid spurious underflow
1343/* Note: another way to approach checking to see if the result is 1.0 with double in doulbe is
1344_mm_add_epi64((xInt64)absy, (((absx >> 11) | 1p11) - 1.ffcp11)) < 1p-57
1345*/
1346
1347 if (lw < POW_UNDERFLOW_GUARANTEED) return signx * XDOUBLE_2_DOUBLE(REQUIRED_MULTIPLY_sd(small,small));//small*small, raise underflow
1348 const long double wn = __builtin_floorl(lw); // TODO: long double or double?
1349 const long double lwf = lw - wn;
1350/* **************************************************************** */
1351
1352
1353/*
1354Note that we can begin the calculation of thi once we know wfest
1355(which we get from west).
1356 x**y = 2**(y lg(x))
1357 = 2**(m + (west-m) + ...)
1358 = 2**m exp2(wfhi + wflo)
1359 = 2**m exp2(wfhi)exp2(wflo)
1360 = 2**m (thi + tlom1 * thi)
1361
1362 thi = exp2(wfhi), 0 <= wfhi < 1
1363*/
1364
1365//exp2m1 implementation for the reduced argument here....
1366 //b1 = first few bits of f (multiple of 2^-k1). 0 <= b1 < n1
1367 const int b1 = ((int)(lwf * TWO_N1));
1368 const double d1 = Exp2Table[b1][0]; // -2^-16 < wfest - d1 < 2^-k1
1369
1370/* const double twoI = u.d; */
1371
1372 //d2 = f - d1. |d2| < 2^-k1
1373 const double d2 = (wn == -1.0) ? lw - (d1 - one) : lwf - d1 ; //TODO do we still need this with long double?
1374
1375 //thi = exp2(wfhi), |wfhi| < 1/2
1376
1377/*
1378Now that we have defined the factors we can think about the logarithms.
1379We stick with between working with log base 2
1380which is convenient for working with the exponents.
1381
1382Compute 2 ** w = 2**(wn+wfhi+wflo)
1383 = 2**wn 2**wfhi 2**wflo;
1384 = 2**wn exp2(wfhi) exp(wflo)
1385Where w = wn+wfhi+wflo.
1386Let thi = 2**wfhi = exp2(wfhi), tlom1 = exp2m1(wflo)
1387 exp2(wfhi) exp2(wflo) = thi (1 + tlom1)
1388 = thi + tlom1 * thi
1389This last expression should behave well enough numerically.
1390*/
1391
1392 //thi = R(exp2(d1))
1393 const double thi = Exp2Table[b1][1];
1394
1395 const double wflo = d2;
1396
1397/* Now we can get the rest of the exponential
1398 tlom1 = expm1(wflo)
1399 x**y = 2**(y lg(x))
1400 = 2**m exp2(wfhi)exp(wflo)
1401 = 2**m (thi + thi tlom1)
1402*/
1403
1404/*
1405We want to compute p(r) but early we know r' = d2 = r - wftail
1406So |r - r'| = |wftail| <~ |ccp| < 2**-30
1407So |r^n - r'^n| < n 2**-30 r^n-1 < n 2**-(30+7*(n-1))
1408 */
1409 const double pwflo = ( ( ( (
1410 Exp2Poly2m7[0] //t0
1411 * wflo + Exp2Poly2m7[1] ) //t1+wflo(t0)
1412 * wflo + Exp2Poly2m7[2] ) //t2+wflo(t1+wflo(t0))
1413 * wflo + Exp2Poly2m7[3] ) //t3+wflo(t2+wflo(t1+wflo(t0)))
1414 * wflo + Exp2Poly2m7[4] ); //t4+wflo(t3+wflo(t2+wflo(t1+wflo(t0))))
1415 const double tlom1 = wflo * pwflo;
1416
1417 const int m = (int)wn;
1418 const int m1 = m >> 1;
1419 const int m2 = m - m1;
1420
1421 // We break 2**m into two pieces to sneak up on the over/underflow boundary
1422 const double scale1 = signx * twoton(m1);
1423 const double scale2 = twoton(m2);
1424 const double zf = thi + thi*tlom1;
1425 const double z = scale1 * (scale2 * zf); // todo add Steves underflow trick
1426#if DEBUG
1427 printf("fyl2x: \t%a*lg(%a) = \t%La --> \n",y,absx,lw);
1428 printf("%La + %La (= %a[%d] + %a) --> %a * %a * %a (%a + 1)) = %La\n",wn,lwf,d1,b1,d2,scale1,scale2,thi,tlom1,z);
1429#endif
1430
1431 return z;
1432}
1433
1434#include <math.h>
1435#include <float.h>
1436
1437//
1438// This is not the worlds best power function. It is merely a simple one that
1439// gives pretty good accuracy, with better range and precision than the double precision
1440// one above. It should be off by no more than a few ulps, depending on the accuracy of
1441// exp2 and log2, which are in turn depedent on the hardware fyl2x and .
1442//
1443// Since this is a long double implementation, I have chosen to be more conservative
1444// about the level license I take with the C99 spec. It is rigorous about it's flags.
1445// It is perhaps a bit too rigorous about the inexact flag, which we are allowed to abose.
1446// It could be sped up by replacing nearbyintl with floor or round as appropriate.
1447//
1448long double powl( long double x, long double y )
1449{
1450 static const double neg_epsilon = 0x1.0p63;
1451
1452 //if x = 1, return x for any y, even NaN
1453 if( x == 1.0 )
1454 return x;
1455
1456 //if y == 0, return 1 for any x, even NaN
1457 if( y == 0.0 )
1458 return 1.0L;
1459
1460 //get NaNs out of the way
1461 if( x != x || y != y )
1462 return x + y;
1463
1464 //do the work required to sort out edge cases
1465 long double fabsy = __builtin_fabsl( y );
1466 long double fabsx = __builtin_fabsl( x );
1467 long double infinity = __builtin_infl();
1468 long double iy = nearbyintl( fabsy ); //we do round to nearest here so that |fy| <= 0.5
1469 if( iy > fabsy )//convert nearbyint to floor
1470 iy -= 1.0L;
1471 int isOddInt = 0;
1472 if( fabsy == iy && fabsy != infinity && iy < neg_epsilon )
1473 isOddInt = iy - 2.0L * nearbyintl( 0.5L * iy ); //might be 0, -1, or 1
1474
1475 ///test a few more edge cases
1476 //deal with x == 0 cases
1477 if( x == 0.0 )
1478 {
1479 if( ! isOddInt )
1480 x = 0.0L;
1481
1482 if( y < 0 )
1483 x = 1.0L/ x;
1484
1485 return x;
1486 }
1487
1488 //x == +-Inf cases
1489 if( fabsx == infinity )
1490 {
1491 if( x < 0 )
1492 {
1493 if( isOddInt )
1494 {
1495 if( y < 0 )
1496 return -0.0;
1497 else
1498 return -infinity;
1499 }
1500 else
1501 {
1502 if( y < 0 )
1503 return 0.0;
1504 else
1505 return infinity;
1506 }
1507 }
1508
1509 if( y < 0 )
1510 return 0;
1511 return infinity;
1512 }
1513
1514 //y = +-inf cases
1515 if( fabsy == infinity )
1516 {
1517 if( x == -1 )
1518 return 1;
1519
1520 if( y < 0 )
1521 {
1522 if( fabsx < 1 )
1523 return infinity;
1524 return 0;
1525 }
1526 if( fabsx < 1 )
1527 return 0;
1528 return infinity;
1529 }
1530
1531 // x < 0 and y non integer case
1532 if( x < 0 && iy != fabsy )
1533 {
1534 SET_INVALID_FLAG();
1535 return nanl("37");
1536 }
1537
1538 //speedy resolution of sqrt and reciprocal sqrt
1539 if( fabsy == 0.5 )
1540 {
1541 x = sqrtl( x );
1542 if( y < 0 )
1543 x = 1.0L/ x;
1544 return x;
1545 }
1546
1547 //Enter the main power function. This is done as:
1548 //
1549 // split up x**y as:
1550 //
1551 // x**y = x**(i+f) i = integer part of y, f = positive fractional part
1552 // = x**f * x**i
1553 //
1554 long double fy = fabsy - iy;
1555
1556 long double fx = 1.0;
1557 long double ix = 1.0;
1558
1559 //Calculate fx = x**f
1560 if( fy != 0 ) //This is expensive and may set unwanted flags. skip if unneeded
1561 {
1562 fx =log2l(x);
1563
1564 long double fabsfx = __builtin_fabsl( fx );
1565 long double min = fminl( fy, fabsfx );
1566 long double max = fmaxl( fy, fabsfx );
1567
1568 if( y < 0 )
1569 fy = -fy;
1570
1571 //if fx * fy is a denormal, we get spurious underflow here, so try to avoid that
1572 if( min < 0x1.0p-8191L && max < neg_epsilon ) //a crude test for a denormal product
1573 {
1574 fx = 1; //for small numbers, skip straight to the result
1575 }
1576 else
1577 { //safe to do the work
1578 fx *= fy;
1579 fx = exp2l( fx );
1580 }
1581 }
1582
1583 //calculate ix = f**i
1584
1585 //if y is negative, we will need to take the reciprocal eventually
1586 //Do it now to avoid underflow when we should get overflow
1587 //but don't do it if iy is zero to avoid spurious overflow
1588 if( y < 0 && iy != 0 )
1589 x = 1.0L/ x;
1590
1591 //calculate x**i by doing lots of multiplication
1592 while( iy != 0.0L )
1593 {
1594 long double ylo;
1595
1596 //early exit for underflow and overflow. Otherwise we may end up looping up to 16383 times here.
1597 if( x == 0.0 || x == infinity )
1598 {
1599 ix *= x; //we know this is the right thing to do, because iy != 0
1600 break;
1601 }
1602
1603 //chop off 30 bits at a time
1604 if( iy > 0x1.0p30 )
1605 {
1606 long double scaled = iy * 0x1.0p-30L;
1607 long double yhi = nearbyintl( scaled );
1608 if( yhi > scaled )
1609 yhi -= 1.0;
1610 ylo = iy - 0x1.0p30L * yhi;
1611 iy = yhi;
1612 }
1613 else
1614 { //faster code for the common case
1615 ylo = iy;
1616 iy = 0;
1617 }
1618
1619 int j;
1620 int i = ylo;
1621 int mask = 1;
1622
1623 //for each of the 30 bits set in i, multiply ix by x**(2**bit_position)
1624 if( i & 1 )
1625 {
1626 ix *= x;
1627 i -= mask;
1628 }
1629 for( j = 0; j < 30 && i != 0; j++ )
1630 {
1631 mask += mask;
1632 x *= x;
1633 if( i & mask )
1634 {
1635 ix *= x;
1636 i -= mask;
1637 }
1638 }
1639
1640 //we may have exited early from the loop above.
1641 //If so, and there are still bits in iy finish out the multiplies
1642 if( 0.0 != iy )
1643 for( ; j < 30; j++ )
1644 x *= x;
1645 }
1646
1647 x = fx * ix;
1648
1649 return x;
1650}
1651
1652
1653#pragma mark -
1654#pragma mark cbrt
1655
1656static inline double _cbrt( double _x ) ALWAYS_INLINE;
1657
1658double _cbrt( double _x )
1659{
1660 static const double infinity = __builtin_inf();
1661 static const double smallestNormal = 0x1.0p-1022;
1662 static const double twom968 = 0x1.0p-968;
1663 static const xUInt64 oneThird = { 0x55555556ULL, 0 };
1664 static const xUInt32 denormBias = { 0, 696219795U, 0, 0 };
1665 static const xUInt32 normalBias = { 0, 0x1200000U, 0, 0 };
1666
1667 static const double C = 5.42857142857142815906e-01; /* 19/35 = 0x3FE15F15, 0xF15F15F1 */
1668 static const double D = -7.05306122448979611050e-01; /* -864/1225 = 0xBFE691DE, 0x2532C834 */
1669 static const double E = 1.41428571428571436819e+00; /* 99/70 = 0x3FF6A0EA, 0x0EA0EA0F */
1670 static const double F = 1.60714285714285720630e+00; /* 45/28 = 0x3FF9B6DB, 0x6DB6DB6E */
1671 static const double G = 3.57142857142857150787e-01; /* 5/14 = 0x3FD6DB6D, 0xB6DB6DB7 */
1672
1673 static const xDouble expMask = { __builtin_inf(), 0 };
1674 static const xUInt64 topMask = { 0xFFFFFFFF00000000ULL, 0 };
1675 static const double twom20 = 0x1.0p-20;
1676
1677 xDouble x = DOUBLE_2_XDOUBLE( _x );
1678
1679 if( EXPECT_FALSE( _mm_istrue_sd( _mm_cmpunord_sd( x, x ) ) ) )
1680 return _x + _x;
1681
1682 xDouble sign = _mm_and_pd( x, minusZeroD ); //set aside sign
1683 x = _mm_andnot_pd( minusZeroD, x ); //x = fabs(x)
1684
1685 if( EXPECT_FALSE( _mm_istrue_sd( _mm_cmpeq_sdm( x, &infinity)) ) )
1686 return _x;
1687
1688 if( EXPECT_TRUE( _x != 0.0 ) )
1689 {
1690 xDouble isDenorm = _mm_cmplt_sdm( x, &smallestNormal );
1691 xDouble t = _mm_and_pd( _mm_load_sd( &twom968 ), isDenorm ); //t is 0 for normals, and 2**54 for denormals
1692 t = _mm_sub_sd( _mm_or_pd( t, x ), t ); //multiply of t * x for denormals. Exact for normals.
1693
1694 //prepare cheesy estimate of t**1/3 by dividing high 32-bits by 3
1695 xSInt32 addend = _mm_add_epi32( _mm_andnot_si128( (xSInt32) isDenorm, normalBias), denormBias );
1696 t = (xDouble) _mm_mul_epu32( _mm_srli_epi64( (xSInt64) t, 32 ), oneThird );
1697 t = (xDouble) _mm_add_epi32( (xSInt32) t, addend );
1698
1699 //new cbrt to a reported 23 bits (may be implemented in single precision
1700 xDouble r = _mm_div_sd( _mm_mul_sd( t, t ), x ); //r = t*t/x
1701 xDouble s = _mm_add_sdm( _mm_mul_sd( r, t ), &C ); //s = C + r*t
1702 xDouble y = _mm_add_sdm( s, &E );
1703 xDouble z = _mm_div_sd( _mm_load_sd( &D ), s );
1704 y = _mm_add_sd( y, z );
1705 y = _mm_div_sd( _mm_load_sd( &F ), y );
1706 y = _mm_add_sdm( y, &G );
1707 t = _mm_mul_sd( t, y );
1708
1709 /* chopped to 20 bits and make it larger than cbrt(x) */
1710 xDouble add = _mm_mul_sdm( t, &twom20 );
1711 add = _mm_and_pd( add, expMask );
1712 t = _mm_add_sd( t, add );
1713 t = _mm_and_pd( t, (xDouble) topMask );
1714
1715 /* one step newton iteration to 53 bits with error less than 0.667 ulps */
1716 s = _mm_mul_sd( t, t ); //exact
1717 r = _mm_div_sd( x, s );
1718 xDouble w = _mm_add_sd( t, t );
1719 w = _mm_add_sd( w, r );
1720 r = _mm_sub_sd( r, t );
1721 r = _mm_div_sd( r, w );
1722 t = _mm_add_sd( t, _mm_mul_sd( t, r ) );
1723
1724 //restore sign
1725 t = _mm_or_pd( t, sign );
1726
1727 return XDOUBLE_2_DOUBLE( t );
1728 }
1729
1730 return _x; //result for 0.0 and -0.0
1731}
1732
1733double cbrt( double x )
1734{
1735 return _cbrt( x );
1736}
1737
1738#if 0
1739/* **************** OLD STUFF **************** */
1740/*
1741 * xmm_power.c
1742 * xmmLibm
1743 *
1744 * Created by Ian Ollmann, Ph.D. on 7/15/05.
1745 * Copyright © 2005 Apple Computer, Inc. All rights reserved.
1746 *
1747 * Constants from original typing by Earl Killian of MIPS on March 23rd, 1992.
1748 * Converted from pairs of 32-bit hexadecimal words to C99 notation, by Ian Ollmann
1749 *
1750 * Algorithm from Peter Tang:
1751 *
1752 * ACM Transactions on Mathematical Software, Vol 15, 2, June 1989, pp 144-157
1753 * ACM Transactions on Mathematical Software, Vol 18, 2, June 1992, pp 211-222
1754 *
1755 */
1756
1757#include "xmmLibm_prefix.h"
1758
1759#include "math.h"
1760
1761static const double T1 = 0x1.F800000000000p-1; // 0.984375 // T1 = 1-1/64
1762static const double T2 = 0x1.0400000000000p+0; // 1.015625 // T2 = 1+1/64
1763static const double T52 = 0x1.0000000000000p+52; // 4503599627370496 // T52 = 2^52
1764static const double T53 = 0x1.0000000000000p+53; // 9007199254740992 // T53 = 2^53
1765static const double Emax = 0x1.62E42FEFA39EFp+9; //709.782712893383973096
1766static const double Emin = -0x1.74385446D71C3p+9; //-744.44007192138121809
1767static const double A1 = 0x1.5555555555555p-4; //0.0833333333333333287074
1768static const double A2 = 0x1.99999999FE736p-7; //0.0125000000007165872062
1769static const double A3 = 0x1.24919E6600596p-9; //0.00223212297987691443008
1770static const double B1 = 0x1.555555554F9EDp-4; //0.0833333333330085884727
1771static const double B2 = 0x1.999A118F10BD9p-7; //0.0125000558601921375051
1772static const double C1 = 0x1.5555555555555p-4; //0.0833333333333333287074
1773static const double C2 = 0x1.99999999AF7C8p-7; //0.0125000000001555117146
1774static const double C3 = 0x1.24923B2F1315Cp-9; //0.00223214123210461849733
1775static const double C4 = 0x1.CE20EE795DBA1p-12; //0.00044072021372392784647
1776static const double C5 = 0x1.CE20EE795DBA1p-12; //0.00044072021372392784647
1777static const double Inv_L = 0x1.71547652B82FEp+5; //46.1662413084468283841
1778static const double L1 = 0x1.62E42FEF00000p-6; //0.0216608493901730980724
1779static const double L2 = 0x1.473DE6AF278EDp-39; //2.32519284687887401481e-12
1780static const double P1 = 0x1.0000000000000p-1; // 0.5
1781static const double P2 = 0x1.5555555547334p-3; //0.166666666665059914898
1782static const double P3 = 0x1.555555554A9D2p-5; //0.0416666666663619983391
1783static const double P4 = 0x1.1111609FBE568p-7; //0.00833337038010269204324
1784static const double P5 = 0x1.6C172098CB78Bp-10; //0.0013888944287816253325
1785static const double plusinf = 1e500; // inf
1786
1787static const double logtable[129*2] = {
1788 0.0, // 0
1789 0.0, // 0
1790 0x1.FE02A6B200000p-8, //0.00778214044294145423919
1791 -0x1.F30EE07912DF9p-41, //-8.86505291726724739329e-13
1792 0x1.FC0A8B1000000p-7, //0.015504186536418274045
1793 -0x1.FE0E183092C59p-42, //-4.5301989413649348858e-13
1794 0x1.7B91B07D80000p-6, //0.0231670592820591991767
1795 -0x1.2772AB6C0559Cp-41, //-5.24820947929564425056e-13
1796 0x1.F829B0E780000p-6, //0.0307716586667083902285
1797 0x1.980267C7E09E4p-45, //4.52981425779092882775e-14
1798 0x1.39E87BA000000p-5, //0.0383188643027096986771
1799 -0x1.42A056FEA4DFDp-41, //-5.7309948330766312415e-13
1800 0x1.77458F6340000p-5, //0.0458095360318111488596
1801 -0x1.2303B9CB0D5E1p-41, //-5.16945692881222029089e-13
1802 0x1.B42DD71180000p-5, //0.053244514518155483529
1803 0x1.71BEC28D14C7Ep-41, //6.56799336898521766515e-13
1804 0x1.F0A30C0100000p-5, //0.0606246218158048577607
1805 0x1.62A6617CC9717p-41, //6.29984819938331143924e-13
1806 0x1.16536EEA40000p-4, //0.0679506619089806918055
1807 -0x1.0A3E2F3B47D18p-41, //-4.72942410916632905482e-13
1808 0x1.341D7961C0000p-4, //0.0752234212377516087145
1809 -0x1.717B6B33E44F8p-43, //-1.64083015855986619259e-13
1810 0x1.51B073F060000p-4, //0.0824436692109884461388
1811 0x1.83F69278E686Ap-44, //8.61451293608781447223e-14
1812 0x1.6F0D28AE60000p-4, //0.089612158690215437673
1813 -0x1.2968C836CC8C2p-41, //-5.28305053080814367877e-13
1814 0x1.8C345D6320000p-4, //0.0967296264589094789699
1815 -0x1.937C294D2F567p-42, //-3.58366674300941370128e-13
1816 0x1.A926D3A4A0000p-4, //0.103796793680885457434
1817 0x1.AAC6CA17A4554p-41, //7.58107392301637643358e-13
1818 0x1.C5E548F5C0000p-4, //0.110814366340491687879
1819 -0x1.C5E7514F4083Fp-43, //-2.01573684160162150917e-13
1820 0x1.E27076E2A0000p-4, //0.117783035655520507134
1821 0x1.E5CBD3D50FFFCp-41, //8.62947404296943765415e-13
1822 0x1.FEC9131DC0000p-4, //0.12470347850103280507
1823 -0x1.54555D1AE6607p-44, //-7.55692068745133691756e-14
1824 0x1.0D77E7CD10000p-3, //0.131576357789526809938
1825 -0x1.C69A65A23A170p-41, //-8.075373495358435282e-13
1826 0x1.1B72AD52F0000p-3, //0.138402322858382831328
1827 0x1.9E80A41811A39p-41, //7.36304357708705134617e-13
1828 0x1.29552F8200000p-3, //0.145182009844575077295
1829 -0x1.5B967F4471DFCp-44, //-7.71800133682809851086e-14
1830 0x1.371FC201F0000p-3, //0.151916042026641662233
1831 -0x1.C22F10C9A4EA8p-41, //-7.99687160774375808217e-13
1832 0x1.44D2B6CCB0000p-3, //0.158605030175749561749
1833 0x1.F4799F4F6543Ep-41, //8.890223439724662699e-13
1834 0x1.526E5E3A20000p-3, //0.165249572895845631137
1835 -0x1.2F21746FF8A47p-41, //-5.38468261878823239516e-13
1836 0x1.5FF3070A80000p-3, //0.171850256927427835763
1837 -0x1.B0B0DE3077D7Ep-41, //-7.6861342240181686233e-13
1838 0x1.6D60FE71A0000p-3, //0.178407657473144354299
1839 -0x1.6F1B955C4D1DAp-42, //-3.26057179310581566492e-13
1840 0x1.7AB8902110000p-3, //0.184922338494288851507
1841 -0x1.37B720E4A694Bp-42, //-2.76858843104483055456e-13
1842 0x1.87FA065210000p-3, //0.191394853000019793399
1843 -0x1.B77B7EFFB7F41p-42, //-3.90338789379495198219e-13
1844 0x1.9525A9CF40000p-3, //0.197825743329303804785
1845 0x1.5AD1D904C1D4Ep-41, //6.16075577558872326221e-13
1846 0x1.A23BC1FE30000p-3, //0.20421554142922104802
1847 -0x1.2A739B23B93E1p-41, //-5.30156516006025969342e-13
1848 0x1.AF3C94E810000p-3, //0.210564769107804750092
1849 -0x1.00349CC67F9B2p-41, //-4.55112422774782019696e-13
1850 0x1.BC286742E0000p-3, //0.216873938301432644948
1851 -0x1.CCA75818C5DBCp-41, //-8.18285329273778346373e-13
1852 0x1.C8FF7C79B0000p-3, //0.223143551314933574758
1853 -0x1.97794F689F843p-41, //-7.23818992174968106057e-13
1854 0x1.D5C216B500000p-3, //0.229374101065332069993
1855 -0x1.11BA91BBCA682p-41, //-4.86240001538378988236e-13
1856 0x1.E27076E2B0000p-3, //0.235566071312860003673
1857 -0x1.A342C2AF0003Cp-44, //-9.30945949519688945136e-14
1858 0x1.EF0ADCBDC0000p-3, //0.241719936886511277407
1859 0x1.64D948637950Ep-41, //6.33890736899755317832e-13
1860 0x1.FB9186D5E0000p-3, //0.247836163904139539227
1861 0x1.F1546AAA3361Cp-42, //4.41717553713155466566e-13
1862 0x1.0402594B50000p-2, //0.253915209981641964987
1863 -0x1.7DF928EC217A5p-41, //-6.78520849597058843023e-13
1864 0x1.0A324E2738000p-2, //0.259957524436686071567
1865 0x1.0E35F73F7A018p-42, //2.39995404842117353465e-13
1866 0x1.1058BF9AE8000p-2, //0.265963548497893498279
1867 -0x1.A9573B02FAA5Ap-41, //-7.55556940028374187478e-13
1868 0x1.1675CABAB8000p-2, //0.271933715483100968413
1869 0x1.30701CE63EAB9p-41, //5.40790418614551497411e-13
1870 0x1.1C898C1698000p-2, //0.277868451003087102436
1871 0x1.9FAFBC68E7540p-42, //3.69203750820800887027e-13
1872 0x1.22941FBCF8000p-2, //0.283768173130738432519
1873 -0x1.A6976F5EB0963p-44, //-9.38341722366369999987e-14
1874 0x1.2895A13DE8000p-2, //0.289633292582948342897
1875 0x1.A8D7AD24C13F0p-44, //9.43339818951269030846e-14
1876 0x1.2E8E2BAE10000p-2, //0.2954642128934210632
1877 0x1.D309C2CC91A85p-42, //4.1481318704258567983e-13
1878 0x1.347DD9A988000p-2, //0.301261330578199704178
1879 -0x1.5594DD4C58092p-45, //-3.7923164802093146798e-14
1880 0x1.3A64C55698000p-2, //0.307025035295737325214
1881 -0x1.D0B1C68651946p-41, //-8.25463138725003992339e-13
1882 0x1.4043086868000p-2, //0.312755710003330023028
1883 0x1.3F1DE86093EFAp-41, //5.66865358290073900922e-13
1884 0x1.4618BC21C8000p-2, //0.318453731119006988592
1885 -0x1.09EC17A426426p-41, //-4.72372782198636743149e-13
1886 0x1.4BE5F95778000p-2, //0.324119468654316733591
1887 -0x1.D7C92CD9AD824p-44, //-1.04757500587765412913e-13
1888 0x1.51AAD872E0000p-2, //0.329753286372579168528
1889 -0x1.F4BD8DB0A7CC1p-44, //-1.11186713895593226425e-13
1890 0x1.5767717458000p-2, //0.335355541921671829186
1891 -0x1.2C9D5B2A49AF9p-41, //-5.33998929200329680741e-13
1892 0x1.5D1BDBF580000p-2, //0.340926586970454081893
1893 0x1.394A11B1C1EE4p-43, //1.39128412121975659358e-13
1894 0x1.62C82F2BA0000p-2, //0.34646676734701031819
1895 -0x1.C356848506EADp-41, //-8.01737271397201833369e-13
1896 0x1.686C81E9B0000p-2, //0.351976423156884266064
1897 0x1.4AEC442BE1015p-42, //2.9391859187648000773e-13
1898 0x1.6E08EAA2B8000p-2, //0.357455888921322184615
1899 0x1.0F1C609C98C6Cp-41, //4.81589611172320539489e-13
1900 0x1.739D7F6BC0000p-2, //0.362905493690050207078
1901 -0x1.7FCB18ED9D603p-41, //-6.81753940632532726416e-13
1902 0x1.792A55FDD8000p-2, //0.368325561159508652054
1903 -0x1.C2EC1F512DC03p-41, //-8.00999005543249141653e-13
1904 0x1.7EAF83B828000p-2, //0.373716409792905324139
1905 0x1.7E1B259D2F3DAp-41, //6.78756682315870616582e-13
1906 0x1.842D1DA1E8000p-2, //0.379078352934811846353
1907 0x1.62E927628CBC2p-43, //1.57612037739694350287e-13
1908 0x1.89A3386C18000p-2, //0.384411698911208077334
1909 -0x1.ED2A52C73BF78p-41, //-8.76037599077487426799e-13
1910 0x1.8F11E87368000p-2, //0.389716751140440464951
1911 -0x1.D3881E8962A96p-42, //-4.15251580634361213004e-13
1912 0x1.947941C210000p-2, //0.394993808240542421117
1913 0x1.6FABA4CDD147Dp-42, //3.26556988969071456956e-13
1914 0x1.99D9581180000p-2, //0.400243164127459749579
1915 -0x1.F753456D113B8p-42, //-4.47042650104524445082e-13
1916 0x1.9F323ECBF8000p-2, //0.405465108107819105498
1917 0x1.84BF2B68D766Fp-42, //3.45276479520397708744e-13
1918 0x1.A484090E58000p-2, //0.410659924984429380856
1919 0x1.D8515FE535B87p-41, //8.39005077851830734139e-13
1920 0x1.A9CEC9A9A0000p-2, //0.415827895143593195826
1921 0x1.0931A909FEA5Ep-43, //1.17769787513692141889e-13
1922 0x1.AF12932478000p-2, //0.420969294644237379543
1923 -0x1.E53BB31EED7A9p-44, //-1.07743414616095792458e-13
1924 0x1.B44F77BCC8000p-2, //0.426084395310681429692
1925 0x1.EC5197DDB55D3p-43, //2.1863343293215910319e-13
1926 0x1.B985896930000p-2, //0.431173464818130014464
1927 0x1.0FB598FB14F89p-42, //2.41326394913331314894e-13
1928 0x1.BEB4D9DA70000p-2, //0.436236766774527495727
1929 0x1.B7BF7861D37ACp-42, //3.90574622098307022265e-13
1930 0x1.C3DD7A7CD8000p-2, //0.44127456080423144158
1931 0x1.6A6B9D9E0A5BDp-41, //6.43787909737320689684e-13
1932 0x1.C8FF7C79A8000p-2, //0.446287102628048160113
1933 0x1.A21AC25D81EF3p-42, //3.71351419195920213229e-13
1934 0x1.CE1AF0B860000p-2, //0.451274644139630254358
1935 -0x1.8290905A86AA6p-43, //-1.71669213360824320344e-13
1936 0x1.D32FE7E010000p-2, //0.456237433481874177232
1937 -0x1.42A9E21373414p-42, //-2.86582851579143533167e-13
1938 0x1.D83E7258A0000p-2, //0.461175715121498797089
1939 0x1.79F2828ADD176p-41, //6.71369279138460114513e-13
1940 0x1.DD46A04C20000p-2, //0.466089729925442952663
1941 -0x1.DAFA08CECADB1p-41, //-8.43728104087127572675e-13
1942 0x1.E24881A7C8000p-2, //0.470979715219073113985
1943 -0x1.3D9E34270BA6Bp-42, //-2.82101438461812689978e-13
1944 0x1.E744261D68000p-2, //0.475845904869856894948
1945 0x1.E1F8DF68DBCF3p-44, //1.07019317621142549209e-13
1946 0x1.EC399D2468000p-2, //0.480688529345570714213
1947 0x1.9802EB9DCA7E7p-43, //1.81193463664411114729e-13
1948 0x1.F128F5FAF0000p-2, //0.485507815781602403149
1949 0x1.BB2CD720EC44Cp-44, //9.84046527823262695501e-14
1950 0x1.F6123FA700000p-2, //0.490303988044615834951
1951 0x1.45630A2B61E5Bp-41, //5.78003198945402769376e-13
1952 0x1.FAF588F790000p-2, //0.495077266798034543172
1953 -0x1.9C24CA098362Bp-43, //-1.83028573560416684376e-13
1954 0x1.FFD2E08580000p-2, //0.499827869556611403823
1955 -0x1.6CF54D05F9367p-43, //-1.62074001567449500378e-13
1956 0x1.02552A5A5C000p-1, //0.504556010751912253909
1957 0x1.0FEC69C695D7Fp-41, //4.830331494955320223e-13
1958 0x1.04BDF9DA94000p-1, //0.509261901790523552336
1959 -0x1.92D9A033EFF75p-41, //-7.15605531723821174215e-13
1960 0x1.0723E5C1CC000p-1, //0.513945751101346104406
1961 0x1.F404E57963891p-41, //8.8821239518571854472e-13
1962 0x1.0986F4F574000p-1, //0.518607764208354637958
1963 -0x1.5BE8DC04AD601p-42, //-3.09005805132382426227e-13
1964 0x1.0BE72E4254000p-1, //0.523248143765158602037
1965 -0x1.57D49676844CCp-41, //-6.10765519728514951184e-13
1966 0x1.0E44985D1C000p-1, //0.527867089620485785417
1967 0x1.917EDD5CBBD2Dp-42, //3.56599696633478298092e-13
1968 0x1.109F39E2D4000p-1, //0.532464798869114019908
1969 0x1.92DFBC7D93617p-42, //3.57823965912763837621e-13
1970 0x1.12F7195940000p-1, //0.537041465897345915437
1971 -0x1.043ACFEDCE638p-41, //-4.62260870015445768969e-13
1972 0x1.154C3D2F4C000p-1, //0.541597282432121573947
1973 0x1.5E9A98F33A396p-41, //6.22797629172251525649e-13
1974 0x1.179EABBD88000p-1, //0.54613243759740726091
1975 0x1.9A0BFC60E6FA0p-41, //7.28389472720657362987e-13
1976 0x1.19EE6B467C000p-1, //0.550647117952394182794
1977 0x1.2DD98B97BAEF0p-42, //2.68096466152116723636e-13
1978 0x1.1C3B81F714000p-1, //0.555141507540611200966
1979 -0x1.EDA1B58389902p-44, //-1.09608250460592783688e-13
1980 0x1.1E85F5E704000p-1, //0.559615787935399566777
1981 0x1.A07BD8B34BE7Cp-46, //2.3119493838005377632e-14
1982 0x1.20CDCD192C000p-1, //0.564070138285387656651
1983 -0x1.4926CAFC2F08Ap-41, //-5.84690580052992446699e-13
1984 0x1.23130D7BEC000p-1, //0.568504735352689749561
1985 -0x1.7AFA4392F1BA7p-46, //-2.10374825114449422873e-14
1986 0x1.2555BCE990000p-1, //0.572919753562018740922
1987 -0x1.06987F78A4A5Ep-42, //-2.33231829455874083248e-13
1988 0x1.2795E1289C000p-1, //0.577315365035246941261
1989 -0x1.DCA290F81848Dp-42, //-4.23336942881419153586e-13
1990 0x1.29D37FEC2C000p-1, //0.5816917396350618219
1991 -0x1.EEA6F465268B4p-42, //-4.39339379697378426136e-13
1992 0x1.2C0E9ED448000p-1, //0.586049045003164792433
1993 0x1.D1772F5386374p-42, //4.13416470738355643357e-13
1994 0x1.2E47436E40000p-1, //0.590387446602107957006
1995 0x1.34202A10C3491p-44, //6.84176364159146659095e-14
1996 0x1.307D7334F0000p-1, //0.594707107746216934174
1997 0x1.0BE1FB590A1F5p-41, //4.75855340044306376333e-13
1998 0x1.32B1339120000p-1, //0.599008189645246602595
1999 0x1.D71320556B67Bp-41, //8.36796786747576938145e-13
2000 0x1.34E289D9D0000p-1, //0.603290851438941899687
2001 -0x1.E2CE9146D277Ap-41, //-8.57637346466586390378e-13
2002 0x1.37117B5474000p-1, //0.607555250224322662689
2003 0x1.ED71774092113p-43, //2.19132812293400917731e-13
2004 0x1.393E0D3564000p-1, //0.611801541106615331955
2005 -0x1.5E6563BBD9FC9p-41, //-6.22428425364311469584e-13
2006 0x1.3B6844A000000p-1, //0.616029877215623855591
2007 -0x1.EEA838909F3D3p-44, //-1.0983594325438429833e-13
2008 0x1.3D9026A714000p-1, //0.620240409751204424538
2009 0x1.6FAA404263D0Bp-41, //6.53104313776336534177e-13
2010 0x1.3FB5B84D18000p-1, //0.624433288012369303033
2011 -0x1.0BDA4B162AFA3p-41, //-4.75801990217107657695e-13
2012 0x1.41D8FE8468000p-1, //0.628608659422752680257
2013 -0x1.AA33736867A17p-42, //-3.78542512654570397313e-13
2014 0x1.43F9FE2F9C000p-1, //0.632766669570628437214
2015 0x1.CCEF4E4F736C2p-42, //4.09392332186786656392e-13
2016 0x1.4618BC21C4000p-1, //0.636907462236194987781
2017 0x1.EC27D0B7B37B3p-41, //8.74243839148582888557e-13
2018 0x1.48353D1EA8000p-1, //0.641031179420679109171
2019 0x1.1BEE7ABD17660p-42, //2.52181884568428814231e-13
2020 0x1.4A4F85DB04000p-1, //0.645137961373620782979
2021 -0x1.44FDD840B8591p-45, //-3.60813136042255739798e-14
2022 0x1.4C679AFCD0000p-1, //0.64922794662561500445
2023 -0x1.1C64E971322CEp-41, //-5.05185559242808977623e-13
2024 0x1.4E7D811B74000p-1, //0.653301272011958644725
2025 0x1.BB09CB0985646p-41, //7.86994033233553225797e-13
2026 0x1.50913CC018000p-1, //0.657358072709030238912
2027 -0x1.794B434C5A4F5p-41, //-6.70208769619490643267e-13
2028 0x1.52A2D265BC000p-1, //0.661398482245203922503
2029 0x1.6ABB9DF22BC57p-43, //1.61085757539324585156e-13
2030 0x1.54B2467998000p-1, //0.665422632544505177066
2031 0x1.497A915428B44p-41, //5.85271884362515112697e-13
2032 0x1.56BF9D5B40000p-1, //0.669430653942981734872
2033 -0x1.8CD7DC73BD194p-42, //-3.52467572979047943315e-13
2034 0x1.58CADB5CD8000p-1, //0.673422675212350441143
2035 -0x1.9DB3DB43689B4p-43, //-1.83720844956290584735e-13
2036 0x1.5AD404C358000p-1, //0.677398823590920073912
2037 0x1.F2CFB29AAA5F0p-41, //8.86066898134949155668e-13
2038 0x1.5CDB1DC6C0000p-1, //0.681359224807238206267
2039 0x1.7648CF6E3C5D7p-41, //6.64862680714687006264e-13
2040 0x1.5EE02A9240000p-1, //0.685304003098281100392
2041 0x1.67570D6095FD2p-41, //6.38316151706465171657e-13
2042 0x1.60E32F4478000p-1, //0.689233281238557538018
2043 0x1.1B194F912B417p-42, //2.51442307283760746611e-13
2044 0x1.62E42FEFA4000p-1, //0.693147180560117703862
2045 -0x1.8432A1B0E2634p-43 //-1.72394445256148347926e-13
2046 };
2047
2048static const double exptable[32*2] = {
2049 0x1.0000000000000p+0, // 1
2050 0.0, // 0
2051 0x1.059B0D3158540p+0, //1.02189714865410508082
2052 0x1.A1D73E2A475B4p-47, //1.15974117063913618369e-14
2053 0x1.0B5586CF98900p+0, //1.04427378242741042413
2054 0x1.EC5317256E308p-49, //3.41618797093084913461e-15
2055 0x1.11301D0125B40p+0, //1.06714040067681992241
2056 0x1.0A4EBBF1AED93p-48, //3.69575974405711634226e-15
2057 0x1.172B83C7D5140p+0, //1.09050773266524458904
2058 0x1.D6E6FBE462876p-47, //1.30701638697787231928e-14
2059 0x1.1D4873168B980p+0, //1.11438674259588310633
2060 0x1.53C02DC0144C8p-47, //9.42997619141976990955e-15
2061 0x1.2387A6E756200p+0, //1.13878863475667913008
2062 0x1.C3360FD6D8E0Bp-47, //1.25236260025620074908e-14
2063 0x1.29E9DF51FDEC0p+0, //1.16372485877757014805
2064 0x1.09612E8AFAD12p-47, //7.36576401089527357793e-15
2065 0x1.306FE0A31B700p+0, //1.18920711500271636396
2066 0x1.52DE8D5A46306p-48, //4.70275685574031410345e-15
2067 0x1.371A7373AA9C0p+0, //1.21524735998046651275
2068 0x1.54E28AA05E8A9p-49, //2.36536434724852953227e-15
2069 0x1.3DEA64C123400p+0, //1.2418578120734764525
2070 0x1.11ADA0911F09Fp-47, //7.59609684336943426188e-15
2071 0x1.44E0860618900p+0, //1.26905095719172322788
2072 0x1.68189B7A04EF8p-47, //9.99467515375775096979e-15
2073 0x1.4BFDAD5362A00p+0, //1.29683955465100098081
2074 0x1.38EA1CBD7F621p-47, //8.68512209487110863385e-15
2075 0x1.5342B569D4F80p+0, //1.32523664315974087913
2076 0x1.DF0A83C49D86Ap-52, //4.15501897749673983948e-16
2077 0x1.5AB07DD485400p+0, //1.35425554693688354746
2078 0x1.4AC64980A8C8Fp-47, //9.18083828572431297142e-15
2079 0x1.6247EB03A5580p+0, //1.38390988196383091235
2080 0x1.2C7C3E81BF4B7p-50, //1.04251790803720876383e-15
2081 0x1.6A09E667F3BC0p+0, //1.41421356237309225889
2082 0x1.921165F626CDDp-49, //2.78990693089087774733e-15
2083 0x1.71F75E8EC5F40p+0, //1.44518080697703510396
2084 0x1.9EE91B8797785p-47, //1.15160818747516875124e-14
2085 0x1.7A11473EB0180p+0, //1.47682614593949779191
2086 0x1.B5F54408FDB37p-50, //1.51947228890629129108e-15
2087 0x1.82589994CCE00p+0, //1.50916442759341862256
2088 0x1.28ACF88AFAB35p-48, //4.11720196080016564552e-15
2089 0x1.8ACE5422AA0C0p+0, //1.54221082540793474891
2090 0x1.B5BA7C55A192Dp-48, //6.074702681072821835e-15
2091 0x1.93737B0CDC5C0p+0, //1.57598084510787828094
2092 0x1.27A280E1F92A0p-47, //8.20551346575487959595e-15
2093 0x1.9C49182A3F080p+0, //1.61049033194925073076
2094 0x1.01C7C46B071F3p-48, //3.57742087137029902059e-15
2095 0x1.A5503B23E2540p+0, //1.64575547815395850648
2096 0x1.C8B424491CAF8p-48, //6.33803674368915982631e-15
2097 0x1.AE89F995AD380p+0, //1.68179283050741901206
2098 0x1.6AF439A68BB99p-47, //1.00739973218322238167e-14
2099 0x1.B7F76F2FB5E40p+0, //1.71861929812247637983
2100 0x1.BAA9EC206AD4Fp-50, //1.5357984302925880313e-15
2101 0x1.C199BDD855280p+0, //1.75625216037329323626
2102 0x1.C2220CB12A092p-48, //6.24685034485536557515e-15
2103 0x1.CB720DCEF9040p+0, //1.79470907500309806437
2104 0x1.48A81E5E8F4A5p-47, //9.12205626035419583226e-15
2105 0x1.D5818DCFBA480p+0, //1.83400808640934087634
2106 0x1.C976816BAD9B8p-50, //1.58714330671767538549e-15
2107 0x1.DFC97337B9B40p+0, //1.87416763411029307917
2108 0x1.EB968CAC39ED3p-48, //6.82215511854592947014e-15
2109 0x1.EA4AFA2A490C0p+0, //1.91520656139714162691
2110 0x1.9858F73A18F5Ep-48, //5.66696026748885461802e-15
2111 0x1.F50765B6E4540p+0, //1.95714412417540017941
2112 0x1.9D3E12DD8A18Bp-54 //8.9607677910366677676e-17
2113 };
2114
2115static const double one = 1.0;
2116static const double mOne = -1.0;
2117static const double two = 2.0;
2118static const xSInt64 bias[2] = { {2045, 0}, {1023, 0} };
2119static const xUInt64 POWER_NAN = { 0x7FF8000000000025ULL, 0 }; //should be the same as nan("37")
2120
2121
2122static inline xDouble ipow( xDouble x, uint32_t u ) ALWAYS_INLINE;
2123static inline xDouble _pow( xDouble X, xDouble Y ) ALWAYS_INLINE;
2124
2125static inline xDouble xscalb( xDouble x, int M )
2126{
2127 static const double scale[2] = { 0x1.0p1022, 0x1.0p-1022 };
2128 static const int step[2] = { 1022, -1022 };
2129 int index = M >> 31;
2130 int count = abs(M);
2131 xSInt64 xm = _mm_cvtsi32_si128( M + 1023 );
2132 xSInt64 xstep = _mm_cvtsi32_si128( step[-index] );
2133 xDouble xscale = _mm_load_sd( scale - index );
2134
2135 if( count > 1022 )
2136 {
2137 x = _mm_mul_sd( x, xscale );
2138 xm = _mm_sub_epi64( xm, xstep );
2139 count -= 1022;
2140
2141 if( count > 1022 )
2142 {
2143 x = _mm_mul_sd( x, xscale );
2144 xm = _mm_sub_epi64( xm, xstep );
2145 count -= 1022;
2146
2147 if( count > 1022 )
2148 return _mm_mul_sd( x, xscale );
2149 }
2150 }
2151
2152 xm = _mm_slli_epi64( xm, 52 );
2153 return _mm_mul_sd( x, (xDouble) xm );
2154}
2155
2156 //The original source from vMathLib used recursion (yuck!)
2157 //That was removed in favor of this more efficient loop
2158static inline xDouble ipow( xDouble x, uint32_t u )
2159{
2160 xDouble result;
2161 uint32_t mask = 1;
2162
2163 if( 0 == u )
2164 return _mm_load_sd( &one );
2165
2166 //skip trailing zeros
2167 while( u && 0 == (u & mask) )
2168 {
2169 //square x
2170 x = _mm_mul_sd( x,x );
2171
2172 //move up to the next mask
2173 mask += mask;
2174 }
2175
2176 //this prevents an underflow from occurring for pow( tiny, 1 )
2177 result = x;
2178
2179 //clear the bit in u (so we don't loop forever)
2180 u &= ~mask;
2181
2182 while( u )
2183 {
2184 //square x
2185 x = _mm_mul_sd( x,x );
2186
2187 //move up to the next mask
2188 mask += mask;
2189
2190 //if the current mask bit is set in u, multiply the result by x
2191 if( u & mask )
2192 {
2193 result = _mm_mul_sd( result, x );
2194
2195 //clear the bit in u (so we don't loop forever)
2196 u &= ~mask;
2197 }
2198 }
2199
2200 return result;
2201}
2202
2203static const xUInt64 iOne = { 1, 0 };
2204
2205
2206static inline xDouble _pow( xDouble X, xDouble Y )
2207{
2208 //get old fp env, and set the default one
2209 int oldMXCSR = _mm_getcsr();
2210 int newMXCSR = (oldMXCSR | DEFAULT_MXCSR) & DEFAULT_MASK; //set standard masks, enable denormals, set round to nearest
2211 if( newMXCSR != oldMXCSR )
2212 _mm_setcsr( newMXCSR );
2213
2214 static const double tenM20 = 1e-20;
2215 static const double ten20 = 1e20;
2216 static const double d16 = 16.0;
2217 static const double d128 = 128.0;
2218 static const double r128 = 1.0/128.0;
2219 static const double r8 = 1.0/8.0;
2220 static const double smallestNormal = 0x1.0p-1022;
2221
2222
2223 //if y == 0 or x == 1, then the answer is always 1, even if the other argument is NaN
2224 if( _mm_istrue_sd( _mm_or_pd( _mm_cmpeq_sdm( X, &one ), _mm_cmpeq_sdm( Y, (double*) &minusZeroD ) )) )
2225 {
2226 X = _mm_load_sd( &one );
2227 if( newMXCSR != oldMXCSR )
2228 _mm_setcsr( oldMXCSR );
2229 return X;
2230 }
2231
2232 //get NaN inputs out of the way
2233 if( _mm_istrue_sd( _mm_cmpunord_sd( X, Y ) ) )
2234 {
2235 if( newMXCSR != oldMXCSR )
2236 _mm_setcsr( oldMXCSR );
2237 return _mm_add_sd( X, Y );
2238 }
2239
2240 xDouble fabsY = _mm_andnot_pd( minusZeroD, Y );
2241 xDouble fabsX = _mm_andnot_pd( minusZeroD, X );
2242 xDouble fabsyIsInf = _mm_cmpeq_sdm( fabsY, &plusinf );
2243 xDouble signPatch = _mm_setzero_pd();
2244
2245 //detect if Y is integer, even or odd
2246 xDouble floorbias = _mm_load_sd( &T52 );
2247 floorbias = _mm_and_pd( floorbias, _mm_cmplt_sd( fabsY, floorbias ) );
2248 xDouble yShifted = _mm_add_sd( fabsY, floorbias);
2249 xDouble roundFabsY = _mm_sub_sd( yShifted, floorbias );
2250 xDouble yIsEven = (xDouble) _mm_sub_epi64( _mm_and_si128( (xUInt64) yShifted, iOne ), iOne );
2251 xDouble yIsInt = _mm_cmpeq_sd( roundFabsY, fabsY);
2252 int intY = _mm_cvtsd_si32( Y );
2253 _mm_setcsr( newMXCSR ); //Avoid setting the inexact flag
2254 yIsEven = _mm_or_pd( yIsEven, _mm_cmpge_sdm( fabsY, &T53 ) ); //|y| >= 2**53 is always even
2255 yIsInt = _mm_andnot_pd( fabsyIsInf, yIsInt );
2256
2257
2258 //Patch up the case of negative X with large integer Y. We have to do it here,
2259 //because recursion is not inlinable.
2260 xDouble fabsxLTInf = _mm_cmplt_sdm( fabsX, &plusinf );
2261 if( _mm_istrue_sd( _mm_and_pd( _mm_cmplt_sdm( X, (double*) &minusZeroD ), fabsxLTInf ))) //X < 0
2262 {
2263 if( _mm_istrue_sd( yIsInt ) )
2264 {
2265 X = fabsX; //X = fabs(X)
2266 signPatch = _mm_andnot_pd( yIsEven, minusZeroD ); //flip the sign before exiting if y is an odd int
2267
2268 //if x == -1, then the answer is always 1 or -1, unless NaN (removed above)
2269 if( _mm_istrue_sd( _mm_cmpeq_sdm( X, &one )) )
2270 {
2271 X = _mm_load_sd( &one );
2272 goto exit;
2273 }
2274 }
2275 else
2276 {
2277 if( _mm_istrue_sd( _mm_cmplt_sdm( fabsY, &plusinf ) ) )
2278 {
2279 X = (xDouble) POWER_NAN;
2280 oldMXCSR |= INVALID_FLAG;
2281 goto exit;
2282 }
2283 }
2284 }
2285
2286 xDouble xGTzero = _mm_cmpgt_sdm( X, (double*) &minusZeroD );
2287 xDouble yLTzero = _mm_cmplt_sdm( Y, (double*) &minusZeroD );
2288 xDouble xEQzero = _mm_cmpeq_sdm( X, (double*) &minusZeroD );
2289
2290 //More accurate, fast case for Y is a integer
2291 if( _mm_istrue_sd( _mm_andnot_pd( xEQzero, yIsInt)) && intY != 0x80000000 )
2292 {
2293 if( intY < 0 )
2294 {
2295 _mm_setcsr( DEFAULT_MXCSR );
2296 xDouble recip = _mm_div_sd( _mm_load_sd( &one ), X );
2297
2298 //if the reciprocal is exact, use ipow
2299 if( 0 == (_mm_getcsr() & INEXACT_FLAG ) )
2300 {
2301 X = ipow( recip, -intY );
2302 oldMXCSR |= _mm_getcsr() & ALL_FLAGS;
2303 _mm_setcsr( oldMXCSR );
2304 X = _mm_xor_pd( X, signPatch );
2305 return X;
2306 }
2307 _mm_setcsr( newMXCSR );
2308 }
2309 else
2310 {
2311 X = ipow( X, intY );
2312 oldMXCSR |= _mm_getcsr() & ALL_FLAGS;
2313 _mm_setcsr( oldMXCSR );
2314 X = _mm_xor_pd( X, signPatch );
2315 return X;
2316 }
2317 }
2318
2319 xDouble fabsyEQhalf = _mm_cmpeq_sdm( fabsY, &P1 );
2320
2321 //sqrt, reciprocal sqrt
2322 if( _mm_istrue_sd( _mm_and_pd( fabsyEQhalf, xGTzero ) ) )
2323 {
2324 _mm_setcsr( oldMXCSR );
2325 X = _MM_SQRT_SD( X );
2326 if( _mm_istrue_sd( yLTzero ) )
2327 X = _mm_div_sd( _mm_load_sd( &one ), X );
2328 return X;
2329 }
2330
2331
2332 xDouble xLTinf = _mm_cmplt_sdm( X, &plusinf );
2333 xDouble fabsyGT1em20 = _mm_cmpgt_sdm( fabsY, &tenM20 );
2334 xDouble fabsyLT1e20 = _mm_cmplt_sdm( fabsY, &ten20 );
2335
2336 if( _mm_istrue_sd( _mm_and_pd( _mm_and_pd( xGTzero, xLTinf ), //x > 0 && x < inf
2337 _mm_and_pd( fabsyGT1em20, fabsyLT1e20 ) ) ) ) //|y| > 1e-20 && |y| < 1e20
2338 {
2339 xDouble z1, z2, w1, w2;
2340 xDouble t1LTx = _mm_cmpgt_sdm( X, &T1 );
2341 xDouble xLTt2 = _mm_cmplt_sdm( X, &T2 );
2342 if( _mm_istrue_sd( _mm_and_pd( t1LTx, xLTt2 ) ) )
2343 {
2344 /* |X - 1| < 2^-6 */
2345 /* procedure Lsmall */
2346 xDouble xEQone = _mm_cmpeq_sdm( X, &one );
2347 if( _mm_istrue_sd( xEQone ) )
2348 {
2349 X = _mm_load_sd( &one );
2350 goto exit;
2351 }
2352 xDouble f = _mm_sub_sdm( X, &one );
2353 xDouble f1 = _mm_cvtss_sd( f, _mm_cvtsd_ss( (xFloat)f, f ));
2354 xDouble f2 = _mm_sub_sd( f, f1 );
2355 xDouble g = _mm_add_sdm( f, &two );
2356 g = _mm_div_sd( _mm_load_sd( &one ), g );
2357 xDouble u = _mm_mul_sd( f, g );
2358 u = _mm_add_sd( u, u );
2359 xDouble v = _mm_mul_sd( u, u );
2360 xDouble q = _mm_add_sdm( _mm_mul_sdm( v, &C5 ), &C4 );
2361 q = _mm_add_sdm( _mm_mul_sd( q, v ), &C3 );
2362 q = _mm_add_sdm( _mm_mul_sd( q, v ), &C2 );
2363 q = _mm_add_sdm( _mm_mul_sd( q, v ), &C1 );
2364 v = _mm_mul_sd( v, u );
2365 q = _mm_mul_sd( q, v );
2366
2367 xDouble u1 = _mm_cvtss_sd( u, _mm_cvtsd_ss( (xFloat)u, u ));
2368 xDouble u2 = _mm_sub_sd( f, u1 );
2369 u2 = _mm_add_sd( u2, u2 );
2370 u2 = _mm_sub_sd( u2, _mm_mul_sd( u1, f1 ) );
2371 u2 = _mm_sub_sd( u2, _mm_mul_sd( u1, f2 ) );
2372 u2 = _mm_mul_sd( u2, g );
2373 z2 = _mm_add_sd( q, u2 );
2374 z1 = _mm_add_sd( u1, z2 );
2375 z1 = _mm_cvtss_sd( z1, _mm_cvtsd_ss( (xFloat)z1, z1 ));
2376 z2 = _mm_add_sd( z2, _mm_sub_sd( u1, z1 ));
2377 }
2378 else
2379 {
2380 // x = mantissa(X, &m); // m = logb(X); x = scalb(X, -m);
2381 //convert denormals to normals
2382 xDouble xOne = _mm_load_sd( &one );
2383 xDouble isDenormal = _mm_cmplt_sdm( fabsX, &smallestNormal );
2384 xDouble denormBias = _mm_and_pd( xOne, isDenormal );
2385 int isdenorm = _mm_cvtsi128_si32( (xSInt64) isDenormal );
2386 X = _mm_or_pd( X, denormBias );
2387 X = _mm_sub_sd( X, denormBias );
2388
2389 //calculate mantissa and exponent
2390 xDouble inf = _mm_load_sd( &plusinf );
2391 xDouble exponent = _mm_and_pd( X, inf);
2392 xDouble x = _mm_andnot_pd( inf, X );
2393 xSInt64 xi = _mm_srli_epi64( (xUInt64) exponent, 52 );
2394 x = _mm_or_pd( x, xOne );
2395 xi = _mm_sub_epi32( xi, bias[1 + isdenorm] );
2396 exponent = _mm_cvtepi32_pd( (xSInt32) xi );
2397
2398 int j = _mm_cvttsd_si32( _mm_add_sdm( _mm_mul_sdm( x, &d128) , &P1 ));
2399 xDouble F = _mm_mul_sdm( _mm_cvtsi32_sd( X, j ), &r128 );
2400 xDouble g = _mm_div_sd( xOne, _mm_add_sd( F, x ) );
2401 xDouble f = _mm_sub_sd( x, F );
2402 xDouble a1 = _mm_add_sdm( _mm_mul_sdm( exponent, &logtable[128*2]), &logtable[(j-128)*2] );
2403 xDouble a2 = _mm_add_sdm( _mm_mul_sdm( exponent, &logtable[128*2]+1), &logtable[(j-128)*2+1] );
2404 xDouble u = _mm_mul_sd( f, g );
2405 u = _mm_add_sd( u, u );
2406 xDouble u1 = _mm_cvtss_sd( u, _mm_cvtsd_ss( (xFloat)u, u ) );
2407 xDouble v = _mm_mul_sd( u, u );
2408 xDouble c = _mm_mul_sd( Y, a1 );
2409 c = _mm_andnot_pd( minusZeroD, c );
2410 xDouble cLTsixteen = _mm_cmplt_sdm( c, &d16 );
2411 xDouble cLToneeighth = _mm_cmplt_sdm( c, &r8 );
2412 xDouble q, u2;
2413 if( _mm_istrue_sd( cLToneeighth ) )
2414 {
2415 //u2 = g * (2 * (f - u1 * F) - u1 * f);
2416 u2 = _mm_sub_sd( f, _mm_mul_sd( u1, F ) );
2417 u2 = _mm_add_sd( u2, u2 );
2418 u2 = _mm_sub_sd( u2, _mm_mul_sd( u1, f ) );
2419 u2 = _mm_mul_sd( u2, g );
2420
2421 //q = u * (v * (B1 + v * B2));
2422 q = _mm_add_sdm( _mm_mul_sdm( v, &B2 ), &B1 );
2423 q = _mm_mul_sd( q, v );
2424 q = _mm_mul_sd( q, u );
2425 }
2426 else
2427 {
2428 if( _mm_istrue_sd( cLTsixteen ) )
2429 {
2430 //u2 = g * (2 * (f - u1 * F) - u1 * f);
2431 u2 = _mm_sub_sd( f, _mm_mul_sd( u1, F ) );
2432 u2 = _mm_add_sd( u2, u2 );
2433 u2 = _mm_sub_sd( u2, _mm_mul_sd( u1, f ) );
2434 u2 = _mm_mul_sd( u2, g );
2435
2436 //q = u * (v * (A1 + v * (A2 + v * A3)));
2437 q = _mm_add_sdm( _mm_mul_sdm( v, &A3 ), &A2 );
2438 q = _mm_add_sdm( _mm_mul_sd( q, v ), &A1 );
2439 q = _mm_mul_sd( _mm_mul_sd( q, v ), u );
2440 }
2441 else
2442 {
2443 xDouble f1 = _mm_cvtss_sd( f, _mm_cvtsd_ss( (xFloat) f, f ));
2444 xDouble f2 = _mm_sub_sd( f, f1 );
2445
2446 //u2 = g * ((2 * (f - u1 * F) - u1 * f1) - u1 * f2);
2447 u2 = _mm_sub_sd( f, _mm_mul_sd( u1, F ) ); //f - u1*f
2448 u2 = _mm_add_sd( u2, u2 ); //2*(f - u1*f)
2449 u2 = _mm_sub_sd( u2, _mm_mul_sd( u1, f1 ) ); //2*(f - u1*f) - u1*f1
2450 u2 = _mm_sub_sd( u2, _mm_mul_sd( u1, f2 ) ); //(2*(f - u1*f) - u1*f1) - u1*f2
2451 u2 = _mm_mul_sd( u2, g ); //g * ((2*(f - u1*f) - u1*f1) - u1*f2)
2452
2453 //q = u * (v * (A1 + v * (A2 + v * A3)));
2454 q = _mm_add_sdm( _mm_mul_sdm( v, &A3 ), &A2 );
2455 q = _mm_add_sdm( _mm_mul_sd( q, v ), &A1 );
2456 q = _mm_mul_sd( _mm_mul_sd( q, v ), u );
2457 }
2458 }
2459
2460 xDouble p = _mm_add_sd( u2, q );
2461 xDouble t = _mm_add_sd( a1, u1 );
2462 a2 = _mm_add_sd( a2, _mm_add_sd( _mm_sub_sd( a1, t), u1 ) );
2463 z2 = _mm_add_sd( p, a2 );
2464 z1 = _mm_add_sd( t, z2 );
2465 z1 = _mm_cvtss_sd( z1, _mm_cvtsd_ss( (xFloat) z1, z1 ));
2466 z2 = _mm_add_sd( z2, _mm_sub_sd( t, z1) );
2467 }
2468
2469 /* Procedure M */
2470 {
2471 xDouble y1 = _mm_cvtss_sd( Y, _mm_cvtsd_ss( (xFloat) Y, Y ));
2472 xDouble y2 = _mm_sub_sd( Y, y1 );
2473 w2 = _mm_add_sd( _mm_mul_sd( y2, z1 ), _mm_mul_sd( y2, z2 ));
2474 w2 = _mm_add_sd( w2, _mm_mul_sd( y1, z2 ) );
2475 w1 = _mm_mul_sd( y1, z1 );
2476 }
2477
2478 //deal with overflow/underflow
2479 xDouble overflow = _mm_add_sd( w1, w2);
2480 xDouble underflow = _mm_cmplt_sdm( overflow, &Emin );
2481 overflow = _mm_cmpgt_sdm( overflow, &Emax );
2482 if( _mm_istrue_sd( _mm_or_pd( overflow, underflow ) ) )
2483 {
2484 int overflowFlag = _mm_cvtsi128_si32( (xUInt64) overflow ) & OVERFLOW_FLAG;
2485 int underflowFlag = _mm_cvtsi128_si32( (xUInt64) underflow ) & UNDERFLOW_FLAG;
2486 oldMXCSR |= overflowFlag | underflowFlag | INEXACT_FLAG;
2487 X = _mm_and_pd( _mm_load_sd( &plusinf ), overflow );
2488 goto exit;
2489 }
2490
2491 /* Procedure E */
2492 {
2493 int N = _mm_cvtsd_si32( _mm_mul_sdm( w1, &Inv_L) );
2494 int j = N & 31;
2495 int M = N >> 5;
2496 xDouble dN = _mm_cvtsi32_sd( w1, N );
2497 xDouble r = _mm_sub_sd( w1, _mm_mul_sdm( dN, &L1 ) );
2498 r = _mm_add_sd( r, w2 );
2499 r = _mm_sub_sd( r, _mm_mul_sdm( dN, &L2 ) );
2500 //double p = r + r * (r * (P1 + r * (P2 + r * (P3 + r * (P4 + r * P5)))));
2501 xDouble p = _mm_add_sdm( _mm_mul_sdm( r, &P5 ), &P4 );
2502 p = _mm_add_sdm( _mm_mul_sd( p, r ), &P3 );
2503 p = _mm_add_sdm( _mm_mul_sd( p, r ), &P2 );
2504 p = _mm_add_sdm( _mm_mul_sd( p, r ), &P1 );
2505 p = _mm_add_sd( _mm_mul_sd( _mm_mul_sd( p, r ), r), r );
2506 //double S = exptable[j].lead + exptable[j].trail;
2507 xDouble S = _mm_add_sdm( _mm_load_sd( &exptable[ 2 * j ] ), &exptable[ 2 * j +1] );
2508 xDouble t = _mm_add_sdm( _mm_mul_sd( S, p ), &exptable[ 2 * j +1] );
2509 t = _mm_add_sdm( t, &exptable[ 2 * j ] );
2510 X = xscalb(t, M);
2511
2512 oldMXCSR |= _mm_getcsr() & ALL_FLAGS;
2513 goto exit;
2514 }
2515 }
2516
2517 //Handle special cases
2518
2519
2520 xDouble yIsOddInt = _mm_andnot_pd( yIsEven, yIsInt );
2521 xDouble resultSign = _mm_and_pd( X, minusZeroD );
2522
2523 //take care of the x == 0 cases
2524 if( _mm_istrue_sd( xEQzero ) )
2525 {
2526 //The x==1,NaN and y == 0, NaN cases have been weeded out above
2527 int div_zero_flag = _mm_cvtsi128_si32( (xSInt64) yLTzero ) & DIVIDE_0_FLAG;
2528
2529 //result is Inf if y <0, otherwise result is 0
2530 X = _mm_and_pd( _mm_load_sd( &plusinf), yLTzero );
2531
2532 //only apply the sign only if y is a odd integer
2533 resultSign = _mm_and_pd( yIsOddInt, resultSign );
2534 X = _mm_or_pd( X, resultSign );
2535
2536 oldMXCSR |= div_zero_flag;
2537 goto exit;
2538 }
2539
2540 //take care of the |x| == inf cases
2541 if( _mm_istrue_sd( _mm_cmpeq_sdm( fabsX, &plusinf ) ) )
2542 {
2543 //result is Inf if y > 0, otherwise result is 0
2544 X = _mm_andnot_pd( yLTzero, _mm_load_sd( &plusinf) );
2545
2546 //only apply the sign only if y is a odd integer
2547 resultSign = _mm_and_pd( yIsOddInt, resultSign );
2548 X = _mm_or_pd( X, resultSign );
2549
2550 goto exit;
2551 }
2552
2553 //take care of the |y| == inf cases
2554 if( _mm_istrue_sd( fabsyIsInf ) )
2555 {
2556 xDouble fabsxGTone = _mm_cmpgt_sdm( fabsX, &one );
2557 xDouble isInf = _mm_xor_pd( yLTzero, fabsxGTone );
2558 xDouble isOne = _mm_cmpeq_sdm( X, &mOne ); // x == -1, |y| == inf returns 1
2559 X = _mm_and_pd( isInf, _mm_load_sd( &plusinf ) );
2560 X = _mm_sel_pd( X, _mm_load_sd( &one ), isOne );
2561 X = _mm_xor_pd( X, signPatch );
2562
2563 goto exit;
2564 }
2565
2566
2567 //We have already handled the following cases:
2568 // y = +Inf, -Inf, +0, -0, NaN,
2569 // x = +Inf, -Inf, +0, -0, NaN,
2570 //
2571 // x is any and y is a small integer
2572 // x is negative and y is a large integer, |y| < 1e20
2573 // x positive finite and |y| > 1e-20 && |y| < 1e20
2574 // x is negative and y is not an integer
2575 //
2576 // We have left:
2577 // x is positive finite and |Y| is <= 1e-20
2578 // x is positive finite and |Y| is >= 1e20
2579 // 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)
2580 // x is negative finite and |Y| is <= 1e-20 and an integer (which never happens)
2581 //
2582 // we can be sure that X and Y are not inf, -inf, NaN, 0, -0 at this point,
2583 // since those cases are handled, therefore both X and Y are finite
2584 //
2585 // The cases:
2586 // y > 1e20 y < 1e-20 y< -1e20
2587 // x > 1 inf oi 1.0 i 0.0 ui
2588 // x < 1 0.0 ui 1.0 i inf oi
2589
2590 xDouble fabsxLTone = _mm_cmplt_sdm( fabsX, &one );
2591 xDouble underflow = _mm_xor_pd( fabsxLTone, yLTzero );
2592 xDouble overflow = _mm_andnot_pd( underflow, xLTinf ); //overflow = ~underflow
2593 xDouble fabsyLTone = _mm_cmplt_sdm( fabsY, &one );
2594 xDouble fabsxEQone = _mm_cmpeq_sdm( fabsX, &one );
2595 underflow = _mm_andnot_pd( fabsyLTone, underflow );
2596 overflow = _mm_andnot_pd( fabsyLTone, overflow );
2597 int overflowMask = _mm_cvtsi128_si32( (xUInt32) overflow ) & OVERFLOW_FLAG;
2598 int underflowMask = _mm_cvtsi128_si32( (xUInt32) underflow ) & UNDERFLOW_FLAG;
2599 int inexactMask = (~ _mm_cvtsi128_si32( (xUInt32) fabsxEQone )) & INEXACT_FLAG;
2600 X = _mm_and_pd( overflow, _mm_load_sd( &plusinf ) );
2601 X = _mm_sel_pd( X, _mm_load_sd( &one), fabsyLTone );
2602 oldMXCSR |= overflowMask | underflowMask | inexactMask;
2603 _mm_setcsr( oldMXCSR );
2604 return X;
2605
2606exit:
2607 _mm_setcsr( oldMXCSR );
2608 return _mm_xor_pd( X, signPatch );
2609}
2610
2611double pow( double x, double y )
2612{
2613 xDouble xd = DOUBLE_2_XDOUBLE( x );
2614 xDouble yd = DOUBLE_2_XDOUBLE( y );
2615 xd = _pow( xd, yd );
2616 return XDOUBLE_2_DOUBLE( xd );
2617}
2618
2619/* **************** OLD STUFF **************** */
2620#endif
2621