#include <math.h>
#include <float.h>
#include "fenv.h"
#include <stdint.h>
#ifndef DEBUG
#define DEBUG 0
#endif
#if DEBUG
#include <stdio.h>
#endif
#ifndef ALWAYS_INLINE
#if DEBUG
#define ALWAYS_INLINE
#else
#define ALWAYS_INLINE __attribute__ ((always_inline))
#endif
#endif
#include "xmmLibm_Prefix.h"
#define AVOID_64_BIT_INTS defined(__i386__)
typedef struct logdata_t {double hi; double lo; double inv; double lg1phi; double lg1plo; } logdata_t;
static const int A_ORIGIN = 64;
static const logdata_t A_LOOKUP[] = { {-0x1.fffffe7fffffap-3, 0x1.8000006p-79, 0x1.555555p+0, -0x1.a8ff95a6bc2f6p-2, -0x1.3d82406f24c25p-59}, {-0x1.f8000200a7ff5p-3, -0x1.720e0e2121555p-57, 0x1.539095p+0, -0x1.a152f32d1c481p-2, -0x1.e8bc9082edfep-58}, {-0x1.f0000177dfffap-3, -0x1.3df00582ffdebp-57, 0x1.51d07fp+0, -0x1.99b0740f363dap-2, 0x1.0f9d162e39146p-56}, {-0x1.e7fffe8c47ffap-3, -0x1.db49fab940a0cp-57, 0x1.501501p+0, -0x1.9217ff324952cp-2, -0x1.cbbeaaa56a6a7p-56}, {-0x1.dffffde4ffff4p-3, -0x1.adfff013cffa8p-57, 0x1.4e5e0ap+0, -0x1.8a897eb027b02p-2, 0x1.4f8714574779dp-57}, {-0x1.d7fffde23fff4p-3, -0x1.717fefff03fa8p-57, 0x1.4cab88p+0, -0x1.8304d7103dda3p-2, 0x1.98833591862b5p-56}, {-0x1.cfffffe74p-3, 0x1.8c0000063p-61, 0x1.4afd6ap+0, -0x1.7b89f015dd637p-2, 0x1.1d4ce385cfbe7p-57}, {-0x1.c7fffee1efffdp-3, 0x1.b370049e3e20dp-58, 0x1.49539ep+0, -0x1.7418abe24a63dp-2, 0x1.fa37ab3d61feep-56}, {-0x1.bffffda7ffff2p-3, 0x1.00005460001fap-59, 0x1.47ae14p+0, -0x1.6cb0f45c5ddccp-2, 0x1.de975927718f4p-57}, {-0x1.b7fffd8bdfff1p-3, 0x1.572017f608896p-57, 0x1.460cbcp+0, -0x1.6552b258722e2p-2, -0x1.2f241dca6fc3fp-56}, {-0x1.affffe52bfff9p-3, 0x1.02800f24aa04p-58, 0x1.446f86p+0, -0x1.5dfdcd968123p-2, 0x1.efb9d089cf90ap-56}, {-0x1.a7fffe2a8fff8p-3, 0x1.ec9809ce63f2dp-57, 0x1.42d662p+0, -0x1.56b22cc04de54p-2, 0x1.c9bb0d879afd7p-57}, {-0x1.9ffffeb47fffcp-3, 0x1.ab0006d6bc016p-58, 0x1.414141p+0, -0x1.4f6fba00d7b94p-2, -0x1.77a3d5b250693p-56}, {-0x1.98000019ap-3, 0x1.99fffff998p-61, 0x1.3fb014p+0, -0x1.48365e8072c0dp-2, 0x1.803dc35aa1904p-60}, {-0x1.900001017fffdp-3, -0x1.f100019257ffcp-57, 0x1.3e22ccp+0, -0x1.4106026313941p-2, 0x1.5bb94c1280f7bp-56}, {-0x1.87fffe88cfffbp-3, 0x1.403804d08cb11p-57, 0x1.3c995ap+0, -0x1.39de8cc6a56b9p-2, -0x1.c4556357fb55cp-56}, {-0x1.7ffffec7ffffcp-3, -0x1.5ffffd41ffff8p-57, 0x1.3b13b1p+0, -0x1.32bfed220f8dbp-2, 0x1.a7efa69babda9p-58}, {-0x1.7800014d17ffcp-3, 0x1.2de3f963db955p-58, 0x1.3991c3p+0, -0x1.2baa0d5b0d6cfp-2, 0x1.19d4b3cacb7eep-56}, {-0x1.6ffffed21fffdp-3, 0x1.8f90026fcbe07p-57, 0x1.381381p+0, -0x1.249cd1a7c821ap-2, -0x1.82633f48991dp-58}, {-0x1.67fffeafb7ffcp-3, 0x1.7f2c06ac55c55p-58, 0x1.3698dfp+0, -0x1.1d982b7703222p-2, 0x1.ef3e37d2edb56p-57}, {-0x1.600001a7ffff9p-3, -0x1.8000069ffffe6p-57, 0x1.3521dp+0, -0x1.169c06a7938bbp-2, 0x1.13c37a49fc23fp-56}, {-0x1.5800019cafffap-3, 0x1.f94ff3e59ea2fp-58, 0x1.33ae46p+0, -0x1.0fa8496a15078p-2, -0x1.557b896ea3a78p-56}, {-0x1.500002099fff6p-3, -0x1.1140306cbe714p-59, 0x1.323e35p+0, -0x1.08bce29b7e937p-2, 0x1.ff263e711169p-59}, {-0x1.47ffff948p-3, 0x1.ae00001aep-57, 0x1.30d19p+0, -0x1.01d9bb7350ffbp-2, 0x1.b68e9421e42b1p-58}, {-0x1.400000d7ffffep-3, -0x1.400000d7ffffep-57, 0x1.2f684cp+0, -0x1.f5fd8c01b8598p-3, -0x1.2af9dd21de84ap-57}, {-0x1.37ffffe4ep-3, 0x1.b2000006c8p-61, 0x1.2e025cp+0, -0x1.e857d3a536a7bp-3, -0x1.2ae5ac22439c5p-59}, {-0x1.300000e79fffep-3, -0x1.3cc00415ee7f7p-59, 0x1.2c9fb5p+0, -0x1.dac22ec6addadp-3, 0x1.237db4a7636b7p-58}, {-0x1.2800011897ffdp-3, -0x1.87d403993f0b7p-58, 0x1.2b404bp+0, -0x1.cd3c73066548p-3, -0x1.cf4b11e658fe5p-57}, {-0x1.200002417fff4p-3, -0x1.41001f16abf5dp-58, 0x1.29e413p+0, -0x1.bfc67e497d02cp-3, 0x1.5f07d9233af02p-57}, {-0x1.17ffff0e47ffep-3, 0x1.0c280484a978ap-59, 0x1.288b01p+0, -0x1.b2602303e0d2dp-3, -0x1.5b9ec49135187p-58}, {-0x1.100002d17ffeep-3, 0x1.46ffe23b280c1p-57, 0x1.27350cp+0, -0x1.a509500525022p-3, 0x1.7a9c418d8486p-58}, {-0x1.07ffffcf38p-3, 0x1.557800095648p-59, 0x1.25e227p+0, -0x1.97c1cac2fd722p-3, -0x1.49e502588505cp-57}, {-0x1.fffffe3fffffcp-4, -0x1.fffffe3fffffcp-58, 0x1.249249p+0, -0x1.8a897f3aa75ccp-3, 0x1.b366c85648a5ap-58}, {-0x1.f00005b67ffdbp-4, 0x1.11ff8750b031p-59, 0x1.234568p+0, -0x1.7d604e1d4e346p-3, 0x1.0ce3d95e5651ep-60}, {-0x1.dfffff1dfffffp-4, -0x1.dfffff1dfffffp-60, 0x1.21fb78p+0, -0x1.70460263cfbd2p-3, 0x1.9fe6887659803p-58}, {-0x1.d00002d38fff7p-4, 0x1.2d7f1a43efadcp-63, 0x1.20b471p+0, -0x1.633a8e40d66a7p-3, 0x1.8870b46556c8ap-57}, {-0x1.c00001c7ffffcp-4, -0x1.c00001c7ffffcp-58, 0x1.1f7048p+0, -0x1.563dc4114f416p-3, 0x1.ca52b9f12ee9fp-58}, {-0x1.b00003cd3fffp-4, 0x1.427fddaa56092p-59, 0x1.1e2ef4p+0, -0x1.494f894c616e5p-3, -0x1.9ae20a276fef6p-58}, {-0x1.a00001e8bfffcp-4, 0x1.d2ffeec1fa025p-61, 0x1.1cf06bp+0, -0x1.3c6fb7d937a2ap-3, -0x1.fabc7d482f61bp-57}, {-0x1.8fffffc64p-4, 0x1.ce00000738p-61, 0x1.1bb4a4p+0, -0x1.2f9e32a7954e4p-3, 0x1.11897da40f648p-59}, {-0x1.7fffff17fffffp-4, -0x1.7fffff17fffffp-60, 0x1.1a7b96p+0, -0x1.22dadb72090e4p-3, 0x1.f4461b11bb8dp-59}, {-0x1.6fffff8b8p-4, 0x1.d200000e9p-59, 0x1.194538p+0, -0x1.162592bc18896p-3, -0x1.889ff670a2c9ap-57}, {-0x1.5ffffebe3fffep-4, -0x1.165fff67ec3ffp-58, 0x1.181181p+0, -0x1.097e37d076533p-3, 0x1.0d672c7895724p-59}, {-0x1.500005ae0ffddp-4, 0x1.281793457ee21p-59, 0x1.16e069p+0, -0x1.f9c966af0bb0bp-4, -0x1.21ffac8a485cp-58}, {-0x1.40000076p-4, 0x1.d7fffff14p-59, 0x1.15b1e6p+0, -0x1.e0b1af47da109p-4, 0x1.9dab517f95157p-59}, {-0x1.300001ad8fffdp-4, 0x1.529ff4f9a3e14p-61, 0x1.1485f1p+0, -0x1.c7b52b547832ap-4, 0x1.6baa19b9f9395p-62}, {-0x1.1ffffef43ffffp-4, 0x1.69c000a96f801p-59, 0x1.135c81p+0, -0x1.aed3900be76fcp-4, 0x1.aa87b52ee52c3p-58}, {-0x1.0ffff994dffd4p-4, 0x1.03e097afaa813p-59, 0x1.12358ep+0, -0x1.960ca5af96cdp-4, -0x1.29c6aa0b462f4p-58}, {-0x1.fffffe1fffffep-5, -0x1.fffffe1fffffep-61, 0x1.111111p+0, -0x1.7d6047fba73e7p-4, 0x1.f3c7d0da33a2dp-58}, {-0x1.dffffe3c1fffep-5, -0x1.6177ff9cb608p-59, 0x1.0fef01p+0, -0x1.64ce256627e67p-4, -0x1.c92eb2b54a333p-59}, {-0x1.c00007537ffe4p-5, 0x1.8e3fe47f8c86bp-59, 0x1.0ecf57p+0, -0x1.4c56157db2425p-4, -0x1.072624d45947ep-58}, {-0x1.a0000d685ffa1p-5, -0x1.3b68a730c6ce3p-59, 0x1.0db20bp+0, -0x1.33f7d811b177p-4, -0x1.a92813604147cp-58}, {-0x1.8000007ap-5, 0x1.e7fffff86p-61, 0x1.0c9715p+0, -0x1.1bb32abc5a676p-4, -0x1.307117f313841p-58}, {-0x1.6000070edffe6p-5, 0x1.b67e801af0d88p-63, 0x1.0b7e6fp+0, -0x1.0387f50e8fdd9p-4, 0x1.e09f5e05261b8p-60}, {-0x1.40000a547ffc8p-5, -0x1.e7404a9c5066fp-59, 0x1.0a6811p+0, -0x1.d6ebe1744ab54p-5, 0x1.6169c1a187949p-61}, {-0x1.20000d067ffa8p-5, -0x1.420251782705ap-61, 0x1.0953f4p+0, -0x1.a6f9d6f1d16afp-5, 0x1.4703c3ec0059cp-59}, {-0x1.00000e87fff93p-5, -0x1.000cc587fa037p-63, 0x1.084211p+0, -0x1.7739624188772p-5, 0x1.e1e1fb7ea4b7p-60}, {-0x1.c00015a43ff88p-6, 0x1.868f5898382a3p-60, 0x1.073261p+0, -0x1.47aa174242a68p-5, -0x1.78a5b28f384fep-62}, {-0x1.7ffff4c4fffep-6, 0x1.26801734eb043p-60, 0x1.0624ddp+0, -0x1.184b8600b1067p-5, 0x1.f72dde81305e6p-59}, {-0x1.3fffe1d9bff18p-6, -0x1.cf9c851ec033fp-61, 0x1.05197fp+0, -0x1.d23acfec2e5e7p-6, -0x1.cc0694e8223dfp-62}, {-0x1.fffffe08p-7, 0x1.f8000007ep-61, 0x1.041041p+0, -0x1.743ee6f09edf1p-6, 0x1.1ac84c0953b8cp-61}, {-0x1.7fffd7f97ff35p-7, -0x1.7c5eff8c5a0eep-61, 0x1.03091bp+0, -0x1.16a200e9b243ap-6, -0x1.9e84c88c2a9fep-60}, {-0x1.fffff01fffffp-8, -0x1.fffff01fffffp-64, 0x1.020408p+0, -0x1.72c7ae96537f8p-7, -0x1.cf9a702ff830ep-62}, {-0x1.fffffe02p-9, 0x1.fe000001fep-65, 0x1.010101p+0, -0x1.720d9a9553bf9p-8, -0x1.bf85dcbd8a866p-62}, {0x0p+0, 0x0p+0, 0x1p+0, 0x0p+0, 0x0p+0}, {0x1.00000101p-8, 0x1.0100000101p-64, 0x1.fe01fep-1, 0x1.709c4848ff3ddp-8, -0x1.f86284455f0dfp-62}, {0x1.0000081000008p-7, 0x1.0000081000008p-63, 0x1.fc07fp-1, 0x1.6fe516f994381p-7, -0x1.7c1ff82f44adcp-61}, {0x1.7fffe7774004ap-7, 0x1.7a17c7a45e7ebp-61, 0x1.fa11cbp-1, 0x1.1362fffc7797cp-6, 0x1.f4876a1ea9f9bp-62}, {0x1.fffffdf800001p-7, -0x1.f80000082p-61, 0x1.f81f82p-1, 0x1.6e7966ead8ac5p-6, -0x1.cba91dae29988p-60}, {0x1.3ffff8fda000cp-6, 0x1.829fd69677d47p-63, 0x1.f6310bp-1, 0x1.c93631bd2c4b7p-6, 0x1.8575ca34d0306p-60}, {0x1.7ffffc6b00003p-6, 0x1.12fffea0f6001p-61, 0x1.f4465ap-1, 0x1.11cd1acadf723p-5, -0x1.efa68b88a0ae7p-64}, {0x1.c00008bb80013p-6, -0x1.c63ff624547ebp-60, 0x1.f25f64p-1, 0x1.3ed30f682c99bp-5, -0x1.8caa572b44451p-59}, {0x1.00000084p-5, 0x1.080000042p-60, 0x1.f07c1fp-1, 0x1.6bad38119a13ap-5, -0x1.0f9994f222757p-60}, {0x1.1ffff7b800021p-5, 0x1.ffff7b8000212p-61, 0x1.ee9c8p-1, 0x1.985bf0a9f1682p-5, 0x1.9d0544bf2b55bp-61}, {0x1.4000033f40005p-5, 0x1.2d4007ed6b40cp-61, 0x1.ecc07bp-1, 0x1.c4dfb012d2a7fp-5, -0x1.7579e1c86e5eap-59}, {0x1.5ffffa438001p-5, -0x1.cd0015b0c3fc4p-60, 0x1.eae808p-1, 0x1.f1389043d4afep-5, 0x1.b8b4ecc2bd1ecp-61}, {0x1.7ffffb8d00009p-5, 0x1.d17ffafa2d00bp-59, 0x1.e9131bp-1, 0x1.0eb386e9567e7p-4, -0x1.b18d168d9858dp-62}, {0x1.a000062c60012p-5, 0x1.12d01aa27434ep-60, 0x1.e741aap-1, 0x1.24b5bc1e1dbfcp-4, -0x1.a2efa461c33cfp-61}, {0x1.bffff838c001dp-5, -0x1.45101a711549ep-59, 0x1.e573adp-1, 0x1.3aa2f88097a88p-4, -0x1.a5adebc35ec9cp-58}, {0x1.dffff91e80016p-5, 0x1.737fedd48a03bp-59, 0x1.e3a918p-1, 0x1.507b7eafe13b6p-4, -0x1.67c359d084bc1p-58}, {0x1.fffffde000002p-5, 0x1.fffffde000002p-61, 0x1.e1e1e2p-1, 0x1.663f6e3b3cbb2p-4, 0x1.3e721192791a3p-61}, {0x1.0ffffeddf0001p-4, 0x1.a187ff5c45f81p-59, 0x1.e01e02p-1, 0x1.7beee7e3206a7p-4, -0x1.c6054c190ee99p-58}, {0x1.2000024640005p-4, -0x1.55bffadd637f5p-59, 0x1.de5d6ep-1, 0x1.918a19f536b15p-4, -0x1.336be543a9993p-60}, {0x1.2ffffe0d90004p-4, -0x1.e25401995c7bdp-58, 0x1.dca01ep-1, 0x1.a7111b55df32fp-4, -0x1.4f1d83f3e7e8cp-60}, {0x1.400003e88000ep-4, 0x1.568019ad9905dp-59, 0x1.dae607p-1, 0x1.bc842945ace93p-4, -0x1.8fd5b9a815711p-58}, {0x1.500001d370003p-4, 0x1.4cd0053319f09p-60, 0x1.d92f22p-1, 0x1.d1e350a4f6b57p-4, 0x1.45508587ec271p-60}, {0x1.600002c860007p-4, 0x1.0bb00922df317p-59, 0x1.d77b65p-1, 0x1.e72ec4ca62caap-4, 0x1.8d32ff20ce97bp-60}, {0x1.70000045cp-4, 0x1.170000045cp-60, 0x1.d5cac8p-1, 0x1.fc66a14d0527ep-4, -0x1.9476863d87a59p-60}, {0x1.7ffffe5c00002p-4, 0x1.d7ffff13c0001p-58, 0x1.d41d42p-1, 0x1.08c587b8a8459p-3, -0x1.eaebfe80f652ap-57}, {0x1.90000266b0005p-4, 0x1.028402df580c6p-58, 0x1.d272cap-1, 0x1.134e1cdc84c46p-3, 0x1.8280d2b9d2e4ep-57}, {0x1.9fffffa7ep-4, 0x1.b89ffff764ep-60, 0x1.d0cb59p-1, 0x1.1dcd193b9d854p-3, -0x1.9c8f4e7f2e39fp-57}, {0x1.affffdb850005p-4, -0x1.3094026cbcebbp-58, 0x1.cf26e6p-1, 0x1.284293339b4a1p-3, -0x1.f513c53ec0906p-58}, {0x1.bffffbb380011p-4, -0x1.5e4010232c7c1p-58, 0x1.cd8569p-1, 0x1.32ae9b5bf73ccp-3, -0x1.ea3729015b5c1p-57}, {0x1.d00003b8f800cp-4, 0x1.c9f50a67b4b5bp-58, 0x1.cbe6d9p-1, 0x1.3d11494321dc5p-3, 0x1.d20de6a527ce2p-59}, {0x1.e000035a0000ap-4, 0x1.c0003c54000b5p-61, 0x1.ca4b3p-1, 0x1.476aa1c23e268p-3, 0x1.8bdb8834b12ffp-58}, {0x1.effffcd8d0009p-4, -0x1.0e480c787d55dp-59, 0x1.c8b266p-1, 0x1.51bab70047027p-3, -0x1.1117308935bc2p-58}, {0x1.fffffdc000004p-4, 0x1.fffffdc000004p-58, 0x1.c71c72p-1, 0x1.5c01a22e68f24p-3, -0x1.a8e7cd17ca46cp-59}, {0x1.08000055ccp-3, 0x1.9789000f1f958p-58, 0x1.c5894dp-1, 0x1.663f701a36449p-3, -0x1.66ef1d80ba98cp-57}, {0x1.1000009100001p-3, -0x1.bbffffdbcp-57, 0x1.c3f8fp-1, 0x1.70742e079a632p-3, 0x1.bd6b99f1a542fp-59}, {0x1.17fffdcc30009p-3, -0x1.dce808447fcep-57, 0x1.c26b54p-1, 0x1.7a9fe9b17239p-3, 0x1.5e7a42808635dp-57}, {0x1.2000012400002p-3, 0x1.2000012400002p-57, 0x1.c0e07p-1, 0x1.84c2be7444b1ap-3, -0x1.95599ba086466p-57}, {0x1.27ffff8464p-3, 0x1.a12e7fea000c4p-57, 0x1.bf583fp-1, 0x1.8edcade78314dp-3, 0x1.24b65cd1dd74dp-57}, {0x1.2ffffde1f0008p-3, -0x1.89280e6563c4bp-58, 0x1.bdd2b9p-1, 0x1.98edcdcef3541p-3, 0x1.890aa22cbe631p-57}, {0x1.380001d628006p-3, -0x1.2b03f6ab91ca2p-58, 0x1.bc4fd6p-1, 0x1.a2f6347eaa238p-3, -0x1.3947af6cfd995p-57}, {0x1.4000019700004p-3, 0x1.7d0003017c008p-57, 0x1.bacf91p-1, 0x1.acf5e4d722ec2p-3, -0x1.d0389e7ca40dcp-58}, {0x1.47fffe59b4005p-3, -0x1.3c5f8355c5063p-57, 0x1.b951e3p-1, 0x1.b6ecef68d5468p-3, 0x1.f2fa768fd19b9p-57}, {0x1.4fffff45c0001p-3, -0x1.7300012303fffp-59, 0x1.b7d6c4p-1, 0x1.c0db6bf6c015p-3, -0x1.a829cc1512df9p-57}, {0x1.5800014708003p-3, -0x1.a4f3fcf18d5b9p-58, 0x1.b65e2ep-1, 0x1.cac1655b653e1p-3, -0x1.f429423a6ef0ap-61}, {0x1.600001af40005p-3, -0x1.413ff909b97ecp-58, 0x1.b4e81bp-1, 0x1.d49ee6d60f014p-3, 0x1.95845c18cb6e6p-58}, {0x1.67fffe37cc005p-3, 0x1.9b767be80c0d8p-57, 0x1.b37485p-1, 0x1.de73fc0b507ddp-3, -0x1.1e79902c3d7fap-58}, {0x1.70000025cp-3, 0x1.2e000004b8p-60, 0x1.b20364p-1, 0x1.e840bea311339p-3, 0x1.cbfe95c59cb8ap-57}, {0x1.780000a5b4001p-3, -0x1.2b0c7fce715acp-57, 0x1.b094b3p-1, 0x1.f205345c03233p-3, 0x1.36b400859e299p-60}, {0x1.7ffffed000002p-3, 0x1.7ffffed000002p-57, 0x1.af286cp-1, 0x1.fbc16a1ed20a6p-3, 0x1.a5e946d48367ep-57}, {0x1.87ffffd9ep-3, 0x1.30fffffb3cp-60, 0x1.adbe88p-1, 0x1.02baba0dbb1edp-2, 0x1.ad0869df3855cp-56}, {0x1.8ffffe21e0006p-3, -0x1.4ee0091e983e4p-58, 0x1.ac5702p-1, 0x1.0790ac9a79044p-2, 0x1.3ee2f0e46be64p-57}, {0x1.97ffffd4d4p-3, 0x1.848bfff92b8ap-60, 0x1.aaf1d3p-1, 0x1.0c62973b4ab8ap-2, -0x1.d1b4e1b85f444p-56}, {0x1.a00000268p-3, 0x1.34000004dp-60, 0x1.a98ef6p-1, 0x1.11307dc445fecp-2, 0x1.05224944efccp-57}, {0x1.a800006f0cp-3, 0x1.3f42800e577ccp-57, 0x1.a82e65p-1, 0x1.15fa67ae0dbd4p-2, -0x1.835b07373839fp-56}, {0x1.b000027f6000ap-3, 0x1.35b00a9fd762cp-57, 0x1.a6d01ap-1, 0x1.1ac05ca5fe214p-2, -0x1.1c2140fbe02dbp-56}, {0x1.b80002bbc000cp-3, 0x1.33800dd67c03ep-57, 0x1.a5741p-1, 0x1.1f82610d07e69p-2, -0x1.7119b483d65e3p-56}, {0x1.bffffdde00007p-3, 0x1.dbfff977e0017p-57, 0x1.a41a42p-1, 0x1.2440796db68c3p-2, 0x1.8de37e9a6110bp-57}, {0x1.c80002e76000ep-3, -0x1.a7bfdf3dccf64p-58, 0x1.a2c2a8p-1, 0x1.28fab511c6b5p-2, -0x1.9ec26959b16eep-56}, {0x1.cffffd8c0000ap-3, -0x1.8000139ffffb2p-58, 0x1.a16d4p-1, 0x1.2db10e538534dp-2, 0x1.31cb428346b53p-57}, {0x1.d7fffdbb38008p-3, 0x1.7685f849af1fcp-57, 0x1.a01a02p-1, 0x1.326394e238a67p-2, -0x1.abc179fe7b4a3p-57}, {0x1.e00001edc0006p-3, 0x1.be004b571c0ebp-61, 0x1.9ec8e9p-1, 0x1.37124e0ad6db6p-2, -0x1.66636d9999ce2p-56}, {0x1.e80002d81c00dp-3, 0x1.0c0a3c04f4f04p-59, 0x1.9d79f1p-1, 0x1.3bbd3bb244cfdp-2, -0x1.b12bb7a1584cdp-56}, {0x1.efffff92bp-3, 0x1.2c9bfff3154cp-57, 0x1.9c2d15p-1, 0x1.4064637235c04p-2, 0x1.405468a8fd423p-57}, {0x1.f7fffdccc4008p-3, -0x1.d8a10db7b0748p-58, 0x1.9ae24fp-1, 0x1.4507cea7c86bfp-2, -0x1.ef9753db3d35cp-56}, {0x1.fffffd800000ap-3, -0x1.3fffffbp-78, 0x1.99999ap-1, 0x1.49a7834b7d429p-2, -0x1.2a4397d8912bap-56}, {0x1.03ffff851e001p-2, -0x1.0f57c048081a2p-56, 0x1.9852f1p-1, 0x1.4e4387812d616p-2, -0x1.4aada8ecbe851p-56}, {0x1.07fffe6d80008p-2, -0x1.1c0013a73ff9ep-57, 0x1.970e5p-1, 0x1.52dbddf71fd7ap-2, -0x1.d9b1af94a58afp-56}, {0x1.0bffff2e8e002p-2, 0x1.f3fafa7ef2d06p-58, 0x1.95cbb1p-1, 0x1.577090c3bac8p-2, 0x1.35997fa38deabp-56}, {0x1.0fffff5e00001p-2, 0x1.0fffff5e00001p-56, 0x1.948b1p-1, 0x1.5c01a2e7132d6p-2, -0x1.ebb9c6fdca778p-57}, {0x1.13ffffebbp-2, 0x1.44fffffaecp-60, 0x1.934c68p-1, 0x1.608f1b2b7f437p-2, 0x1.1c6a1e011a9d3p-56}, {0x1.17fffebf18005p-2, -0x1.06e8136f4ce33p-58, 0x1.920fb5p-1, 0x1.6518fcdae8962p-2, 0x1.a0f56285014a5p-58}, {0x1.1c000068be001p-2, -0x1.e7323fd503862p-56, 0x1.90d4f1p-1, 0x1.699f52bf1a597p-2, 0x1.c7e9aa36e3377p-58}, {0x1.1fffffeb8p-2, 0x1.47fffffaep-60, 0x1.8f9c19p-1, 0x1.6e221cc2bb868p-2, 0x1.edf2c59ace244p-60}, {0x1.23fffef4b0003p-2, 0x1.930ffd3e20c09p-56, 0x1.8e6528p-1, 0x1.72a16250a7782p-2, 0x1.21efbc62ffae4p-56}, {0x1.27ffff6a78001p-2, 0x1.e0cffc2988707p-59, 0x1.8d3019p-1, 0x1.771d2b00956e3p-2, -0x1.6e767d0931aecp-56}, {0x1.2c000014bp-2, 0x1.4b0000052cp-60, 0x1.8bfce8p-1, 0x1.7b957adc2ff3bp-2, -0x1.4c06dd77b651ap-56}, {0x1.2fffffe0ep-2, 0x1.757ffff73fp-59, 0x1.8acb91p-1, 0x1.800a560ec1da3p-2, -0x1.0b9e56cf905cep-56}, {0x1.3400014532005p-2, -0x1.3695d93bd3959p-59, 0x1.899c0fp-1, 0x1.847bc4a632949p-2, 0x1.52bd8b4db8954p-56}, {0x1.3800002488p-2, 0x1.ff70000dfc1p-59, 0x1.886e5fp-1, 0x1.88e9c756705f5p-2, -0x1.06c488ef0896dp-56}, {0x1.3bffff4e08001p-2, 0x1.e8bbff3717082p-56, 0x1.87427cp-1, 0x1.8d54667727585p-2, -0x1.0da1847e392aap-56}, {0x1.3ffffe5c00008p-2, 0x1.9fffeb7e00067p-57, 0x1.861862p-1, 0x1.91bba6c447dcfp-2, -0x1.fc48be2eed2eap-57}, {0x1.44000088e8001p-2, -0x1.0c37ff4b3daffp-57, 0x1.84f00cp-1, 0x1.961f90e87e59dp-2, 0x1.0459ae579f766p-57}, {0x1.47fffed840004p-2, 0x1.63ffe3b220063p-59, 0x1.83c978p-1, 0x1.9a80224eb84b9p-2, -0x1.bcddc6a14952cp-58}, {0x1.4c000054cp-2, 0x1.530000153p-56, 0x1.82a4ap-1, 0x1.9edd67b6077b9p-2, 0x1.e66b4be819a59p-62}, {0x1.4ffffe41c0009p-2, 0x1.367fe7fa1e07ep-57, 0x1.818182p-1, 0x1.a3375ec3372a1p-2, -0x1.995570a48531ep-57}, {0x1.540000155p-2, 0x1.5500000554p-60, 0x1.806018p-1, 0x1.a78e14869136bp-2, -0x1.5f8c8621ab322p-56}, {0x1.57ffff5500001p-2, 0x1.57ffff5500001p-56, 0x1.7f406p-1, 0x1.abe186df47b97p-2, 0x1.234b98e55c106p-60}, {0x1.5c00004db6p-2, 0x1.19b3c00ff4ae6p-56, 0x1.7e2255p-1, 0x1.b031bf51b3661p-2, 0x1.e098e06ca2c7fp-56}, {0x1.60000056p-2, 0x1.580000158p-56, 0x1.7d05f4p-1, 0x1.b47ebfcfdd47ap-2, 0x1.d1fbd4b1ef502p-58}, {0x1.6400007eae001p-2, -0x1.17c1bfbbae492p-56, 0x1.7beb39p-1, 0x1.b8c88e47256b1p-2, 0x1.063a29db687f8p-57}, {0x1.67fffe5fb8008p-2, -0x1.652c12d491be5p-57, 0x1.7ad221p-1, 0x1.bd0f2ce21f64fp-2, 0x1.0111bb25b7302p-57}, {0x1.6bffff03e2003p-2, -0x1.1a468428ba31p-57, 0x1.79baa7p-1, 0x1.c152a5b5f5508p-2, -0x1.dc436fa3a276ep-57}, {0x1.70000057p-2, 0x1.5c000015cp-56, 0x1.78a4c8p-1, 0x1.c592fb2eead3p-2, -0x1.0eb98c5df43eap-59}, {0x1.7400005f6ep-2, 0x1.a181401c8a55ep-56, 0x1.779081p-1, 0x1.c9d02fd1a193ap-2, -0x1.2d7ff6376746bp-56}, {0x1.780000fb90003p-2, -0x1.660ffbf056df4p-57, 0x1.767dcep-1, 0x1.ce0a4a2d1a3cfp-2, -0x1.c50ac20cc5c35p-62}, {0x1.7c000078a8001p-2, -0x1.6863ffc6f898p-56, 0x1.756cacp-1, 0x1.d2414cffb4308p-2, 0x1.c14cf0a11cb4dp-56}, {0x1.8000010800003p-2, 0x1.800009480001cp-58, 0x1.745d17p-1, 0x1.d6753f182df9cp-2, 0x1.f98007f0a5227p-56}, {0x1.8400013fe8005p-2, -0x1.e15bfbe50ed71p-56, 0x1.734f0cp-1, 0x1.daa6236f1986fp-2, 0x1.e7a7aa5b58758p-59}, {0x1.87ffffd3cp-2, 0x1.61fffff4fp-58, 0x1.724288p-1, 0x1.ded3fd15f8d6p-2, -0x1.2caa8abe0356cp-56}, {0x1.8bffff6d02001p-2, -0x1.916a03267286bp-59, 0x1.713787p-1, 0x1.e2fed337aa309p-2, -0x1.5db766d2b662ap-56}, {0x1.8fffff0b40003p-2, -0x1.7bc001cebaffbp-56, 0x1.702e06p-1, 0x1.e726a9208b3bep-2, -0x1.23b4c757e83b3p-57}, {0x1.940001b04e008p-2, 0x1.6fce93cf5909cp-57, 0x1.6f2601p-1, 0x1.eb4b863c52047p-2, 0x1.1bc6713d1d5cdp-58}, {0x1.97fffed788004p-2, -0x1.4f94065a865abp-57, 0x1.6e1f77p-1, 0x1.ef6d6600b4303p-2, -0x1.416600fbb0053p-56}, {0x1.9c0001997c007p-2, 0x1.31170852ff916p-56, 0x1.6d1a62p-1, 0x1.f38c582110ab4p-2, -0x1.0b8ee83775524p-59}, {0x1.a00001ab80008p-2, -0x1.15ffda5287f4dp-58, 0x1.6c16c1p-1, 0x1.f7a8584344b9bp-2, 0x1.b27adfaae2d4ap-61}, {0x1.a3fffeaabe005p-2, 0x1.4c31d9e17e38p-59, 0x1.6b1491p-1, 0x1.fbc16a3304a8fp-2, 0x1.49b0116ffdab6p-58}, {0x1.a8000054d8p-2, 0x1.3e2a0012a476p-56, 0x1.6a13cdp-1, 0x1.ffd799fecfc57p-2, -0x1.9db596f39084cp-56}, {0x1.abfffea058005p-2, 0x1.4aabfad7ea594p-56, 0x1.691474p-1, 0x1.01f571c44164cp-1, 0x1.2eeb40ee79da5p-55}, {0x1.b00001a4e0008p-2, -0x1.95cff7354e1d7p-56, 0x1.681681p-1, 0x1.03fda98efe6c8p-1, -0x1.8603949cae8fp-55}, {0x1.b4000186aa007p-2, -0x1.dde0b901dea18p-56, 0x1.6719f3p-1, 0x1.06047264cb1e9p-1, 0x1.3f3fe82b9480ap-58}, {0x1.b7fffe8c48006p-2, -0x1.9e4817f6cfb1fp-58, 0x1.661ec7p-1, 0x1.0809ce6c6a1fdp-1, 0x1.bce3988585c83p-55}, {0x1.bc00015810005p-2, 0x1.478025ccc208ep-59, 0x1.6524f8p-1, 0x1.0a0dc3fcadb74p-1, 0x1.c438c2e4a4e9fp-55}, {0x1.bffffe3400009p-2, -0x1.0000b3afffc7ep-60, 0x1.642c86p-1, 0x1.0c104f268ee09p-1, 0x1.7991c3b3db30ap-55}, {0x1.c3fffe102800ap-2, 0x1.a4a3f202b0ecbp-56, 0x1.63356cp-1, 0x1.0e11765cb301cp-1, -0x1.2aaa537074de6p-55}, {0x1.c80001d448009p-2, 0x1.0ab20bb86255bp-56, 0x1.623fa7p-1, 0x1.10113bfef401bp-1, -0x1.7e0f121061ab1p-56}, {0x1.cbfffdf36200cp-2, -0x1.a28950640a751p-56, 0x1.614b37p-1, 0x1.120f9c34c0c9p-1, -0x1.dfe1162f7b692p-55}, {0x1.d00000174p-2, 0x1.74000005dp-60, 0x1.605816p-1, 0x1.140c9fb5a8f7fp-1, -0x1.b8e77375e280ep-56}, {0x1.d400011aaa003p-2, 0x1.634d428950232p-56, 0x1.5f6643p-1, 0x1.160844d54f014p-1, 0x1.8905ac4825bc1p-56}, {0x1.d7fffe152000ap-2, 0x1.117fcb2642115p-58, 0x1.5e75bcp-1, 0x1.18028c04ca092p-1, 0x1.9995c81c00c2dp-55}, {0x1.dc00010d88003p-2, 0x1.b9c022cf60864p-60, 0x1.5d867cp-1, 0x1.19fb7c13ec9cbp-1, -0x1.d0bd1c8ee7f6dp-55}, {0x1.dffffece80004p-2, -0x1.f2000c9ad7fd7p-58, 0x1.5c9883p-1, 0x1.1bf3115352b0ep-1, -0x1.089d86505232dp-55}, {0x1.e40001b3e8008p-2, -0x1.feefdb93b1558p-58, 0x1.5babccp-1, 0x1.1de952af508efp-1, -0x1.f26b3411a7b5dp-55}, {0x1.e7fffea388005p-2, 0x1.3e9fb5f691311p-60, 0x1.5ac057p-1, 0x1.1fde3c86ab23fp-1, -0x1.2f6561c930d55p-56}, {0x1.ec00004ff2p-2, 0x1.0dd0c00e3a822p-56, 0x1.59d61fp-1, 0x1.21d1d5e261422p-1, -0x1.2a954f2219ae1p-57}, {0x1.f0000023ap-2, 0x1.ab80000a05p-59, 0x1.58ed23p-1, 0x1.23c41d53c2721p-1, -0x1.b5408d57adfdep-56}, {0x1.f400005f4p-2, 0x1.7d000017dp-56, 0x1.58056p-1, 0x1.25b515b99e5f1p-1, 0x1.30c342a2944b9p-57}, {0x1.f7fffef960003p-2, -0x1.6e4003e10cff5p-57, 0x1.571ed4p-1, 0x1.27a4bfd967b6ep-1, -0x1.2ebcc9e150d9dp-57}, {0x1.fbfffe7508006p-2, 0x1.74fbf96fd709bp-56, 0x1.56397cp-1, 0x1.29931ea921c92p-1, -0x1.3ed67a542f9b6p-55}, {0x1.000000c000003p-1, 0x1.8000006p-78, 0x1.555555p-1, 0x1.2b80352ca1e85p-1, -0x1.3d82406f24c25p-59}, };
static const int B_ORIGIN = 170;
static const logdata_t B_LOOKUP[] = { {-0x1.540014ec115e4p-8, -0x1.feccae49893f5p-62, 0x1.0155c6p+0, -0x1.ebcb28ccb7d07p-8, -0x1.529c5874e9aefp-62}, {-0x1.52006aa07d176p-8, 0x1.0f47cf633c3d7p-62, 0x1.0153c1p+0, -0x1.e8e524ed8e1fep-8, -0x1.029055e430fe6p-62}, {-0x1.4fffbaeb22ed4p-8, -0x1.93a49d737bf67p-63, 0x1.0151bbp+0, -0x1.e5fdabcbdc26dp-8, -0x1.a86c6b5c667eap-63}, {-0x1.4e00008b4958p-8, 0x1.30b0707f595f8p-66, 0x1.014fb6p+0, -0x1.e3179c441682bp-8, -0x1.6a87d0f11e27ap-65}, {-0x1.4c003e230180dp-8, -0x1.d771875d6ce1cp-62, 0x1.014db1p+0, -0x1.e03186e950e0cp-8, -0x1.e7115be6b3982p-62}, {-0x1.4a0073b21afb7p-8, -0x1.60d73ca3fb3cp-63, 0x1.014bacp+0, -0x1.dd4b6bbb73d94p-8, -0x1.2a48f2a8de535p-62}, {-0x1.47ffa3c6c15eap-8, 0x1.fcee8771439cbp-63, 0x1.0149a6p+0, -0x1.da63db3f261a7p-8, 0x1.8717493fc30afp-64}, {-0x1.45ffc94011984p-8, 0x1.212df869c7a77p-62, 0x1.0147a1p+0, -0x1.d77db467f19b3p-8, 0x1.a98be598bed68p-67}, {-0x1.43ffe6b031bd8p-8, 0x1.ef075dfd304b6p-63, 0x1.01459cp+0, -0x1.d49787bd5f6ffp-8, -0x1.a9bc11bf1fe42p-62}, {-0x1.41fffc16f15bfp-8, -0x1.4450ee973a761p-65, 0x1.014397p+0, -0x1.d1b1553f582ecp-8, 0x1.43c4e5abbb697p-62}, {-0x1.400009741fffap-8, -0x1.8c3400d54c12p-62, 0x1.014192p+0, -0x1.cecb1cedc46cep-8, -0x1.d8b692e1c94d3p-62}, {-0x1.3e000ec78d332p-8, -0x1.20163d9cf975bp-62, 0x1.013f8dp+0, -0x1.cbe4dec88cbf6p-8, 0x1.9dc91f7b3614bp-62}, {-0x1.3c000c11087f7p-8, 0x1.2743848903ed6p-63, 0x1.013d88p+0, -0x1.c8fe9acf99ba6p-8, -0x1.bcace193c3eafp-64}, {-0x1.3a000150616cp-8, 0x1.bc20a095b59cfp-64, 0x1.013b83p+0, -0x1.c6185102d3f1cp-8, -0x1.909baf9b77dfcp-63}, {-0x1.37ffee85677edp-8, 0x1.7c8b2e879b4c6p-63, 0x1.01397ep+0, -0x1.c332016223f8bp-8, -0x1.cf106247d2e18p-63}, {-0x1.35ffd3afea3c5p-8, 0x1.3d6a41e2bc68fp-62, 0x1.013779p+0, -0x1.c04babed7261ep-8, 0x1.0928f24974b97p-62}, {-0x1.33ffb0cfb9276p-8, -0x1.c77da6f08ffd3p-63, 0x1.013574p+0, -0x1.bd6550a4a7bf5p-8, -0x1.cf2ea46b359a8p-62}, {-0x1.31ff85e4a3c18p-8, 0x1.02239f5a746e2p-62, 0x1.01336fp+0, -0x1.ba7eef87aca2bp-8, -0x1.eebd4a898a2ddp-63}, {-0x1.3000508fe2e68p-8, -0x1.e08ccf62117b3p-62, 0x1.01316bp+0, -0x1.b799f8344be5ep-8, -0x1.98e58512baac1p-63}, {-0x1.2e0015926f163p-8, 0x1.c0bfba4622c4ep-63, 0x1.012f66p+0, -0x1.b4b38b718c858p-8, -0x1.b9f30101e2686p-64}, {-0x1.2bffd2898587ep-8, -0x1.d06f4d281b9b5p-63, 0x1.012d61p+0, -0x1.b1cd18da5667fp-8, -0x1.c7eb81e38d75ep-62}, {-0x1.29ff8774f5b7p-8, 0x1.41395e8df23b1p-62, 0x1.012b5cp+0, -0x1.aee6a06e921cap-8, 0x1.c537fc230a8d1p-63}, {-0x1.28003205e5f63p-8, 0x1.a8639298b2748p-64, 0x1.012958p+0, -0x1.ac0191d7954bp-8, 0x1.37a742b6f8924p-62}, {-0x1.25ffd6dd74256p-8, 0x1.dabb68204013bp-63, 0x1.012753p+0, -0x1.a91b0dc5517c5p-8, 0x1.c2da8e49db20cp-62}, {-0x1.2400716217bd9p-8, 0x1.47d7d0d265c0ap-64, 0x1.01254fp+0, -0x1.a635f38d6b455p-8, -0x1.d96d2999d57b9p-64}, {-0x1.220006250227ep-8, 0x1.7b1a537d7c398p-62, 0x1.01234ap+0, -0x1.a34f63d44a587p-8, -0x1.e98cc82fded6ap-62}, {-0x1.1fff92db53d14p-8, -0x1.95e23e31cf01ep-63, 0x1.012145p+0, -0x1.a068ce4626198p-8, 0x1.217488a6c409ap-62}, {-0x1.1e00154a1c824p-8, 0x1.cead66207aa84p-62, 0x1.011f41p+0, -0x1.9d83a29ac1a34p-8, -0x1.7ad7d5fd429d2p-62}, {-0x1.1bff91eaa7907p-8, -0x1.39ff94df5c71cp-62, 0x1.011d3cp+0, -0x1.9a9d016533ca1p-8, 0x1.32f79d1a3a482p-62}, {-0x1.1a00044b3fdffp-8, 0x1.4241bad812449p-63, 0x1.011b38p+0, -0x1.97b7ca17fc46p-8, -0x1.4a03b6f5dd193p-63}, {-0x1.18006ea674cffp-8, -0x1.ffa2ce5e68743p-62, 0x1.011934p+0, -0x1.94d28cfb29357p-8, -0x1.6f07d9f9e4dfdp-62}, {-0x1.15ffd326e8d42p-8, 0x1.f4c6cf637a824p-63, 0x1.01172fp+0, -0x1.91ebda4b3f213p-8, 0x1.573e403234d26p-63}, {-0x1.14002d72cb27ep-8, -0x1.6d2ff5c4049f1p-62, 0x1.01152bp+0, -0x1.8f06918c0cd64p-8, 0x1.7391494fb5bc6p-63}, {-0x1.11ff81db93d99p-8, -0x1.54931b6bb53a5p-62, 0x1.011326p+0, -0x1.8c1fd333cf0c7p-8, -0x1.8a40419b19efbp-62}, {-0x1.0fffcc1761f57p-8, 0x1.bd2de6eca4f8ap-64, 0x1.011122p+0, -0x1.893a7ed1e006ep-8, 0x1.870dd5cd2f64cp-64}, {-0x1.0e000e4cdaf73p-8, -0x1.5433e5324ae6dp-63, 0x1.010f1ep+0, -0x1.8655249fe0b73p-8, 0x1.1306b3c97afa1p-63}, {-0x1.0c00487bce8b6p-8, -0x1.234bdbb46f16fp-62, 0x1.010d1ap+0, -0x1.836fc49db9c74p-8, -0x1.03637ba59431ap-63}, {-0x1.0a007aa40c5dp-8, -0x1.eefd92fde68ebp-64, 0x1.010b16p+0, -0x1.808a5ecb53e07p-8, 0x1.e7bb01c9b38bfp-63}, {-0x1.07ffa6d45420dp-8, -0x1.c83067998b2dcp-66, 0x1.010911p+0, -0x1.7da3835100a94p-8, -0x1.b6a12ab73c0a1p-62}, {-0x1.05ffc8ea99c82p-8, 0x1.985ec9e1c8ca4p-62, 0x1.01070dp+0, -0x1.7abe11daf456ap-8, -0x1.e849a18d29e5cp-64}, {-0x1.03ffe2f9988cbp-8, -0x1.18b0b1fc537dp-63, 0x1.010509p+0, -0x1.77d89a9462fa2p-8, -0x1.7f41cb463e913p-62}, {-0x1.01fff50120138p-8, -0x1.a79b05e304355p-62, 0x1.010305p+0, -0x1.74f31d7d353afp-8, -0x1.b15641a138382p-64}, {-0x1.fffffe02p-9, 0x1.fe000001fep-65, 0x1.010101p+0, -0x1.720d9a9553bf9p-8, -0x1.bf85dcbd8a866p-62}, {-0x1.fc0001f20fe8p-9, 0x1.e663888e2502dp-65, 0x1.00fefdp+0, -0x1.6f2811dca72e2p-8, 0x1.31fd9a7343c6cp-62}, {-0x1.f7fff5d20f1fdp-9, 0x1.00aeae626f7c8p-63, 0x1.00fcf9p+0, -0x1.6c428353182bfp-8, -0x1.c2d80dc3be2c9p-62}, {-0x1.f3ffd9a19ce52p-9, 0x1.72d845e2c5a8fp-64, 0x1.00faf5p+0, -0x1.695ceef88f5e1p-8, -0x1.9dd67838d6355p-62}, {-0x1.efffad605872ap-9, 0x1.265617822dc22p-64, 0x1.00f8f1p+0, -0x1.667754ccf568ep-8, 0x1.cd8a71277c813p-62}, {-0x1.ebff710de0fffp-9, -0x1.8367f374d15bbp-66, 0x1.00f6edp+0, -0x1.6391b4d032f01p-8, -0x1.35d7f5f9f0eccp-65}, {-0x1.e7ff24a9d5c1bp-9, 0x1.47109a7ea2afbp-68, 0x1.00f4e9p+0, -0x1.60ac0f023097p-8, -0x1.e43f527d44679p-63}, {-0x1.e400c46d9fe46p-9, 0x1.c34aedb5f869bp-64, 0x1.00f2e6p+0, -0x1.5dc7d35a2ba4ep-8, -0x1.712f884949123p-62}, {-0x1.e00057ed43f0ep-9, 0x1.f15578d147249p-63, 0x1.00f0e2p+0, -0x1.5ae221ec466a2p-8, -0x1.1a15ac97b3c44p-63}, {-0x1.dbffdb5a31ed6p-9, 0x1.f941ceaacbfe4p-65, 0x1.00eedep+0, -0x1.57fc6aacdb413p-8, -0x1.ccdd271019a7fp-62}, {-0x1.d7ff4eb409026p-9, -0x1.10c0c6054a7edp-64, 0x1.00ecdap+0, -0x1.5516ad9bd2cb3p-8, -0x1.f4588de1ad38p-62}, {-0x1.d400ae5414bc7p-9, 0x1.a71deb4ccb30cp-65, 0x1.00ead7p+0, -0x1.52325abbf500dp-8, -0x1.e1983b9964fcep-63}, {-0x1.d000018e958p-9, 0x1.3764cbff0cb94p-65, 0x1.00e8d3p+0, -0x1.4f4c920a4ef74p-8, -0x1.e1b5e8b410a84p-64}, {-0x1.cbff44b4dcf34p-9, 0x1.331bdca43d086p-65, 0x1.00e6cfp+0, -0x1.4c66c386c58c2p-8, -0x1.124b274c37dafp-64}, {-0x1.c800743821658p-9, -0x1.bdb923ec78c4p-63, 0x1.00e4ccp+0, -0x1.49825f3cc8db3p-8, -0x1.04107e1153097p-62}, {-0x1.c3ff973cce2a8p-9, 0x1.49f5b34fbf82ap-64, 0x1.00e2c8p+0, -0x1.469c851815d16p-8, 0x1.d7894fdf56dcfp-66}, {-0x1.c000a6ada7c99p-9, 0x1.3cf79b6d759dep-64, 0x1.00e0c5p+0, -0x1.43b8153285f6fp-8, 0x1.358b31a848ca2p-62}, {-0x1.bbffa98f36f96p-9, 0x1.2bcb7b8679427p-63, 0x1.00dec1p+0, -0x1.40d22f6c4bf3ep-8, 0x1.5a879c7800e56p-64}, {-0x1.b80098ec23923p-9, 0x1.01123d8795d0ap-63, 0x1.00dcbep+0, -0x1.3dedb3eacbc18p-8, 0x1.b0e64f24676a1p-64}, {-0x1.b3ff7ba9122dbp-9, 0x1.0da28fa98d3c9p-64, 0x1.00dabap+0, -0x1.3b07c282ad665p-8, -0x1.634d7f2b8b24cp-64}, {-0x1.b0004af08f75p-9, 0x1.439116487be9ap-65, 0x1.00d8b7p+0, -0x1.38233b64dfa94p-8, 0x1.982f74c31560ep-64}, {-0x1.abff0d875a64dp-9, 0x1.1da7ca00d112bp-63, 0x1.00d6b3p+0, -0x1.353d3e5a7f92ap-8, -0x1.10c62c49e2fa1p-62}, {-0x1.a7ffbcb7e5f72p-9, -0x1.3e9154a1ffa8fp-65, 0x1.00d4bp+0, -0x1.3258aba00713bp-8, -0x1.6576c1eee2a93p-62}, {-0x1.a4005be063d77p-9, -0x1.7231ad147342ap-63, 0x1.00d2adp+0, -0x1.2f7413188758ep-8, 0x1.64b9181d3c228p-62}, {-0x1.a000eb007393dp-9, 0x1.354deb4b14bf5p-63, 0x1.00d0aap+0, -0x1.2c8f74c3e91e3p-8, -0x1.6ac95ada8cf5fp-62}, {-0x1.9bff6d4e6a05dp-9, -0x1.a3643d639a0b7p-63, 0x1.00cea6p+0, -0x1.29a96076d1119p-8, 0x1.89adb4b4205a5p-63}, {-0x1.97ffdc54835d8p-9, -0x1.d7fe34e6fc3ffp-65, 0x1.00cca3p+0, -0x1.26c4b684cdb0cp-8, 0x1.7437881e837d2p-62}, {-0x1.94003b510cf92p-9, 0x1.2ad07cbb46458p-63, 0x1.00caap+0, -0x1.23e006c565f5bp-8, 0x1.72e0d995ddf6dp-63}, {-0x1.90008a43a65a9p-9, 0x1.e18bcb764fca2p-64, 0x1.00c89dp+0, -0x1.20fb5138829a6p-8, 0x1.eaf265fa527c4p-62}, {-0x1.8c00c92bef00bp-9, -0x1.eae0b6e75b087p-63, 0x1.00c69ap+0, -0x1.1e1695de0c582p-8, -0x1.3d57f1f088769p-63}, {-0x1.8800f80986678p-9, 0x1.6034a7f05cea1p-63, 0x1.00c497p+0, -0x1.1b31d4b5ebe7ep-8, -0x1.87958a7341c31p-62}, {-0x1.83ff19e2e6304p-9, -0x1.4f73d99596b2ep-63, 0x1.00c293p+0, -0x1.184b9d8375c28p-8, 0x1.bb613de7ce4cbp-62}, {-0x1.7fff28a1ffa52p-9, -0x1.15f66ad543f51p-63, 0x1.00c09p+0, -0x1.1566d0bcd8805p-8, 0x1.e0f078be4b2d8p-62}, {-0x1.7bff2755460c1p-9, 0x1.2149dfd62ec05p-63, 0x1.00be8dp+0, -0x1.1281fe284b2bcp-8, -0x1.5c0f51ed16ea2p-62}, {-0x1.77ff15fc58d4cp-9, 0x1.072a0f4020af7p-63, 0x1.00bc8ap+0, -0x1.0f9d25c5b67bap-8, 0x1.8994be2a0e53ep-62}, {-0x1.7400f1afe5cd9p-9, -0x1.a2d9af52f8935p-63, 0x1.00ba88p+0, -0x1.0cb9b7dd2223fp-8, 0x1.51f85647d7e8fp-62}, {-0x1.7000c0456a379p-9, -0x1.f6fe001df468cp-63, 0x1.00b885p+0, -0x1.09d4d3e11baadp-8, -0x1.481f798d26cf1p-67}, {-0x1.6c007ecd99708p-9, -0x1.0c304d786511p-64, 0x1.00b682p+0, -0x1.06efea16c8025p-8, -0x1.8be819d261b66p-62}, {-0x1.68002d4812dcp-9, 0x1.02130a951ce7bp-63, 0x1.00b47fp+0, -0x1.040afa7e0fdefp-8, -0x1.95af21b72e885p-62}, {-0x1.63ffcbb475daap-9, -0x1.38dc7f24cad52p-63, 0x1.00b27cp+0, -0x1.01260516dbf4ap-8, 0x1.05b02149895fcp-63}, {-0x1.5fff5a1261ca1p-9, -0x1.3649b6a994141p-63, 0x1.00b079p+0, -0x1.fc8213c229ed6p-9, 0x1.d954b8288a764p-64}, {-0x1.5c00d5aa62deap-9, 0x1.d052a7fb670a2p-63, 0x1.00ae77p+0, -0x1.f6baf26c253fbp-9, 0x1.3effcb2430d22p-64}, {-0x1.580043f23a76fp-9, -0x1.654622fcb65bp-63, 0x1.00ac74p+0, -0x1.f0f0e4cb85497p-9, 0x1.790485c704bc4p-65}, {-0x1.53ffa22a7936cp-9, -0x1.10f4e4e3e79f9p-64, 0x1.00aa71p+0, -0x1.eb26cb8d3370ep-9, -0x1.4ea8f48d27c99p-68}, {-0x1.5000edb39b116p-9, 0x1.d092a653433dcp-64, 0x1.00a86fp+0, -0x1.e55f87752efb1p-9, 0x1.c65f26750c3c8p-63}, {-0x1.4c002bd3825c4p-9, 0x1.674bed302ab4p-64, 0x1.00a66cp+0, -0x1.df955700b3ed8p-9, 0x1.f6c14de3e616bp-63}, {-0x1.47ff59e2aeeap-9, 0x1.e844eb94d00abp-63, 0x1.00a469p+0, -0x1.d9cb1aedfb38ap-9, 0x1.409622fa3ec2ap-64}, {-0x1.440075598e1d1p-9, 0x1.a36a49fd69de1p-63, 0x1.00a267p+0, -0x1.d403b41254c17p-9, -0x1.2bf6856ac2e2ap-63}, {-0x1.3fff834e1fe19p-9, 0x1.6d376eb12a088p-65, 0x1.00a064p+0, -0x1.ce3960c85b894p-9, -0x1.2a30252bab452p-63}, {-0x1.3c007eb998f09p-9, 0x1.04560f39a895ep-65, 0x1.009e62p+0, -0x1.c871e2c0a1f71p-9, -0x1.63e280fe28547p-65}, {-0x1.37ff6c920db57p-9, -0x1.2bfe799a76bf5p-64, 0x1.009c5fp+0, -0x1.c2a7783eae0bdp-9, -0x1.33688a6a0ec66p-63}, {-0x1.340047f09f1dep-9, 0x1.c588e6e25ff21p-65, 0x1.009a5dp+0, -0x1.bcdfe30a27871p-9, 0x1.91aebc6c6eaacp-66}, {-0x1.2fff15ab74948p-9, -0x1.ae95bfb586d22p-66, 0x1.00985ap+0, -0x1.b715614f7eb05p-9, 0x1.0402e54a14afep-65}, {-0x1.2bffd0fb9cbbbp-9, 0x1.ebb17cfbc1861p-64, 0x1.009658p+0, -0x1.b14db4ed7158bp-9, -0x1.b2029f221ad61p-64}, {-0x1.28007c47fca1cp-9, -0x1.ce48e2908854ap-64, 0x1.009456p+0, -0x1.ab85fcf73d0e3p-9, -0x1.764c4a765b8a4p-63}, {-0x1.23ff19d78db05p-9, 0x1.7cf03380bfdfdp-65, 0x1.009253p+0, -0x1.a5bb58690b41cp-9, -0x1.942799dc997c7p-63}, {-0x1.1fffa51341efdp-9, -0x1.3d6c3ead7e93ep-65, 0x1.009051p+0, -0x1.9ff38944395adp-9, 0x1.6af69dcd18f29p-64}, {-0x1.1c00204a0cf5fp-9, -0x1.6478931d30692p-63, 0x1.008e4fp+0, -0x1.9a2bae8ab539ep-9, -0x1.373a4b8968074p-63}, {-0x1.18008b7b8e79fp-9, 0x1.21dc70434d6d7p-63, 0x1.008c4dp+0, -0x1.9463c83c50779p-9, 0x1.23755eb9b6477p-65}, {-0x1.1400e6a7662fep-9, 0x1.7cbf912f9ccc8p-66, 0x1.008a4bp+0, -0x1.8e9bd658dcab3p-9, -0x1.6c3024e887bcfp-63}, {-0x1.0fff33eca3ae8p-9, 0x1.5dcfc73bb83d5p-64, 0x1.008848p+0, -0x1.88d0f7bfa8ccdp-9, -0x1.6a4b439bc0a37p-63}, {-0x1.0bff6f040b86ep-9, 0x1.df1557d430ea6p-64, 0x1.008646p+0, -0x1.8308eeabc6b1cp-9, -0x1.a59faf4522eefp-63}, {-0x1.07ff9a14a86bbp-9, 0x1.104a01838fc2fp-63, 0x1.008444p+0, -0x1.7d40da024a355p-9, 0x1.4056394cb8282p-63}, {-0x1.03ffb51e1a05p-9, -0x1.af5209243541ap-63, 0x1.008242p+0, -0x1.7778b9c304ea7p-9, -0x1.b13b4dd4e19c7p-66}, {-0x1.ffff803ffffp-10, -0x1.ffff803ffffp-64, 0x1.00804p+0, -0x1.71b08dedc8633p-9, 0x1.f7eccd83c2e4dp-66}, {-0x1.f7ff7633f3cd7p-10, 0x1.09b540706314p-64, 0x1.007e3ep+0, -0x1.6be8568266306p-9, -0x1.502131b4fdafcp-63}, {-0x1.efff4c174ee05p-10, -0x1.3694973beb87ep-64, 0x1.007c3cp+0, -0x1.66201380afe1ep-9, 0x1.ed90e871b1216p-64}, {-0x1.e7ff01e95060dp-10, -0x1.690fd4a712338p-64, 0x1.007a3ap+0, -0x1.6057c4e877064p-9, -0x1.45970c611e849p-63}, {-0x1.dffe97a93780fp-10, -0x1.d9f44dce16607p-64, 0x1.007838p+0, -0x1.5a8f6ab98d2b4p-9, 0x1.700065234dd49p-63}, {-0x1.d7fe0d56436ccp-10, 0x1.95a0d24f23292p-64, 0x1.007636p+0, -0x1.54c704f3c3dd4p-9, 0x1.7640c15343ef9p-65}, {-0x1.d0015f5086c74p-10, -0x1.ceed9c7de58dfp-66, 0x1.007435p+0, -0x1.4f0174f125349p-9, 0x1.3ba413f5070ffp-64}, {-0x1.c80094e5941a5p-10, 0x1.c624e916d963ap-69, 0x1.007233p+0, -0x1.4938f802d785cp-9, 0x1.e6c4cf3373071p-65}, {-0x1.bfffaa6583f8dp-10, -0x1.380f4994e1c7cp-64, 0x1.007031p+0, -0x1.43706f7d1f1a2p-9, 0x1.ca15f500601a9p-66}, {-0x1.b7fe9fcf9576bp-10, 0x1.5b85010c21985p-64, 0x1.006e2fp+0, -0x1.3da7db5fcd79dp-9, -0x1.a75f4daee51e1p-63}, {-0x1.b00171c3befa4p-10, -0x1.0d9255d37f5a4p-65, 0x1.006c2ep+0, -0x1.37e21d1c01f2fp-9, -0x1.7021c3e81404dp-67}, {-0x1.a800270fccbe8p-10, -0x1.ed755899255c3p-66, 0x1.006a2cp+0, -0x1.321971d4b8bddp-9, -0x1.65fe3b555c2d4p-63}, {-0x1.9ffebc43b9998p-10, 0x1.67056ae5af273p-65, 0x1.00682ap+0, -0x1.2c50baf54afd2p-9, 0x1.445f371f4576fp-64}, {-0x1.98012e2f68b6bp-10, 0x1.1e521d6d1fceep-67, 0x1.006629p+0, -0x1.268ada002821fp-9, 0x1.6227a24679193p-63}, {-0x1.8fff8340cdb0cp-10, -0x1.e7062766abe43p-64, 0x1.006427p+0, -0x1.20c20bf5ac5a1p-9, -0x1.0288c235480aep-66}, {-0x1.8801b52865a51p-10, -0x1.ed9aa986257bcp-64, 0x1.006226p+0, -0x1.1afc13e0a8d59p-9, 0x1.5c45b1b03d85p-71}, {-0x1.7fffca143ffd3p-10, 0x1.fba80998c55c8p-64, 0x1.006024p+0, -0x1.15332eaa65699p-9, -0x1.e60625ef3c27ep-66}, {-0x1.7801bbf4bf6f4p-10, 0x1.0555a6d20911fp-66, 0x1.005e23p+0, -0x1.0f6d1f74c7f6ep-9, 0x1.d96948b89040ep-63}, {-0x1.6fff90b80c33ep-10, -0x1.e3b9facee4514p-65, 0x1.005c21p+0, -0x1.09a423120341p-9, 0x1.5c72fb3e13bd5p-63}, {-0x1.6801428e719a4p-10, -0x1.91aa97d14d70ap-66, 0x1.005a2p+0, -0x1.03ddfcbb12927p-9, 0x1.46a838e01e676p-64}, {-0x1.5ffed7262da9dp-10, -0x1.1148571b944fdp-64, 0x1.00581ep+0, -0x1.fc29d25625c88p-10, 0x1.a809ec755c51ap-66}, {-0x1.580048ef774adp-10, 0x1.d21001d392b7cp-65, 0x1.00561dp+0, -0x1.f09d57642b472p-10, 0x1.6a3f6c51c28cap-64}, {-0x1.50019ab90e5b1p-10, 0x1.b909f87d5faeep-65, 0x1.00541cp+0, -0x1.e510c5555d8b9p-10, -0x1.ed886f33b3fa1p-64}, {-0x1.47fecf11cb451p-10, -0x1.4e8bcd3e0f46dp-64, 0x1.00521ap+0, -0x1.d97e58b0bc281p-10, -0x1.70d89c61734e2p-64}, {-0x1.3fffe0c9c3ff1p-10, 0x1.ebda63b8829a3p-65, 0x1.005019p+0, -0x1.cdf1985ba952fp-10, 0x1.11de0907e9af9p-65}, {-0x1.3800d27fc954bp-10, 0x1.565fceb609282p-65, 0x1.004e18p+0, -0x1.c264c0e8ad848p-10, 0x1.415244b2e8412p-65}, {-0x1.3001a4331b136p-10, 0x1.2ee3993810971p-66, 0x1.004c17p+0, -0x1.b6d7d2576c32cp-10, -0x1.783365ce8cbd1p-65}, {-0x1.27fe5832a4206p-10, -0x1.cae13d3fd1873p-64, 0x1.004a15p+0, -0x1.ab450900b9ad1p-10, -0x1.8132e8db56ee2p-65}, {-0x1.1ffee9ce53b45p-10, -0x1.af60fb05d2c04p-64, 0x1.004814p+0, -0x1.9fb7ec264ddc8p-10, 0x1.5c8ff88f79e1fp-64}, {-0x1.17ff5b650e958p-10, -0x1.8489659805e42p-65, 0x1.004613p+0, -0x1.942ab82c86af6p-10, 0x1.5287c3bcfb294p-64}, {-0x1.0fffacf614794p-10, -0x1.2cecbbf56d97ap-65, 0x1.004412p+0, -0x1.889d6d130793p-10, -0x1.8c240857cf4e9p-66}, {-0x1.07ffde80a50eep-10, -0x1.cc99e9bb85224p-64, 0x1.004211p+0, -0x1.7d100ad973f29p-10, -0x1.2da85cf4eb57ap-66}, {-0x1.ffffe007ffff8p-11, -0x1.ffffe007ffff8p-71, 0x1.00401p+0, -0x1.7182917f6f37p-10, 0x1.384f05ed47078p-68}, {-0x1.efffc2fec9de3p-11, 0x1.a33f2e2220084p-67, 0x1.003e0fp+0, -0x1.65f501049cc71p-10, -0x1.c65a2fab0be0ep-64}, {-0x1.dfff65e426f46p-11, -0x1.25c3c60ce026cp-65, 0x1.003c0ep+0, -0x1.5a675968a0077p-10, -0x1.4f0b1baad130ap-64}, {-0x1.cffec8b69670ap-11, -0x1.35bbbbbceea95p-65, 0x1.003a0dp+0, -0x1.4ed99aab1c5a9p-10, 0x1.11e2a44bfe00dp-64}, {-0x1.bffdeb7497756p-11, -0x1.cdfabb7f3b611p-65, 0x1.00380cp+0, -0x1.434bc4cbb520ap-10, 0x1.eb530413510f2p-70}, {-0x1.affcce1ca9192p-11, 0x1.a3dc7574c0537p-65, 0x1.00360bp+0, -0x1.37bdd7ca0db7dp-10, 0x1.54baae9e6d3ddp-64}, {-0x1.a0036d6da007dp-11, 0x1.dd4475962c718p-65, 0x1.00340bp+0, -0x1.2c3597cb8e8f4p-10, -0x1.38dc1f165312ap-64}, {-0x1.9001d0054cd6dp-11, 0x1.bcea10e78e1d3p-65, 0x1.00320ap+0, -0x1.20a77c8fdca83p-10, 0x1.7bd0fbd788e32p-64}, {-0x1.7ffff28287fffp-11, 0x1.b0eea0099a92bp-65, 0x1.003009p+0, -0x1.15194a30d4cdap-10, -0x1.c660f3a4e9f4fp-65}, {-0x1.6ffdd4e3d0697p-11, 0x1.7528671437257p-67, 0x1.002e08p+0, -0x1.098b00ae1a552p-10, 0x1.af36b1ff765acp-64}, {-0x1.60037467e281dp-11, -0x1.4ddf532eb95ebp-66, 0x1.002c08p+0, -0x1.fc04c8b6805ep-11, -0x1.5038ae376b2e1p-65}, {-0x1.5000d6acc1c98p-11, 0x1.16b2df088481p-65, 0x1.002a07p+0, -0x1.e4e7d9372df1ap-11, 0x1.6275688d64fecp-68}, {-0x1.3ffdf8d12b7c5p-11, 0x1.38841409c600dp-66, 0x1.002806p+0, -0x1.cdcabb6e4a8c1p-11, 0x1.d6c5366f679fcp-66}, {-0x1.3002d873cdbccp-11, 0x1.ad9931311b8ecp-68, 0x1.002606p+0, -0x1.b6b8f8483cb8ap-11, -0x1.a420a70defa7ep-66}, {-0x1.1fff7a72ca775p-11, 0x1.aea88be309574p-65, 0x1.002405p+0, -0x1.9f9b7e01254bbp-11, -0x1.c8a232d7c8e17p-65}, {-0x1.1003da2cf2c4ep-11, -0x1.1c41d9b3ccde4p-67, 0x1.002205p+0, -0x1.88895e899a0e7p-11, -0x1.3415020e9821cp-70}, {-0x1.fffff801p-12, 0x1.ffc00000ffep-67, 0x1.002004p+0, -0x1.716b87c16a4f1p-11, 0x1.c6eac065f85abp-65}, {-0x1.e007b7985d46bp-12, -0x1.08f5ef0a25138p-70, 0x1.001e04p+0, -0x1.5a590bf57ebcep-11, 0x1.151eeb7ec0e04p-65}, {-0x1.bffefadc92ef6p-12, 0x1.f99c34fd5faa9p-66, 0x1.001c03p+0, -0x1.433ad8a9523d2p-11, 0x1.d2953a8738b2p-68}, {-0x1.a005ba8afcb2bp-12, -0x1.38e2315c560b3p-66, 0x1.001a03p+0, -0x1.2c28008623486p-11, 0x1.2bb8ac53bf8bap-65}, {-0x1.7ffbfd6046fe9p-12, -0x1.e4f33d6857bcfp-66, 0x1.001802p+0, -0x1.150970b31577bp-11, -0x1.312211364d9acp-65}, {-0x1.6001bd19bc4fap-12, 0x1.28162bc81077p-67, 0x1.001602p+0, -0x1.fbec786b7fep-12, 0x1.b62f5eef321d9p-72}, {-0x1.4006fcf42ef27p-12, 0x1.a7315cd65c872p-67, 0x1.001402p+0, -0x1.cdc5b32b9541cp-12, -0x1.ecbff88929b1bp-67}, {-0x1.1ffbbf2c931e8p-12, 0x1.2df263c7099d9p-66, 0x1.001201p+0, -0x1.9f877dfd195aep-12, -0x1.743a3a7d1d1c6p-67}, {-0x1.fffffe002p-13, 0x1.ffe000001ffep-73, 0x1.001001p+0, -0x1.71600000383c6p-12, 0x1.9526447913a46p-67}, {-0x1.c0077dd716befp-13, 0x1.61e46020d9d3fp-67, 0x1.000e01p+0, -0x1.433825b9c3cfcp-12, -0x1.14efc90dff243p-67}, {-0x1.800dfdd80be1ap-13, 0x1.a7c48921cde13p-67, 0x1.000c01p+0, -0x1.150fef284b018p-12, -0x1.469f0e824b16fp-66}, {-0x1.3ff3807cfb1e3p-13, -0x1.a42f96242296ap-70, 0x1.000ap+0, -0x1.cda08fd39db35p-13, -0x1.a3a134d498d23p-68}, {-0x1.fff0007ffc002p-14, 0x1.fff0007ffcp-79, 0x1.0008p+0, -0x1.714eb11fa5363p-13, -0x1.d523885ac824cp-67}, {-0x1.7ff70035febcp-14, -0x1.e5f49c445666p-68, 0x1.0006p+0, -0x1.14fc19ccfba78p-13, -0x1.b48516b2c97bp-67}, {-0x1.fff8001fff8p-15, -0x1.fff8001fff8p-71, 0x1.0004p+0, -0x1.715193b17d35dp-14, -0x1.945957f63330ap-69}, {-0x1.fffc0007fffp-16, -0x1.fffc0007fffp-76, 0x1.0002p+0, -0x1.715305002e4aep-15, -0x1.19bb4192806b9p-69}, {0x0p+0, 0x0p+0, 0x1p+0, 0x0p+0, 0x0p+0}, {0x1.000200040008p-15, 0x1.000200040008p-75, 0x1.fffcp-1, 0x1.7155e7a91af62p-15, -0x1.79ddac1de6789p-69}, {0x1.00040010004p-14, 0x1.00040010004p-70, 0x1.fff8p-1, 0x1.7157590356aeep-14, -0x1.88fb2ea8bf9eap-70}, {0x1.800900360144p-14, 0x1.e60b6444599a2p-68, 0x1.fff4p-1, 0x1.150297c91090ap-13, -0x1.39f3d5431038p-70}, {0x1.0008004002001p-13, 0x1.0008004002p-78, 0x1.fffp-1, 0x1.715a3bc3593d5p-13, -0x1.5aeaee345d04ep-68}, {0x1.3ffc7f3cfa222p-13, 0x1.b61cd8456449dp-67, 0x1.ffec01p-1, 0x1.cd9b82452b0eap-13, 0x1.562dcc044f7b1p-67}, {0x1.8001ff57f71ffp-13, -0x1.9f277309d0bc4p-67, 0x1.ffe801p-1, 0x1.14fa4bbfda6edp-12, -0x1.296f743dffc8dp-67}, {0x1.bff87dd6e942fp-13, -0x1.501b1c2b6f43fp-67, 0x1.ffe402p-1, 0x1.431ba7759d6ebp-12, 0x1.96aff97160e09p-67}, {0x1.fffffdffep-13, 0x1.000fffffefffp-72, 0x1.ffe002p-1, 0x1.7148eab8c7863p-12, 0x1.8d1a70a989346p-66}, {0x1.1ffc3e0c6281ep-12, -0x1.5c9934bacf538p-66, 0x1.ffdc03p-1, 0x1.9f6afee927edap-12, 0x1.1a07a42134f5bp-67}, {0x1.4000fe33da8fcp-12, 0x1.5ce557df8572ap-66, 0x1.ffd803p-1, 0x1.cd98fad7fc194p-12, 0x1.4a28b4d5b941fp-66}, {0x1.5ffe3d1943b1ap-12, -0x1.43bf0fe3df757p-68, 0x1.ffd404p-1, 0x1.fbbbc788bd7dbp-12, -0x1.a1ecb71fc14d1p-66}, {0x1.8003fd5fb8feap-12, -0x1.e4ecc26860443p-66, 0x1.ffd004p-1, 0x1.14f53e1480736p-11, -0x1.be81d6fe3c64bp-67}, {0x1.a0023c2a16afep-12, 0x1.29203e5f85179p-66, 0x1.ffcc05p-1, 0x1.2c0700aff3916p-11, -0x1.7e0b0a3055e38p-65}, {0x1.c000fadb6d0f6p-12, -0x1.264bb4d4e42a7p-66, 0x1.ffc806p-1, 0x1.4318f1683f912p-11, -0x1.41125302f1e13p-66}, {0x1.e0003976bb20dp-12, -0x1.b6c63d3b7721ap-68, 0x1.ffc407p-1, 0x1.5a2b103e1cccdp-11, -0x1.9c7a50b63aa7ep-68}, {0x1.fffff7ffp-12, 0x1.001fffff7ffp-66, 0x1.ffc008p-1, 0x1.713d5d3243a2ep-11, 0x1.cffa276bae12fp-65}, {0x1.10001b3b9d706p-11, -0x1.ac15ab5a607dcp-66, 0x1.ffbc09p-1, 0x1.884fd8456c763p-11, -0x1.15393c2de35d6p-68}, {0x1.20007a7135875p-11, 0x1.f77da3d595d5ep-68, 0x1.ffb80ap-1, 0x1.9f6281784fadcp-11, 0x1.b945ee8a950fp-66}, {0x1.300119a1c7f6bp-11, 0x1.34c29c41034b1p-65, 0x1.ffb40bp-1, 0x1.b67558cba5b51p-11, 0x1.9b0f7d5ba9b96p-68}, {0x1.4001f8ced47c6p-11, -0x1.6332077dff83p-65, 0x1.ffb00cp-1, 0x1.cd885e4026fbdp-11, 0x1.cd357e7f321a1p-65}, {0x1.4fff16a9be3a9p-11, 0x1.684120d59b25ap-67, 0x1.ffac0ep-1, 0x1.e495cb9252742p-11, 0x1.4073ecda6d7b7p-65}, {0x1.600075c43a46cp-11, 0x1.1d2c5343832a1p-65, 0x1.ffa80fp-1, 0x1.fba92d3fc7f97p-11, -0x1.d0c0c2d8d7106p-65}, {0x1.6ffe136f8e666p-11, 0x1.159ec14ef6c54p-66, 0x1.ffa411p-1, 0x1.095b7b5aa1f56p-10, -0x1.db7ef19c74ad4p-64}, {0x1.7ffff27d78001p-11, 0x1.b3115ff661d2bp-65, 0x1.ffa012p-1, 0x1.14e55a4f47745p-10, 0x1.3953723c61a5cp-64}, {0x1.8ffe0fff33381p-11, -0x1.c39c4ae285513p-65, 0x1.ff9c14p-1, 0x1.206c6d1d1df2fp-10, 0x1.dc61965f32a93p-65}, {0x1.a0006f0688c6p-11, 0x1.ce4e54f30ae24p-66, 0x1.ff9815p-1, 0x1.2bf67a311edcbp-10, -0x1.5801b43c1ca0dp-64}, {0x1.afff0c64a82cfp-11, 0x1.f6b790232870fp-66, 0x1.ff9417p-1, 0x1.377dbb137e3cp-10, 0x1.f0791610bacfp-66}, {0x1.c001eb6b6875dp-11, 0x1.c0567de77cbc7p-68, 0x1.ff9018p-1, 0x1.4307f6484b502p-10, -0x1.c3e70188b37e3p-64}, {0x1.d00108abe9823p-11, -0x1.aebfb9904e456p-66, 0x1.ff8c1ap-1, 0x1.4e8f6540a3fc3p-10, -0x1.f1b9086283c46p-64}, {0x1.e00065d7d9051p-11, -0x1.5d5f8f4a5b976p-68, 0x1.ff881cp-1, 0x1.5a16eb41a0f0ep-10, 0x1.f9d41d99af255p-64}, {0x1.f00002f0b62p-11, 0x1.1462dfc0657c5p-67, 0x1.ff841ep-1, 0x1.659e884b9e38cp-10, 0x1.1a03298288426p-66}, {0x1.ffffdff800008p-11, 0x1.ffffdff800008p-71, 0x1.ff802p-1, 0x1.71263c5ef7e04p-10, 0x1.288c11a74fc32p-64}, {0x1.07fffe779afp-10, 0x1.2c6d603f8cfe2p-67, 0x1.ff7c22p-1, 0x1.7cae077c09f63p-10, -0x1.3afdeb3cf5486p-64}, {0x1.10002cebeb81fp-10, 0x1.fdae868575fdfp-64, 0x1.ff7824p-1, 0x1.8835e9a3308b5p-10, 0x1.360a818e955aep-64}, {0x1.18007b59b15edp-10, 0x1.f13d75e6ad534p-64, 0x1.ff7426p-1, 0x1.93bde2d4c7b2dp-10, -0x1.70c8c3a9c376cp-64}, {0x1.2000e9c1ac355p-10, -0x1.3b2dac38de8a2p-65, 0x1.ff7028p-1, 0x1.9f45f3112b81cp-10, -0x1.1e2ccb3307d2cp-64}, {0x1.27ff76fc707a5p-10, -0x1.72c68e4171f87p-70, 0x1.ff6c2bp-1, 0x1.aacb36da463f7p-10, -0x1.a3d5e7a67d81dp-64}, {0x1.3000255311616p-10, -0x1.07f200a56c0d9p-64, 0x1.ff682dp-1, 0x1.b653752791d5ep-10, 0x1.49eeaee3e7e22p-64}, {0x1.3800f3a62641ep-10, 0x1.e46064e7e564ap-64, 0x1.ff642fp-1, 0x1.c1dbca80be495p-10, -0x1.2bad1331ec7f7p-64}, {0x1.3fffe0b63c00fp-10, 0x1.1c12ce2294ad1p-64, 0x1.ff6032p-1, 0x1.cd61535665a58p-10, -0x1.e3b9cbe22421ep-65}, {0x1.4800eefc7497bp-10, 0x1.301f5325738d3p-64, 0x1.ff5c34p-1, 0x1.d8e9d6c2a2198p-10, -0x1.020e70a4fe47p-65}, {0x1.50001bf12820cp-10, 0x1.7838fa4800bd8p-65, 0x1.ff5837p-1, 0x1.e46f8da086d2ep-10, -0x1.3b01368943604p-65}, {0x1.57ff68d548c65p-10, -0x1.a8742af1442f9p-64, 0x1.ff543ap-1, 0x1.eff55b8031c2ap-10, 0x1.ba7b9ae7bd98bp-64}, {0x1.6000d709d22d2p-10, -0x1.c82f0ab62b5d9p-64, 0x1.ff503cp-1, 0x1.fb7e2408d562ep-10, -0x1.5dcbd30b0022cp-64}, {0x1.680063d70d51cp-10, -0x1.da2a40827aef3p-64, 0x1.ff4c3fp-1, 0x1.03820ff972b21p-9, 0x1.3dda8489194dfp-65}, {0x1.70001095f3c04p-10, 0x1.2b39520716f95p-64, 0x1.ff4842p-1, 0x1.0945196fe7ae9p-9, -0x1.92d80f790e27dp-64}, {0x1.77ffdd4744d93p-10, -0x1.8460e33c618c3p-65, 0x1.ff4445p-1, 0x1.0f082e67f79acp-9, -0x1.2d7918e1c1793p-63}, {0x1.7fffc9ebc002ep-10, -0x1.7ba8099ffaa38p-64, 0x1.ff4048p-1, 0x1.14cb4ee1d06b9p-9, -0x1.3d0449b698d96p-63}, {0x1.87ffd68424a9bp-10, -0x1.3533d48c46104p-65, 0x1.ff3c4bp-1, 0x1.1a8e7adda017p-9, -0x1.05480904c87d1p-64}, {0x1.90000311324p-10, 0x1.2c953c80e6224p-65, 0x1.ff384ep-1, 0x1.2051b25b94943p-9, -0x1.b10b812d27a9bp-63}, {0x1.98004f93a83e3p-10, -0x1.ac0592817deabp-65, 0x1.ff3451p-1, 0x1.2614f55bdbdb3p-9, 0x1.5f1b3571315bp-63}, {0x1.a000bc0c46228p-10, -0x1.5ff9036a88b81p-64, 0x1.ff3054p-1, 0x1.2bd843dea3e56p-9, -0x1.3aaab92869c01p-65}, {0x1.a7ff46d373617p-10, -0x1.7cfcbf2bb73e6p-66, 0x1.ff2c58p-1, 0x1.319a2bf6b7476p-9, 0x1.87699b4e05189p-63}, {0x1.affff3329ba03p-10, -0x1.c5ed5170ad8fbp-64, 0x1.ff285bp-1, 0x1.375d917c27e0bp-9, 0x1.f5df5dccce818p-65}, {0x1.b800bf8a2a33cp-10, 0x1.1fbb5daedaefp-64, 0x1.ff245ep-1, 0x1.3d210284a323cp-9, -0x1.f578a6f395acdp-64}, {0x1.bfffaa1a7c073p-10, 0x1.683d25ccd5612p-66, 0x1.ff2062p-1, 0x1.42e30d1a4b89ep-9, 0x1.c35ac071e3f6p-63}, {0x1.c800b65d11787p-10, -0x1.1493791cd773cp-64, 0x1.ff1c65p-1, 0x1.48a6952683107p-9, -0x1.d37a56220787dp-68}, {0x1.cfffe0c9e1e0fp-10, 0x1.8dc34eed35cccp-65, 0x1.ff1869p-1, 0x1.4e68b6ba7e475p-9, -0x1.89323eb9ff693p-63}, {0x1.d7ff2b220f043p-10, -0x1.118eeba3b048fp-64, 0x1.ff146dp-1, 0x1.542ae3cc7690dp-9, -0x1.ab0ef1276d28p-66}, {0x1.e0009746c8165p-10, -0x1.4ffeb5e58bcf5p-66, 0x1.ff107p-1, 0x1.59ee8e5e2f905p-9, 0x1.f466a629b4413p-63}, {0x1.e800217fef612p-10, -0x1.fda2bc16c43c6p-64, 0x1.ff0c74p-1, 0x1.5fb0d26f8e1c8p-9, 0x1.971f054294b07p-63}, {0x1.efffcba6b102bp-10, -0x1.0c5a0cb90ea7cp-64, 0x1.ff0878p-1, 0x1.657321ff7367fp-9, -0x1.13863f56c3cbap-63}, {0x1.f7ff95bbcc2bp-10, 0x1.b86e5ba661b1dp-66, 0x1.ff047cp-1, 0x1.6b357d0e0d55p-9, 0x1.570efd19d249fp-63}, {0x1.ffff7fc0001p-10, 0x1.ffff7fc0001p-64, 0x1.ff008p-1, 0x1.70f7e39b89c76p-9, 0x1.d4c4a05fc792p-64}, {0x1.03ffc4da05f6dp-9, 0x1.cce7f6f79c117p-65, 0x1.fefc84p-1, 0x1.76ba55a816a3bp-9, -0x1.92f8c9f16636dp-63}, {0x1.07ffd9cc5782ep-9, -0x1.f1d10b8e6e5f1p-63, 0x1.fef888p-1, 0x1.7c7cd333e1cf9p-9, -0x1.4a74c729efcc7p-64}, {0x1.0bfffeb7545p-9, 0x1.a51bf97ef23a1p-66, 0x1.fef48cp-1, 0x1.823f5c3f1931dp-9, 0x1.e6be82f9936a4p-63}, {0x1.1000339b5c053p-9, 0x1.c1030b552a0e6p-66, 0x1.fef09p-1, 0x1.8801f0c9eab26p-9, 0x1.fb21627ede9cap-64}, {0x1.14007878ce4c5p-9, -0x1.a09be39ba21a6p-63, 0x1.feec94p-1, 0x1.8dc490d4843a2p-9, 0x1.1df60724d15b3p-65}, {0x1.17ffcc37bdf54p-9, -0x1.8a096f691bb04p-63, 0x1.fee899p-1, 0x1.9385ca40a2f84p-9, 0x1.b2d801a1718c5p-64}, {0x1.1c00310521d0bp-9, -0x1.1d7bfb3ad6193p-65, 0x1.fee49dp-1, 0x1.99488148735bdp-9, 0x1.4bca52ef093abp-63}, {0x1.1fffa4acbe104p-9, 0x1.016c3b6e2f2cbp-65, 0x1.fee0a2p-1, 0x1.9f09d1ac5f8c3p-9, -0x1.178499ab07001p-63}, {0x1.2400296b91eb5p-9, 0x1.fa355249a451dp-63, 0x1.fedca6p-1, 0x1.a4cc9fb21e4e2p-9, -0x1.f6c361e551821p-63}, {0x1.27ffbcfd58d8cp-9, 0x1.157f10c7c3624p-68, 0x1.fed8abp-1, 0x1.aa8e070e8f496p-9, 0x1.ddf7110a08fbap-64}, {0x1.2c0061af1b36ap-9, -0x1.f3ff38a575161p-63, 0x1.fed4afp-1, 0x1.b050ec12f3f4cp-9, 0x1.9f4f4b855ee07p-63}, {0x1.3000152c8b00ep-9, -0x1.660f1b16c5ff9p-67, 0x1.fed0b4p-1, 0x1.b6126a68a11c6p-9, -0x1.111e0077b33e7p-63}, {0x1.33ffd89e5d7fp-9, 0x1.683f53ed9b1bfp-63, 0x1.feccb9p-1, 0x1.bbd3f439bfe2ap-9, 0x1.129f92e605dffp-63}, {0x1.37ffac04f22dcp-9, -0x1.ff31042b59debp-65, 0x1.fec8bep-1, 0x1.c19589867e17bp-9, -0x1.990d948d9f518p-63}, {0x1.3bff8f60a88cbp-9, 0x1.a9c8e5d3d5357p-63, 0x1.fec4c3p-1, 0x1.c7572a4f098c8p-9, 0x1.d45d2d574df26p-63}, {0x1.3fff82b1e01e9p-9, 0x1.e4b221ffaa82bp-63, 0x1.fec0c8p-1, 0x1.cd18d69390137p-9, -0x1.2e623eb44a04bp-63}, {0x1.43ff85f8f869p-9, 0x1.7eec78527601bp-64, 0x1.febccdp-1, 0x1.d2da8e543f7f9p-9, 0x1.65d0701b3da64p-63}, {0x1.47ff993650f49p-9, 0x1.5edc71502ce2ep-63, 0x1.feb8d2p-1, 0x1.d89c519145a56p-9, -0x1.d56cec800da7fp-63}, {0x1.4bffbc6a494cep-9, 0x1.8559d0be24239p-63, 0x1.feb4d7p-1, 0x1.de5e204ad05a2p-9, -0x1.b1d7a3b123d4ep-63}, {0x1.4fffef9541008p-9, 0x1.9a7ef2ecdf10ap-63, 0x1.feb0dcp-1, 0x1.e41ffa810d745p-9, -0x1.a993481e299bdp-65}, {0x1.540032b797a1p-9, 0x1.64cc12b8c075ap-64, 0x1.feace1p-1, 0x1.e9e1e0342acb8p-9, 0x1.7b883d781fdd4p-65}, {0x1.57ff8479392dcp-9, -0x1.a4e312ac18b3fp-63, 0x1.fea8e7p-1, 0x1.efa25f17bb226p-9, 0x1.c71d718c58d2ap-67}, {0x1.5bffe78769513p-9, -0x1.581c4c9f08c6bp-63, 0x1.fea4ecp-1, 0x1.f5645bc23f8e1p-9, 0x1.cee36238719a1p-64}, {0x1.60005a8e171p-9, -0x1.b7efa5ad99dd9p-63, 0x1.fea0f1p-1, 0x1.fb2663ea2db85p-9, -0x1.552e795894889p-63}, {0x1.63ffdc2925e68p-9, 0x1.f28eb6b7323b9p-67, 0x1.fe9cf7p-1, 0x1.0073829d38167p-8, -0x1.c5c6221acedf4p-67}, {0x1.68006f1dea581p-9, -0x1.b73ff0c3d12ebp-64, 0x1.fe98fcp-1, 0x1.0354922d6c2aep-8, -0x1.62a9bee9f7522p-63}, {0x1.6c00109fc9389p-9, -0x1.8ce1845671c55p-63, 0x1.fe9502p-1, 0x1.0634ee4f15805p-8, -0x1.2973908f16839p-62}, {0x1.6fffc2139e077p-9, 0x1.f894365aa51ffp-63, 0x1.fe9108p-1, 0x1.0915502cec9cfp-8, 0x1.c26341891fb94p-62}, {0x1.73ff8379c8263p-9, 0x1.9a87c6285fd65p-64, 0x1.fe8d0ep-1, 0x1.0bf5b7c7085fbp-8, -0x1.a6ae1b5a0fc18p-62}, {0x1.7800564b30de8p-9, 0x1.4df109a61f504p-66, 0x1.fe8913p-1, 0x1.0ed6de4f57c53p-8, 0x1.04149239acf29p-62}, {0x1.7c00379b26a2p-9, 0x1.630c806af2e59p-63, 0x1.fe8519p-1, 0x1.11b75163b2bbdp-8, 0x1.9ea9a295d7e25p-62}, {0x1.800028de90034p-9, 0x1.6d6c848d15831p-66, 0x1.fe811fp-1, 0x1.1497ca3496fddp-8, 0x1.34ca92074b5e6p-65}, {0x1.84002a15cc6f7p-9, 0x1.7bac132085b33p-64, 0x1.fe7d25p-1, 0x1.177848c21b6c1p-8, -0x1.fb96ec6aab17cp-65}, {0x1.88003b413b56dp-9, 0x1.9538b4c5c9dd1p-63, 0x1.fe792bp-1, 0x1.1a58cd0c56e8p-8, 0x1.c91427cdc0a92p-62}, {0x1.8c005c613c2cap-9, -0x1.d63fed50775dep-65, 0x1.fe7531p-1, 0x1.1d3957136053bp-8, 0x1.d5b40059cf7f2p-62}, {0x1.8fff8be5921a4p-9, -0x1.0ccf5e333a9e9p-66, 0x1.fe7138p-1, 0x1.20192d9cce658p-8, -0x1.0ef8613c770a8p-66}, {0x1.93ffccebd1cd1p-9, 0x1.20f4111deaf9dp-63, 0x1.fe6d3ep-1, 0x1.22f9c31c46ecdp-8, 0x1.e687045f12bdep-63}, {0x1.98001de7c1c1cp-9, -0x1.1cafe805939e2p-64, 0x1.fe6944p-1, 0x1.25da5e58d2075p-8, -0x1.2780ef22d42f2p-64}, {0x1.9c007ed9c1775p-9, 0x1.14fc8cb270e7dp-63, 0x1.fe654ap-1, 0x1.28baff5286991p-8, 0x1.662631716e756p-63}, {0x1.9fffee218700ap-9, -0x1.b534bb12ca226p-66, 0x1.fe6151p-1, 0x1.2b9aecc935e56p-8, -0x1.bc5d90b8f1d66p-62}, {0x1.a4006efcc0fcp-9, -0x1.2524335057878p-63, 0x1.fe5d57p-1, 0x1.2e7b993c10914p-8, 0x1.f628411d6d3ap-62}, {0x1.a7fffe26792p-9, 0x1.b488567e6d925p-65, 0x1.fe595ep-1, 0x1.315b9229310e3p-8, 0x1.32c89a9297db7p-63}, {0x1.abff9d3fb81fp-9, -0x1.fd773e728eb87p-64, 0x1.fe5565p-1, 0x1.343b90d0f3d29p-8, -0x1.2bee748b1f835p-63}, {0x1.b0004df9934bdp-9, 0x1.8395f5bc85576p-63, 0x1.fe516bp-1, 0x1.371c4e797a6cdp-8, 0x1.cb72f84415034p-63}, {0x1.b4000cf700f85p-9, 0x1.e1f0223699c58p-64, 0x1.fe4d72p-1, 0x1.39fc5898377e4p-8, -0x1.3ca140097dc4fp-66}, {0x1.b7ffdbe513729p-9, -0x1.98e4f9b1fb184p-63, 0x1.fe4979p-1, 0x1.3cdc6871db5f2p-8, -0x1.9345680cc160ap-62}, {0x1.bbffbac42a095p-9, 0x1.24156f86a31c8p-63, 0x1.fe458p-1, 0x1.3fbc7e067ce68p-8, 0x1.d359695e8eea6p-62}, {0x1.bfffa994a40e9p-9, -0x1.a4362c7f90a32p-63, 0x1.fe4187p-1, 0x1.429c995632ec3p-8, 0x1.b08bee8756463p-62}, {0x1.c3ffa856e0d6fp-9, 0x1.3f4bc4afbd407p-63, 0x1.fe3d8ep-1, 0x1.457cba6114486p-8, -0x1.16f1c6f118e6ap-64}, {0x1.c7ffb70b3fba6p-9, -0x1.f7754e3b6281cp-64, 0x1.fe3995p-1, 0x1.485ce12737d3cp-8, -0x1.9831ce103ecbep-65}, {0x1.cbffd5b220138p-9, -0x1.13a306aace17bp-63, 0x1.fe359cp-1, 0x1.4b3d0da8b467ap-8, -0x1.33f8c2e5f53b8p-66}, {0x1.d000044be1401p-9, -0x1.b36474bb14031p-63, 0x1.fe31a3p-1, 0x1.4e1d3fe5a0dddp-8, 0x1.19489e0a375efp-64}, {0x1.d40042d8e2a0bp-9, 0x1.29a5e1f98912bp-64, 0x1.fe2daap-1, 0x1.50fd77de1410bp-8, -0x1.9fbaf9e3baa81p-63}, {0x1.d7ff8f80a9f8ap-9, 0x1.20c9a519465a7p-65, 0x1.fe29b2p-1, 0x1.53dcfc3dacbd4p-8, 0x1.ca9cdb11dc86bp-64}, {0x1.dbffedf145dcap-9, 0x1.393e42134e08fp-64, 0x1.fe25b9p-1, 0x1.56bd3fac00842p-8, -0x1.8e164f95b2c0ap-62}, {0x1.e0005c5640109p-9, 0x1.dfe0bece3a625p-63, 0x1.fe21cp-1, 0x1.599d88d61f942p-8, -0x1.3e38aab655813p-62}, {0x1.e3ffd8cb12e3p-9, -0x1.1f2470b617c04p-64, 0x1.fe1dc8p-1, 0x1.5c7d1e6354942p-8, -0x1.672c401514e5bp-62}, {0x1.e8006715e3a4bp-9, -0x1.32fa14c2a3be1p-64, 0x1.fe19cfp-1, 0x1.5f5d7303dd44ap-8, 0x1.9de715026a889p-64}, {0x1.ec0003694404p-9, 0x1.72f7a4b5765adp-63, 0x1.fe15d7p-1, 0x1.623d1404c6e1bp-8, -0x1.5ed53db89a97ap-62}, {0x1.efffafaa784c9p-9, -0x1.6175d77b00108p-65, 0x1.fe11dfp-1, 0x1.651cbabef46dbp-8, 0x1.d58bed52db82ep-64}, {0x1.f4006dced3bf7p-9, 0x1.7e9e6780b774p-63, 0x1.fe0de6p-1, 0x1.67fd20910e165p-8, -0x1.1478031fd6a56p-63}, {0x1.f80039f0d1269p-9, -0x1.f78b02ffd3efdp-63, 0x1.fe09eep-1, 0x1.6adcd2bf792abp-8, 0x1.1800de5a06799p-62}, {0x1.fc001601c028fp-9, 0x1.373040c3f2eaep-65, 0x1.fe05f6p-1, 0x1.6dbc8aa76c9d9p-8, -0x1.49107de58e8a5p-62}, {0x1.00000101p-8, 0x1.0100000101p-64, 0x1.fe01fep-1, 0x1.709c4848ff3ddp-8, -0x1.f86284455f0dfp-62}, };
#define LOG2_OVERFLOW_GUARANTEED 1025.
#define POW_OVERFLOW_GUARANTEED 1025.
#define POW_1_GUARANTEED 0x1p-55
#define POW_UNDERFLOW_GUARANTEED -1100.
static const double lgehi = 0x1.7154768p0, lgelo = -0x2.D47D01E8882F0p-28;
static const double lge = 0x1.71547652B82FE1777D0p0;
static const double Exp2Table[][2] = { {0x0p+0, 0x1p+0}, {0x1.000002006be8p-8, 0x1.00b1afa70ff17p+0}, {0x1.00000278a56cp-7, 0x1.0163daa324ff2p+0}, {0x1.80000052e12p-7, 0x1.0216814423fd2p+0}, {0x1.000000b822fap-6, 0x1.02c9a3e97c1e4p+0}, {0x1.40000009f2ep-6, 0x1.037d42e137b27p+0}, {0x1.8000018938b2p-6, 0x1.04315e8b3c115p+0}, {0x1.c000004b5a74p-6, 0x1.04e5f7303a36fp+0}, {0x1.0000000b3ce6p-5, 0x1.059b0d3198058p+0}, {0x1.20000036d022p-5, 0x1.0650a0e4f96aap+0}, {0x1.4000001213b8p-5, 0x1.0706b29e466bbp+0}, {0x1.60000053dd6p-5, 0x1.07bd42b9099ep+0}, {0x1.8000004f61bfp-5, 0x1.087451892075bp+0}, {0x1.a000003a9d64p-5, 0x1.092bdf67b12a8p+0}, {0x1.c00000e28345p-5, 0x1.09e3ecb187ccbp+0}, {0x1.e000005ccf04p-5, 0x1.0a9c79b40b8a8p+0}, {0x1.00000020b2a88p-4, 0x1.0b5586d11340ap+0}, {0x1.1000000a2dbd8p-4, 0x1.0c0f145ebcfc3p+0}, {0x1.2000001591738p-4, 0x1.0cc922b81fa4ap+0}, {0x1.300000127c128p-4, 0x1.0d83b2346db19p+0}, {0x1.40000001ac3bp-4, 0x1.0e3ec32d50afap+0}, {0x1.50000000e57e8p-4, 0x1.0efa55fe05226p+0}, {0x1.60000013bce1p-4, 0x1.0fb66b00d5876p+0}, {0x1.70000000136cp-4, 0x1.1073028d73192p+0}, {0x1.8000005a20d3p-4, 0x1.11301d05505f2p+0}, {0x1.900000053835p-4, 0x1.11edbab6209c3p+0}, {0x1.a000000c21f28p-4, 0x1.12abdc07537b2p+0}, {0x1.b000000715768p-4, 0x1.136a814f74dp+0}, {0x1.c0000006f2418p-4, 0x1.1429aaeae5f8cp+0}, {0x1.d000001a57828p-4, 0x1.14e959362f13ep+0}, {0x1.e000000cae79p-4, 0x1.15a98c8af1704p+0}, {0x1.f0000045e3cep-4, 0x1.166a454a6734ap+0}, {0x1.0000000383cecp-3, 0x1.172b83c82a1c7p+0}, {0x1.0800001438468p-3, 0x1.17ed486b46247p+0}, {0x1.10000002d00dp-3, 0x1.18af93890d45fp+0}, {0x1.1800000c1682cp-3, 0x1.197265849c983p+0}, {0x1.20000017a069cp-3, 0x1.1a35beb93e6cep+0}, {0x1.2800000cb57fcp-3, 0x1.1af99f82703adp+0}, {0x1.30000032ca86p-3, 0x1.1bbe084526787p+0}, {0x1.3800000a24a88p-3, 0x1.1c82f9537bd11p+0}, {0x1.40000011652f8p-3, 0x1.1d4873183994p+0}, {0x1.480000077f894p-3, 0x1.1e0e75ebfdd9fp+0}, {0x1.500000246a5ecp-3, 0x1.1ed5023356925p+0}, {0x1.5800000d3437p-3, 0x1.1f9c1844d5eep+0}, {0x1.6000002d6a13cp-3, 0x1.2063b88a9792cp+0}, {0x1.6800000135064p-3, 0x1.212be357a8c02p+0}, {0x1.7000000af236p-3, 0x1.21f49918f0c89p+0}, {0x1.7800000ddc324p-3, 0x1.22bdda28ee532p+0}, {0x1.80000027763f8p-3, 0x1.2387a6eb3ae9ap+0}, {0x1.88000005b9428p-3, 0x1.2451ffb8b2383p+0}, {0x1.9000000cb401cp-3, 0x1.251ce4fc6d00ep+0}, {0x1.98000011eb0a4p-3, 0x1.25e85713b531p+0}, {0x1.a000000cc720cp-3, 0x1.26b4565f6e137p+0}, {0x1.a800000515df8p-3, 0x1.2780e3426027p+0}, {0x1.b000000ccc9bp-3, 0x1.284dfe209ecfdp+0}, {0x1.b8000019bdbap-3, 0x1.291ba75bb25abp+0}, {0x1.c0000004cde7cp-3, 0x1.29e9df5279f0bp+0}, {0x1.c800000919978p-3, 0x1.2ab8a66dfc783p+0}, {0x1.d000000cfdaf4p-3, 0x1.2b87fd0efebe8p+0}, {0x1.d8000005887fp-3, 0x1.2c57e39801b01p+0}, {0x1.e000001fea1ep-3, 0x1.2d285a7180f23p+0}, {0x1.e800000c9e278p-3, 0x1.2df961f78b7a9p+0}, {0x1.f0000001fc51p-3, 0x1.2ecafa94170d1p+0}, {0x1.f80000019e5acp-3, 0x1.2f9d24ac031acp+0}, {0x1.000000039d02cp-2, 0x1.306fe0a3da103p+0}, {0x1.040000084e494p-2, 0x1.31432ee0a28cp+0}, {0x1.0800000bf724p-2, 0x1.32170fc7482c4p+0}, {0x1.0c000002b1b18p-2, 0x1.32eb83bb1dec9p+0}, {0x1.1000000cd9c0cp-2, 0x1.33c08b28eec07p+0}, {0x1.1400000505e38p-2, 0x1.3496266f4c3c6p+0}, {0x1.18000000237fp-2, 0x1.356c55f9316e5p+0}, {0x1.1c000006b6204p-2, 0x1.36431a2f51599p+0}, {0x1.200000051ad3p-2, 0x1.371a7374bdcfbp+0}, {0x1.24000009d994ep-2, 0x1.37f26233fbc7ep+0}, {0x1.28000002c2c5p-2, 0x1.38cae6d0f32b4p+0}, {0x1.2c00000c8eb8ap-2, 0x1.39a401b9be8e5p+0}, {0x1.300000140e2d8p-2, 0x1.3a7db3529ef57p+0}, {0x1.34000004ba08ap-2, 0x1.3b57fbffc9197p+0}, {0x1.380000146a8dcp-2, 0x1.3c32dc3599392p+0}, {0x1.3c000003cefdep-2, 0x1.3d0e544faf56dp+0}, {0x1.40000002a7356p-2, 0x1.3dea64c1b56c2p+0}, {0x1.440000097819ep-2, 0x1.3ec70df3d02a8p+0}, {0x1.480000054f35p-2, 0x1.3fa4504bee17dp+0}, {0x1.4c0000013328p-2, 0x1.40822c36bca5bp+0}, {0x1.50000005ea89ap-2, 0x1.4160a220bc5bfp+0}, {0x1.5400001a036c2p-2, 0x1.423fb27641088p+0}, {0x1.5800000234f8cp-2, 0x1.431f5d95861bdp+0}, {0x1.5c0000052762cp-2, 0x1.43ffa3f96cf9cp+0}, {0x1.600000003a7aap-2, 0x1.44e08606256fp+0}, {0x1.640000033ef46p-2, 0x1.45c2042b345e2p+0}, {0x1.68000007c88acp-2, 0x1.46a41ed388948p+0}, {0x1.6c00000b3ba4ap-2, 0x1.4786d66b30ad9p+0}, {0x1.7000000e3699ap-2, 0x1.486a2b5f3cad8p+0}, {0x1.740000076ef96p-2, 0x1.494e1e1ad31cep+0}, {0x1.78000007f7b2p-2, 0x1.4a32af0f45232p+0}, {0x1.7c000002eba2ep-2, 0x1.4b17dea7830c6p+0}, {0x1.800000036178ep-2, 0x1.4bfdad542520cp+0}, {0x1.840000044522p-2, 0x1.4ce41b8272635p+0}, {0x1.88000004b65dcp-2, 0x1.4dcb29a0ee638p+0}, {0x1.8c0000040b6dap-2, 0x1.4eb2d81e75559p+0}, {0x1.9000000901b68p-2, 0x1.4f9b276bde95bp+0}, {0x1.94000005a887ap-2, 0x1.508417f59d142p+0}, {0x1.98000002beea4p-2, 0x1.516daa2d96f0ep+0}, {0x1.9c00000b659b6p-2, 0x1.5257de8691237p+0}, {0x1.a0000001fe31cp-2, 0x1.5342b56a4a222p+0}, {0x1.a400000079cacp-2, 0x1.542e2f4f86ddfp+0}, {0x1.a800000347522p-2, 0x1.551a4ca69aecp+0}, {0x1.ac0000057f2eap-2, 0x1.56070ddfd6d73p+0}, {0x1.b00000082fdaep-2, 0x1.56f4736d39096p+0}, {0x1.b4000006e9be4p-2, 0x1.57e27dbfc8412p+0}, {0x1.b80000059f30cp-2, 0x1.58d12d4acc6abp+0}, {0x1.bc000006196bep-2, 0x1.59c082815dec2p+0}, {0x1.c0000000bbacap-2, 0x1.5ab07dd4b14d7p+0}, {0x1.c4000004077c6p-2, 0x1.5ba11fbb7a587p+0}, {0x1.c8000002f06c2p-2, 0x1.5c9268a645f3fp+0}, {0x1.cc00000cac3c2p-2, 0x1.5d84590c9845bp+0}, {0x1.d000000631f8cp-2, 0x1.5e76f15c4a52p+0}, {0x1.d400000c5f88ep-2, 0x1.5f6a3210c02fdp+0}, {0x1.d800000648fe2p-2, 0x1.605e1b98ed86bp+0}, {0x1.dc00000480196p-2, 0x1.6152ae6df2f9fp+0}, {0x1.e0000013fb67cp-2, 0x1.6247eb0870165p+0}, {0x1.e4000001864acp-2, 0x1.633dd1d1f079bp+0}, {0x1.e8000001fd876p-2, 0x1.6434634d470cfp+0}, {0x1.ec000001eb9e2p-2, 0x1.652b9fec3fd71p+0}, {0x1.f0000005a7522p-2, 0x1.66238826b1001p+0}, {0x1.f4000007ccecep-2, 0x1.671c1c7268aap+0}, {0x1.f8000004d45fep-2, 0x1.68155d45f7f22p+0}, {0x1.fc00000d00828p-2, 0x1.690f4b1d16d2p+0}, {0x1.000000006d6f2p-1, 0x1.6a09e668295fdp+0}, {0x1.020000006f2eep-1, 0x1.6b052fa788183p+0}, {0x1.0400000205a67p-1, 0x1.6c012751bcc3cp+0}, {0x1.06000000bb46ap-1, 0x1.6cfdcddda3ee1p+0}, {0x1.08000006234b3p-1, 0x1.6dfb23c95c28dp+0}, {0x1.0a000002360edp-1, 0x1.6ef92986ace76p+0}, {0x1.0c00000224115p-1, 0x1.6ff7df962a4e4p+0}, {0x1.0e0000007f94fp-1, 0x1.70f7466f82a2dp+0}, {0x1.100000056865ep-1, 0x1.71f75e917b5b8p+0}, {0x1.12000003209b2p-1, 0x1.72f828703f1d1p+0}, {0x1.1400000084352p-1, 0x1.73f9a48a9aabp+0}, {0x1.16000003ce3c2p-1, 0x1.74fbd35f68af9p+0}, {0x1.18000005a047fp-1, 0x1.75feb566ffb92p+0}, {0x1.1a000003a11e5p-1, 0x1.77024b1c8e947p+0}, {0x1.1c0000087d61bp-1, 0x1.7806950238385p+0}, {0x1.1e00000132e4ap-1, 0x1.790b938b5e765p+0}, {0x1.20000002ed0b2p-1, 0x1.7a1147402f7a4p+0}, {0x1.220000021e1cap-1, 0x1.7b17b09883363p+0}, {0x1.240000041fbb2p-1, 0x1.7c1ed0152b5cdp+0}, {0x1.2600000191ef4p-1, 0x1.7d26a630c7d55p+0}, {0x1.2800000294a37p-1, 0x1.7e2f336e4ab7p+0}, {0x1.2a0000002d5e9p-1, 0x1.7f38784933d2cp+0}, {0x1.2c000000368bfp-1, 0x1.80427543fe015p+0}, {0x1.2e00000e5d239p-1, 0x1.814d2ae48e817p+0}, {0x1.30000000aa7bep-1, 0x1.82589995260c8p+0}, {0x1.32000000c6923p-1, 0x1.8364c1ebfc43bp+0}, {0x1.34000007a46eep-1, 0x1.8471a46641527p+0}, {0x1.360000000875ap-1, 0x1.857f4179fa28p+0}, {0x1.38000005c1f5bp-1, 0x1.868d99b754833p+0}, {0x1.3a000002822d9p-1, 0x1.879cad946eb95p+0}, {0x1.3c0000054b58fp-1, 0x1.88ac7d9b76eb5p+0}, {0x1.3e000001d6803p-1, 0x1.89bd0a48804d3p+0}, {0x1.400000046b3ep-1, 0x1.8ace542506b0dp+0}, {0x1.420000022acb8p-1, 0x1.8be05bae8acd9p+0}, {0x1.4400000110a71p-1, 0x1.8cf3216be6ce3p+0}, {0x1.460000008527ep-1, 0x1.8e06a5e0ce2dcp+0}, {0x1.4800000c48632p-1, 0x1.8f1ae997fa64dp+0}, {0x1.4a0000019c4d6p-1, 0x1.902fed036228ap+0}, {0x1.4c0000090e1a2p-1, 0x1.9145b0be0b47ap+0}, {0x1.4e00000749b6dp-1, 0x1.925c353e9b472p+0}, {0x1.500000009941fp-1, 0x1.93737b0d3013ap+0}, {0x1.52000000fd26bp-1, 0x1.948b82b684334p+0}, {0x1.54000002865aap-1, 0x1.95a44cbde8147p+0}, {0x1.560000023c506p-1, 0x1.96bdd9a8a22ffp+0}, {0x1.58000000868bdp-1, 0x1.97d829fe2f2edp+0}, {0x1.5a000001cce14p-1, 0x1.98f33e48a1534p+0}, {0x1.5c00000284415p-1, 0x1.9a0f170e06225p+0}, {0x1.5e000000d6ebfp-1, 0x1.9b2bb4d5b7835p+0}, {0x1.60000000e65c2p-1, 0x1.9c49182abf9c8p+0}, {0x1.620000008c1d6p-1, 0x1.9d67419509f83p+0}, {0x1.640000015c9dep-1, 0x1.9e86319ef5d59p+0}, {0x1.6600000414b42p-1, 0x1.9fa5e8d2cb063p+0}, {0x1.68000001214ccp-1, 0x1.a0c667b68191bp+0}, {0x1.6a000001843bcp-1, 0x1.a1e7aed9c7317p+0}, {0x1.6c000000758a2p-1, 0x1.a309bec4e5813p+0}, {0x1.6e00000477098p-1, 0x1.a42c9806eaep+0}, {0x1.700000019cc89p-1, 0x1.a5503b24cdc6dp+0}, {0x1.7200000062f88p-1, 0x1.a674a8af7e9fap+0}, {0x1.740000011ec75p-1, 0x1.a799e133afab3p+0}, {0x1.76000002de3b8p-1, 0x1.a8bfe53db919bp+0}, {0x1.7800000249e28p-1, 0x1.a9e6b558f1ac2p+0}, {0x1.7a000000c9999p-1, 0x1.ab0e5213cb79bp+0}, {0x1.7c000000f0acfp-1, 0x1.ac36bbfdcabdbp+0}, {0x1.7e000003b665fp-1, 0x1.ad5ff3a5eaecp+0}, {0x1.800000015becfp-1, 0x1.ae89f9967806p+0}, {0x1.82000001bc2bp-1, 0x1.afb4ce6332c77p+0}, {0x1.8400000b96bedp-1, 0x1.b0e0729fa6005p+0}, {0x1.86000005d181ap-1, 0x1.b20ce6cd13d83p+0}, {0x1.880000017a522p-1, 0x1.b33a2b85d048fp+0}, {0x1.8a00000dfe0bcp-1, 0x1.b4684163b8e99p+0}, {0x1.8c000003afe5bp-1, 0x1.b59728e084c08p+0}, {0x1.8e00000069dadp-1, 0x1.b6c6e29f5b33dp+0}, {0x1.90000000a0b5ep-1, 0x1.b7f76f30159dbp+0}, {0x1.92000008ff77dp-1, 0x1.b928cf27d4592p+0}, {0x1.9400000829798p-1, 0x1.ba5b030ef3b35p+0}, {0x1.96000005646a8p-1, 0x1.bb8e0b7ce3dd9p+0}, {0x1.98000002f2f09p-1, 0x1.bcc1e90682ac7p+0}, {0x1.9a00000bdd595p-1, 0x1.bdf69c4663ea6p+0}, {0x1.9c000000373fep-1, 0x1.bf2c25bd9353p+0}, {0x1.9e000001d6e5ep-1, 0x1.c0628615390c9p+0}, {0x1.a00000035f465p-1, 0x1.c199bdda629cfp+0}, {0x1.a2000006d882p-1, 0x1.c2d1cda3d3ea5p+0}, {0x1.a4000003c5ae4p-1, 0x1.c40ab6024c00cp+0}, {0x1.a6000002476bbp-1, 0x1.c544779115b4p+0}, {0x1.a80000067077ep-1, 0x1.c67f12e973619p+0}, {0x1.aa00000b8ac35p-1, 0x1.c7ba889fab90dp+0}, {0x1.ac00000079d36p-1, 0x1.c8f6d940b9d91p+0}, {0x1.ae00000244398p-1, 0x1.ca340576843ap+0}, {0x1.b0000006c9425p-1, 0x1.cb720dd331994p+0}, {0x1.b20000040a06bp-1, 0x1.ccb0f2e9564f7p+0}, {0x1.b4000001b8c3dp-1, 0x1.cdf0b556efe47p+0}, {0x1.b600000473d9bp-1, 0x1.cf3155b8857bdp+0}, {0x1.b800000218d64p-1, 0x1.d072d4a1ca24p+0}, {0x1.ba00000319e46p-1, 0x1.d1b532b2811e5p+0}, {0x1.bc00000563c24p-1, 0x1.d2f8708440e2cp+0}, {0x1.be0000033cec4p-1, 0x1.d43c8eaeb791bp+0}, {0x1.c00000092181ap-1, 0x1.d5818dd5880bcp+0}, {0x1.c2000000b2765p-1, 0x1.d6c76e86a02bp+0}, {0x1.c40000002af22p-1, 0x1.d80e316cb3ab8p+0}, {0x1.c600000cb4a9ap-1, 0x1.d955d7281a581p+0}, {0x1.c8000001b543fp-1, 0x1.da9e603ecc1e4p+0}, {0x1.ca000004a9829p-1, 0x1.dbe7cd66a9266p+0}, {0x1.cc00000551605p-1, 0x1.dd321f338ac32p+0}, {0x1.ce000003a354ap-1, 0x1.de7d56441bb1cp+0}, {0x1.d0000000b27afp-1, 0x1.dfc973382da3ep+0}, {0x1.d200000202f1bp-1, 0x1.e11676b2e7334p+0}, {0x1.d40000050a8e2p-1, 0x1.e2646152a4e33p+0}, {0x1.d6000003d0c08p-1, 0x1.e3b333b3ee7d8p+0}, {0x1.d8000000c7cebp-1, 0x1.e502ee7937317p+0}, {0x1.da0000060dd41p-1, 0x1.e653924a733bbp+0}, {0x1.dc00000504b69p-1, 0x1.e7a51fbfc4ebp+0}, {0x1.de0000018f6ccp-1, 0x1.e8f7977de3dbcp+0}, {0x1.e0000003582ap-1, 0x1.ea4afa2c81573p+0}, {0x1.e2000008640cdp-1, 0x1.eb9f486d624ebp+0}, {0x1.e400000ef29b3p-1, 0x1.ecf482e2e03c7p+0}, {0x1.e600000a86731p-1, 0x1.ee4aaa28935efp+0}, {0x1.e8000001232a3p-1, 0x1.efa1bee6d900bp+0}, {0x1.ea000001d8024p-1, 0x1.f0f9c1cca1a4cp+0}, {0x1.ec00000144453p-1, 0x1.f252b377966ccp+0}, {0x1.ee0000077b4a6p-1, 0x1.f3ac9492e6c58p+0}, {0x1.f0000002820d1p-1, 0x1.f50765b897d3fp+0}, {0x1.f20000040e7ffp-1, 0x1.f663279b46a11p+0}, {0x1.f4000000101a1p-1, 0x1.f7bfdad9d6dc6p+0}, {0x1.f60000056fb82p-1, 0x1.f91d8025fb7a6p+0}, {0x1.f800000132d42p-1, 0x1.fa7c181abb707p+0}, {0x1.fa000008dcd22p-1, 0x1.fbdba36f4538cp+0}, {0x1.fc000000d9586p-1, 0x1.fd3c22b98cf5cp+0}, {0x1.fe000001c6485p-1, 0x1.fe9d96b3dc461p+0}, {0x1p+0, 0x1p+1}, };
static const double Exp2Poly2m7[5] = {
0.00133636821875765095445302638781823,
0.00961810850574698526660046525532774,
0.0555041087223186432940320239932465,
0.240226506959044553084155309067230,
0.693147180559945318193472330348557,
};
static const double Ln2 = 0x1.62E42FEFA39EFp-1; static const double one = 1.0;
#define N1 8
#define TWO_N1 0x1.0p8 // 2**N1
static const xUInt64 mask_of_ones = {0xffffffffffffffffULL, 0};
static const xDouble double_exp_lsb = (const xDouble)(const xUInt64){0x0010000000000000ULL, 0};
static const xDouble double_exp_mask = (const xDouble)(const xUInt64){0x7ff0000000000000ULL, 0};
static const xDouble double_mant_mask = (const xDouble)(const xUInt64){0x000fffffffffffffULL, 0};
static const xDouble frexp_mant_mask = (const xDouble)(const xUInt64){0x800fffffffffffffULL, 0};
static const xDouble frexp_half_mask = (const xDouble)(const xUInt64){0x0008000000000000ULL, 0};
static const xDouble xMZEROd = {-0.0, -0.0};
static inline double frexp_near1( double absx, int *exp ) ALWAYS_INLINE;
static inline double frexp_near1( double absx, int *exp )
#if AVOID_64_BIT_INTS
{
const xDouble vx = DOUBLE_2_XDOUBLE(absx);
static const double smallestNormal = 0x1.0p-1022;
const xDouble xOne = _mm_load_sd( &one );
xDouble exponent = _mm_and_pd(vx,double_exp_mask);
xDouble mantissa = _mm_and_pd(vx,frexp_mant_mask);
const xDouble isDenormal = _mm_cmplt_sdm( vx, &smallestNormal );
const int isdenorm = _mm_cvtsi128_si32( (xSInt64) isDenormal );
*exp = -1023; if( EXPECT_FALSE( isdenorm ) ) {
mantissa = _mm_or_pd(mantissa, xOne);
const xDouble u = mantissa - xOne;
exponent = _mm_and_pd(u, double_exp_mask);
mantissa = _mm_and_pd(u, frexp_mant_mask);
*exp += -1022;
}
const xDouble upperhalf = _mm_and_pd(mantissa, frexp_half_mask);
const xUInt64 nudge = _mm_slli_epi64((xUInt64)upperhalf, 1);
mantissa = _mm_xor_pd(_mm_or_pd(mantissa, xOne), (xDouble)nudge); const int true_exp = _mm_cvtsi128_si32( _mm_srli_epi64(nudge+(xUInt64)exponent,52));
*exp += (int) true_exp;
return XDOUBLE_2_DOUBLE(mantissa);
}
#else
{
union{ double d; uint64_t u; } u = { absx };
uint64_t exponent = u.u & 0x7ff0000000000000ULL;
uint64_t mantissa = u.u & 0x800fffffffffffffULL;
*exp = -1023; if( __builtin_expect( (int64_t) exponent == 0x0000000000000000LL, 0 ) ) {
mantissa |= 0x3ff0000000000000ULL;
u.u = mantissa;
u.d = u.d - one;
exponent = u.u & 0x7ff0000000000000ULL;
mantissa = u.u & 0x800fffffffffffffULL;
*exp += -1022;
}
uint64_t upperhalf = u.u & 0x0008000000000000ULL;
mantissa = (mantissa | 0x3ff0000000000000ULL) ^ (upperhalf << 1); *exp += (int) ( exponent >> 52 ) + (upperhalf != 0ULL); u.u = mantissa;
*exp = (int)exponent;
return u.d;
}
#endif
static inline double twoton(int n) ALWAYS_INLINE;
static inline double twoton(int n)
#if AVOID_64_BIT_INTS
{
return XDOUBLE_2_DOUBLE(twoToTheM(n));
}
#else
{
union{ double d; uint64_t u; } ux;
ux.u = (uint64_t)(0x3ff + n) << 52;
return ux.d;
}
#endif
static const xUInt64 ROUND26 = {0x0000000004000000ULL, 0};
static const xUInt64 ROUND26_MASK= {0xfffffffff8000000ULL, 0};
static inline double round26nearest(double x) ALWAYS_INLINE;
static inline double round26nearest(double x)
#if AVOID_64_BIT_INTS
{
const xDouble vx = DOUBLE_2_XDOUBLE(x);
const xDouble vs = _mm_and_pd((xDouble)_mm_add_epi64((xUInt64)vx,ROUND26),(xDouble)ROUND26_MASK) ;
return XDOUBLE_2_DOUBLE(vs);
}
#else
{
union{ double d; uint64_t u; } ux;
ux.d = x;
ux.u = (ux.u + 0x0000000004000000ULL) & 0xfffffffff8000000ULL;
return ux.d;
}
#endif
static const double LogTaylor[]=
{
0x0.24628E2A4CB513Ep0,
-0x0.2AAAA7C79E594CFp0,
0x0.333333441E488E8p0,
-0x0.400000000286788p0,
0x0.555555555553FDFp0,
-0x0.7FFFFFFFFFFFFFFp0,
};
static const xDouble small = {0x1p-1020, 0.};
static const xDouble big = {0x1p+1020, 0.};
double pow(double x, double y) {
int yisint = 0;
int yisodd = 0;
#if AVOID_64_BIT_INTS
{
if( x == one || y == one)
return x;
const xDouble vx = DOUBLE_2_XDOUBLE(x);
const xDouble vy = DOUBLE_2_XDOUBLE(y);
const xDouble xOne = _mm_load_sd( &one );
xDouble absux = _mm_andnot_pd(xMZEROd, vx);
xDouble absuy = _mm_andnot_pd(xMZEROd, vy);
uint32_t absuyhi = _mm_cvtsi128_si32((xUInt32)_mm_srli_epi64((xUInt64)absuy,32));
uint32_t absuxhi = _mm_cvtsi128_si32((xUInt32)_mm_srli_epi64((xUInt64)absux,32));
if (EXPECT_FALSE(absuyhi >= 0x43400000U)) { yisint = 1;
#if DEBUG
printf("Guaranteed int: %d (%x >= %x), odd: %d\n", yisint, absuyhi, 0x43400000U, yisodd);
#endif
} else if (EXPECT_TRUE(absuyhi < 0x40000000U)) { yisint = yisodd = (y == -1.0);
} else {
xDouble mask = _mm_and_pd(absuy, double_exp_mask); const xDouble onesMask = mask + xOne; const xDouble sigy = _mm_and_pd(absuy, double_mant_mask);
const xDouble onesBit = _mm_and_pd(sigy, onesMask);
mask = (xDouble)_mm_add_epi64((xUInt64)mask, (xUInt64)double_exp_lsb); const xDouble fractUnMask = mask - xOne; const xUInt32 fractionalBits = _mm_andnot_si128((xUInt32)fractUnMask, (xUInt32)absuy);
const int anyFractionBit = 0xff & _mm_movemask_epi8( _mm_cmpeq_epi8(fractionalBits, _mm_setzero_si128() ) ) ;
const int anyOnesBit = 0xff & _mm_movemask_epi8( _mm_cmpeq_epi8((xUInt32)onesBit, _mm_setzero_si128() ) ); yisint = (0xff == anyFractionBit);
yisodd = (yisint && (0xff != anyOnesBit));
#if DEBUG
printf("int: %d (%d), odd: %d (%d) %vllx %vllx %vllx\n", yisint, anyFractionBit, yisodd, anyOnesBit, fractionalBits, fractUnMask, onesBit);
#endif
}
#if DEBUG
printf("y hi: %a %x int: %d, odd: %d\n",y,absuyhi, yisint, yisodd);
#endif
if( EXPECT_FALSE(absuxhi >= 0x7ff00000U
|| absuyhi >= 0x7ff00000U
|| _mm_istrue_sd( _mm_or_pd(_mm_cmpeq_pd(_mm_setzero_pd(), vx),_mm_cmpeq_pd(_mm_setzero_pd(), vy)))
)
)
{
if( 0. == y )
return one;
if( x != x || y != y )
return x + y;
if( 0. == x )
{
if( yisodd )
{
if( y < 0.0 )
return one / x;
return x;
}
if( 0.0 < y )
return 0.0;
return one / __builtin_fabs(x); }
if( 0x7ff00000U == absuyhi )
{
if( -1.0 == x )
return one;
if( absuxhi >= 0x3ff00000U ) { if( 0.0 < y )
return y;
else
return 0.0;
}
else
{ if( 0.0 < y )
return 0.0;
else
return __builtin_fabs(y);
}
}
if( x == __builtin_inf() )
{
if( y < 0.0 )
return 0.0;
else
return x;
}
if( yisodd ) {
if( 0.0 < y )
return x;
return -0.0;
}
if( 0.0 < y )
return -x;
return 0.0;
}
const double absy = __builtin_fabs(y);
if( EXPECT_FALSE((x < 0.0 && !yisint) || (0.5 == absy)) )
{
if( x < 0.0 || y > 0.0 )
return sqrt(x);
return one / sqrt( x );
}
if( yisint && (absy < 0x1p8)) {
long double ix = 1.0, lx = (long double) x;
if( y < 0. )
lx = 1.0L/ lx;
int i = (int)absy; int mask = 1;
while(i != 0)
{
if( i & mask )
{
ix *= lx;
i -= mask;
}
mask += mask;
lx *= lx; }
return (double)ix; }
}
#else
{
if( x == one || y == one)
return x;
union{ double d; uint64_t u; } ux, uy;
ux.d = x;
uy.d = y;
uint64_t absux = ux.u & 0x7fffffffffffffffULL;
uint64_t absuy = uy.u & 0x7fffffffffffffffULL;
if (EXPECT_FALSE(absuy >= 0x4340000000000000ULL)) { yisint = 1;
} else if (EXPECT_TRUE(absuy < 0x4000000000000000ULL)) { yisint = yisodd = (y == -1.0);
} else {
union{ double d; uint64_t u; } mask, onesMask, fractUnMask;
mask.u = (absuy & 0x7ff0000000000000ULL); onesMask.d = mask.d + one; const uint64_t sigy = absuy & 0x000fffffffffffffULL;
const uint64_t onesBit = sigy & onesMask.u;
mask.u = mask.u + 0x0010000000000000ULL; fractUnMask.d = mask.d - one; const uint64_t fractionalBits = absuy & ~fractUnMask.u;
yisint = (0 == fractionalBits);
yisodd = (yisint && (0 != onesBit));
}
if( EXPECT_FALSE((absux - 1ULL) >= 0x7fefffffffffffffULL || (absuy - 1ULL) >= 0x7fefffffffffffffULL) )
{
if( 0 == absuy )
return one;
if( x != x || y != y )
return x + y;
if( 0 == absux )
{
if( yisodd )
{
if( y < 0.0 )
return one / x;
return x;
}
if( 0.0 < y )
return 0.0;
return one / __builtin_fabs(x); }
if( 0x7ff0000000000000ULL == absuy )
{
if( -1.0 == x )
return one;
if( absux >= 0x3ff0000000000000ULL ) { if( 0.0 < y )
return y;
else
return 0.0;
}
else
{ if( 0.0 < y )
return 0.0;
else
return __builtin_fabs(y);
}
}
if( x == __builtin_inf() )
{
if( y < 0.0 )
return 0.0;
else
return x;
}
if( yisodd ) {
if( 0.0 < y )
return x;
return -0.0;
}
if( 0.0 < y )
return -x;
return 0.0;
}
if( EXPECT_FALSE((x < 0.0 && !yisint) || (0x3fe0000000000000ULL == absuy)) )
{
if( x < 0.0 || y > 0.0 )
return sqrt(x);
return one / sqrt( x );
}
const double absy = fabs(y);
if( yisint && (absy < 0x1p8)) {
long double ix = 1.0, lx = (long double) x;
if( y < 0. )
lx = 1.0L/ lx;
int i = (int)absy; int mask = 1;
while(i != 0)
{
if( i & mask )
{
ix *= lx;
i -= mask;
}
mask += mask;
lx *= lx; }
return (double)ix; }
}
#endif
const double absx = __builtin_fabs(x);
const double signx = (x < 0.0 && yisodd)?-1.0:1.0; if(x == -1.0) return signx;
long double temp;
const double *py = &y;
const double *pabsx = &absx;
asm volatile( "fldl (%1)\n fldl (%2)\n fyl2x \n fstpt %0" : "=m" (*(&temp)) : "r" (py), "r" (pabsx), "m"(absx), "m"(y) );
const long double lw = temp;
const long double abslw = __builtin_fabsl(lw);
if (lw > POW_OVERFLOW_GUARANTEED) return signx * XDOUBLE_2_DOUBLE(REQUIRED_MULTIPLY_sd(big,big));
if (abslw < POW_1_GUARANTEED) return signx * 1.0;
if (lw < POW_UNDERFLOW_GUARANTEED) return signx * XDOUBLE_2_DOUBLE(REQUIRED_MULTIPLY_sd(small,small)); const long double wn = __builtin_floorl(lw); const long double lwf = lw - wn;
const int b1 = ((int)(lwf * TWO_N1));
const double d1 = Exp2Table[b1][0];
const double d2 = (wn == -1.0) ? lw - (d1 - one) : lwf - d1 ;
const double thi = Exp2Table[b1][1];
const double wflo = d2;
const double pwflo = ( ( ( (
Exp2Poly2m7[0] * wflo + Exp2Poly2m7[1] ) * wflo + Exp2Poly2m7[2] ) * wflo + Exp2Poly2m7[3] ) * wflo + Exp2Poly2m7[4] ); const double tlom1 = wflo * pwflo;
const int m = (int)wn;
const int m1 = m >> 1;
const int m2 = m - m1;
const double scale1 = signx * twoton(m1);
const double scale2 = twoton(m2);
const double zf = thi + thi*tlom1;
const double z = scale1 * (scale2 * zf); #if DEBUG
printf("fyl2x: \t%a*lg(%a) = \t%La --> \n",y,absx,lw);
printf("%La + %La (= %a[%d] + %a) --> %a * %a * %a (%a + 1)) = %La\n",wn,lwf,d1,b1,d2,scale1,scale2,thi,tlom1,z);
#endif
return z;
}
#include <math.h>
#include <float.h>
long double powl( long double x, long double y )
{
static const double neg_epsilon = 0x1.0p63;
if( x == 1.0 )
return x;
if( y == 0.0 )
return 1.0L;
if( x != x || y != y )
return x + y;
long double fabsy = __builtin_fabsl( y );
long double fabsx = __builtin_fabsl( x );
long double infinity = __builtin_infl();
long double iy = nearbyintl( fabsy ); if( iy > fabsy ) iy -= 1.0L;
int isOddInt = 0;
if( fabsy == iy && fabsy != infinity && iy < neg_epsilon )
isOddInt = iy - 2.0L * nearbyintl( 0.5L * iy );
if( x == 0.0 )
{
if( ! isOddInt )
x = 0.0L;
if( y < 0 )
x = 1.0L/ x;
return x;
}
if( fabsx == infinity )
{
if( x < 0 )
{
if( isOddInt )
{
if( y < 0 )
return -0.0;
else
return -infinity;
}
else
{
if( y < 0 )
return 0.0;
else
return infinity;
}
}
if( y < 0 )
return 0;
return infinity;
}
if( fabsy == infinity )
{
if( x == -1 )
return 1;
if( y < 0 )
{
if( fabsx < 1 )
return infinity;
return 0;
}
if( fabsx < 1 )
return 0;
return infinity;
}
if( x < 0 && iy != fabsy )
{
SET_INVALID_FLAG();
return nanl("37");
}
if( fabsy == 0.5 )
{
x = sqrtl( x );
if( y < 0 )
x = 1.0L/ x;
return x;
}
long double fy = fabsy - iy;
long double fx = 1.0;
long double ix = 1.0;
if( fy != 0 ) {
fx =log2l(x);
long double fabsfx = __builtin_fabsl( fx );
long double min = fminl( fy, fabsfx );
long double max = fmaxl( fy, fabsfx );
if( y < 0 )
fy = -fy;
if( min < 0x1.0p-8191L && max < neg_epsilon ) {
fx = 1; }
else
{ fx *= fy;
fx = exp2l( fx );
}
}
if( y < 0 && iy != 0 )
x = 1.0L/ x;
while( iy != 0.0L )
{
long double ylo;
if( x == 0.0 || x == infinity )
{
ix *= x; break;
}
if( iy > 0x1.0p30 )
{
long double scaled = iy * 0x1.0p-30L;
long double yhi = nearbyintl( scaled );
if( yhi > scaled )
yhi -= 1.0;
ylo = iy - 0x1.0p30L * yhi;
iy = yhi;
}
else
{ ylo = iy;
iy = 0;
}
int j;
int i = ylo;
int mask = 1;
if( i & 1 )
{
ix *= x;
i -= mask;
}
for( j = 0; j < 30 && i != 0; j++ )
{
mask += mask;
x *= x;
if( i & mask )
{
ix *= x;
i -= mask;
}
}
if( 0.0 != iy )
for( ; j < 30; j++ )
x *= x;
}
x = fx * ix;
return x;
}
#pragma mark -
#pragma mark cbrt
static inline double _cbrt( double _x ) ALWAYS_INLINE;
double _cbrt( double _x )
{
static const double infinity = __builtin_inf();
static const double smallestNormal = 0x1.0p-1022;
static const double twom968 = 0x1.0p-968;
static const xUInt64 oneThird = { 0x55555556ULL, 0 };
static const xUInt32 denormBias = { 0, 696219795U, 0, 0 };
static const xUInt32 normalBias = { 0, 0x1200000U, 0, 0 };
static const double C = 5.42857142857142815906e-01;
static const double D = -7.05306122448979611050e-01;
static const double E = 1.41428571428571436819e+00;
static const double F = 1.60714285714285720630e+00;
static const double G = 3.57142857142857150787e-01;
static const xDouble expMask = { __builtin_inf(), 0 };
static const xUInt64 topMask = { 0xFFFFFFFF00000000ULL, 0 };
static const double twom20 = 0x1.0p-20;
xDouble x = DOUBLE_2_XDOUBLE( _x );
if( EXPECT_FALSE( _mm_istrue_sd( _mm_cmpunord_sd( x, x ) ) ) )
return _x + _x;
xDouble sign = _mm_and_pd( x, minusZeroD ); x = _mm_andnot_pd( minusZeroD, x );
if( EXPECT_FALSE( _mm_istrue_sd( _mm_cmpeq_sdm( x, &infinity)) ) )
return _x;
if( EXPECT_TRUE( _x != 0.0 ) )
{
xDouble isDenorm = _mm_cmplt_sdm( x, &smallestNormal );
xDouble t = _mm_and_pd( _mm_load_sd( &twom968 ), isDenorm ); t = _mm_sub_sd( _mm_or_pd( t, x ), t );
xSInt32 addend = _mm_add_epi32( _mm_andnot_si128( (xSInt32) isDenorm, normalBias), denormBias );
t = (xDouble) _mm_mul_epu32( _mm_srli_epi64( (xSInt64) t, 32 ), oneThird );
t = (xDouble) _mm_add_epi32( (xSInt32) t, addend );
xDouble r = _mm_div_sd( _mm_mul_sd( t, t ), x ); xDouble s = _mm_add_sdm( _mm_mul_sd( r, t ), &C ); xDouble y = _mm_add_sdm( s, &E );
xDouble z = _mm_div_sd( _mm_load_sd( &D ), s );
y = _mm_add_sd( y, z );
y = _mm_div_sd( _mm_load_sd( &F ), y );
y = _mm_add_sdm( y, &G );
t = _mm_mul_sd( t, y );
xDouble add = _mm_mul_sdm( t, &twom20 );
add = _mm_and_pd( add, expMask );
t = _mm_add_sd( t, add );
t = _mm_and_pd( t, (xDouble) topMask );
s = _mm_mul_sd( t, t ); r = _mm_div_sd( x, s );
xDouble w = _mm_add_sd( t, t );
w = _mm_add_sd( w, r );
r = _mm_sub_sd( r, t );
r = _mm_div_sd( r, w );
t = _mm_add_sd( t, _mm_mul_sd( t, r ) );
t = _mm_or_pd( t, sign );
return XDOUBLE_2_DOUBLE( t );
}
return _x; }
double cbrt( double x )
{
return _cbrt( x );
}
#if 0
#include "xmmLibm_prefix.h"
#include "math.h"
static const double T1 = 0x1.F800000000000p-1; static const double T2 = 0x1.0400000000000p+0; static const double T52 = 0x1.0000000000000p+52; static const double T53 = 0x1.0000000000000p+53; static const double Emax = 0x1.62E42FEFA39EFp+9; static const double Emin = -0x1.74385446D71C3p+9; static const double A1 = 0x1.5555555555555p-4; static const double A2 = 0x1.99999999FE736p-7; static const double A3 = 0x1.24919E6600596p-9; static const double B1 = 0x1.555555554F9EDp-4; static const double B2 = 0x1.999A118F10BD9p-7; static const double C1 = 0x1.5555555555555p-4; static const double C2 = 0x1.99999999AF7C8p-7; static const double C3 = 0x1.24923B2F1315Cp-9; static const double C4 = 0x1.CE20EE795DBA1p-12; static const double C5 = 0x1.CE20EE795DBA1p-12; static const double Inv_L = 0x1.71547652B82FEp+5; static const double L1 = 0x1.62E42FEF00000p-6; static const double L2 = 0x1.473DE6AF278EDp-39; static const double P1 = 0x1.0000000000000p-1; static const double P2 = 0x1.5555555547334p-3; static const double P3 = 0x1.555555554A9D2p-5; static const double P4 = 0x1.1111609FBE568p-7; static const double P5 = 0x1.6C172098CB78Bp-10; static const double plusinf = 1e500;
static const double logtable[129*2] = {
0.0, 0.0, 0x1.FE02A6B200000p-8, -0x1.F30EE07912DF9p-41, 0x1.FC0A8B1000000p-7, -0x1.FE0E183092C59p-42, 0x1.7B91B07D80000p-6, -0x1.2772AB6C0559Cp-41, 0x1.F829B0E780000p-6, 0x1.980267C7E09E4p-45, 0x1.39E87BA000000p-5, -0x1.42A056FEA4DFDp-41, 0x1.77458F6340000p-5, -0x1.2303B9CB0D5E1p-41, 0x1.B42DD71180000p-5, 0x1.71BEC28D14C7Ep-41, 0x1.F0A30C0100000p-5, 0x1.62A6617CC9717p-41, 0x1.16536EEA40000p-4, -0x1.0A3E2F3B47D18p-41, 0x1.341D7961C0000p-4, -0x1.717B6B33E44F8p-43, 0x1.51B073F060000p-4, 0x1.83F69278E686Ap-44, 0x1.6F0D28AE60000p-4, -0x1.2968C836CC8C2p-41, 0x1.8C345D6320000p-4, -0x1.937C294D2F567p-42, 0x1.A926D3A4A0000p-4, 0x1.AAC6CA17A4554p-41, 0x1.C5E548F5C0000p-4, -0x1.C5E7514F4083Fp-43, 0x1.E27076E2A0000p-4, 0x1.E5CBD3D50FFFCp-41, 0x1.FEC9131DC0000p-4, -0x1.54555D1AE6607p-44, 0x1.0D77E7CD10000p-3, -0x1.C69A65A23A170p-41, 0x1.1B72AD52F0000p-3, 0x1.9E80A41811A39p-41, 0x1.29552F8200000p-3, -0x1.5B967F4471DFCp-44, 0x1.371FC201F0000p-3, -0x1.C22F10C9A4EA8p-41, 0x1.44D2B6CCB0000p-3, 0x1.F4799F4F6543Ep-41, 0x1.526E5E3A20000p-3, -0x1.2F21746FF8A47p-41, 0x1.5FF3070A80000p-3, -0x1.B0B0DE3077D7Ep-41, 0x1.6D60FE71A0000p-3, -0x1.6F1B955C4D1DAp-42, 0x1.7AB8902110000p-3, -0x1.37B720E4A694Bp-42, 0x1.87FA065210000p-3, -0x1.B77B7EFFB7F41p-42, 0x1.9525A9CF40000p-3, 0x1.5AD1D904C1D4Ep-41, 0x1.A23BC1FE30000p-3, -0x1.2A739B23B93E1p-41, 0x1.AF3C94E810000p-3, -0x1.00349CC67F9B2p-41, 0x1.BC286742E0000p-3, -0x1.CCA75818C5DBCp-41, 0x1.C8FF7C79B0000p-3, -0x1.97794F689F843p-41, 0x1.D5C216B500000p-3, -0x1.11BA91BBCA682p-41, 0x1.E27076E2B0000p-3, -0x1.A342C2AF0003Cp-44, 0x1.EF0ADCBDC0000p-3, 0x1.64D948637950Ep-41, 0x1.FB9186D5E0000p-3, 0x1.F1546AAA3361Cp-42, 0x1.0402594B50000p-2, -0x1.7DF928EC217A5p-41, 0x1.0A324E2738000p-2, 0x1.0E35F73F7A018p-42, 0x1.1058BF9AE8000p-2, -0x1.A9573B02FAA5Ap-41, 0x1.1675CABAB8000p-2, 0x1.30701CE63EAB9p-41, 0x1.1C898C1698000p-2, 0x1.9FAFBC68E7540p-42, 0x1.22941FBCF8000p-2, -0x1.A6976F5EB0963p-44, 0x1.2895A13DE8000p-2, 0x1.A8D7AD24C13F0p-44, 0x1.2E8E2BAE10000p-2, 0x1.D309C2CC91A85p-42, 0x1.347DD9A988000p-2, -0x1.5594DD4C58092p-45, 0x1.3A64C55698000p-2, -0x1.D0B1C68651946p-41, 0x1.4043086868000p-2, 0x1.3F1DE86093EFAp-41, 0x1.4618BC21C8000p-2, -0x1.09EC17A426426p-41, 0x1.4BE5F95778000p-2, -0x1.D7C92CD9AD824p-44, 0x1.51AAD872E0000p-2, -0x1.F4BD8DB0A7CC1p-44, 0x1.5767717458000p-2, -0x1.2C9D5B2A49AF9p-41, 0x1.5D1BDBF580000p-2, 0x1.394A11B1C1EE4p-43, 0x1.62C82F2BA0000p-2, -0x1.C356848506EADp-41, 0x1.686C81E9B0000p-2, 0x1.4AEC442BE1015p-42, 0x1.6E08EAA2B8000p-2, 0x1.0F1C609C98C6Cp-41, 0x1.739D7F6BC0000p-2, -0x1.7FCB18ED9D603p-41, 0x1.792A55FDD8000p-2, -0x1.C2EC1F512DC03p-41, 0x1.7EAF83B828000p-2, 0x1.7E1B259D2F3DAp-41, 0x1.842D1DA1E8000p-2, 0x1.62E927628CBC2p-43, 0x1.89A3386C18000p-2, -0x1.ED2A52C73BF78p-41, 0x1.8F11E87368000p-2, -0x1.D3881E8962A96p-42, 0x1.947941C210000p-2, 0x1.6FABA4CDD147Dp-42, 0x1.99D9581180000p-2, -0x1.F753456D113B8p-42, 0x1.9F323ECBF8000p-2, 0x1.84BF2B68D766Fp-42, 0x1.A484090E58000p-2, 0x1.D8515FE535B87p-41, 0x1.A9CEC9A9A0000p-2, 0x1.0931A909FEA5Ep-43, 0x1.AF12932478000p-2, -0x1.E53BB31EED7A9p-44, 0x1.B44F77BCC8000p-2, 0x1.EC5197DDB55D3p-43, 0x1.B985896930000p-2, 0x1.0FB598FB14F89p-42, 0x1.BEB4D9DA70000p-2, 0x1.B7BF7861D37ACp-42, 0x1.C3DD7A7CD8000p-2, 0x1.6A6B9D9E0A5BDp-41, 0x1.C8FF7C79A8000p-2, 0x1.A21AC25D81EF3p-42, 0x1.CE1AF0B860000p-2, -0x1.8290905A86AA6p-43, 0x1.D32FE7E010000p-2, -0x1.42A9E21373414p-42, 0x1.D83E7258A0000p-2, 0x1.79F2828ADD176p-41, 0x1.DD46A04C20000p-2, -0x1.DAFA08CECADB1p-41, 0x1.E24881A7C8000p-2, -0x1.3D9E34270BA6Bp-42, 0x1.E744261D68000p-2, 0x1.E1F8DF68DBCF3p-44, 0x1.EC399D2468000p-2, 0x1.9802EB9DCA7E7p-43, 0x1.F128F5FAF0000p-2, 0x1.BB2CD720EC44Cp-44, 0x1.F6123FA700000p-2, 0x1.45630A2B61E5Bp-41, 0x1.FAF588F790000p-2, -0x1.9C24CA098362Bp-43, 0x1.FFD2E08580000p-2, -0x1.6CF54D05F9367p-43, 0x1.02552A5A5C000p-1, 0x1.0FEC69C695D7Fp-41, 0x1.04BDF9DA94000p-1, -0x1.92D9A033EFF75p-41, 0x1.0723E5C1CC000p-1, 0x1.F404E57963891p-41, 0x1.0986F4F574000p-1, -0x1.5BE8DC04AD601p-42, 0x1.0BE72E4254000p-1, -0x1.57D49676844CCp-41, 0x1.0E44985D1C000p-1, 0x1.917EDD5CBBD2Dp-42, 0x1.109F39E2D4000p-1, 0x1.92DFBC7D93617p-42, 0x1.12F7195940000p-1, -0x1.043ACFEDCE638p-41, 0x1.154C3D2F4C000p-1, 0x1.5E9A98F33A396p-41, 0x1.179EABBD88000p-1, 0x1.9A0BFC60E6FA0p-41, 0x1.19EE6B467C000p-1, 0x1.2DD98B97BAEF0p-42, 0x1.1C3B81F714000p-1, -0x1.EDA1B58389902p-44, 0x1.1E85F5E704000p-1, 0x1.A07BD8B34BE7Cp-46, 0x1.20CDCD192C000p-1, -0x1.4926CAFC2F08Ap-41, 0x1.23130D7BEC000p-1, -0x1.7AFA4392F1BA7p-46, 0x1.2555BCE990000p-1, -0x1.06987F78A4A5Ep-42, 0x1.2795E1289C000p-1, -0x1.DCA290F81848Dp-42, 0x1.29D37FEC2C000p-1, -0x1.EEA6F465268B4p-42, 0x1.2C0E9ED448000p-1, 0x1.D1772F5386374p-42, 0x1.2E47436E40000p-1, 0x1.34202A10C3491p-44, 0x1.307D7334F0000p-1, 0x1.0BE1FB590A1F5p-41, 0x1.32B1339120000p-1, 0x1.D71320556B67Bp-41, 0x1.34E289D9D0000p-1, -0x1.E2CE9146D277Ap-41, 0x1.37117B5474000p-1, 0x1.ED71774092113p-43, 0x1.393E0D3564000p-1, -0x1.5E6563BBD9FC9p-41, 0x1.3B6844A000000p-1, -0x1.EEA838909F3D3p-44, 0x1.3D9026A714000p-1, 0x1.6FAA404263D0Bp-41, 0x1.3FB5B84D18000p-1, -0x1.0BDA4B162AFA3p-41, 0x1.41D8FE8468000p-1, -0x1.AA33736867A17p-42, 0x1.43F9FE2F9C000p-1, 0x1.CCEF4E4F736C2p-42, 0x1.4618BC21C4000p-1, 0x1.EC27D0B7B37B3p-41, 0x1.48353D1EA8000p-1, 0x1.1BEE7ABD17660p-42, 0x1.4A4F85DB04000p-1, -0x1.44FDD840B8591p-45, 0x1.4C679AFCD0000p-1, -0x1.1C64E971322CEp-41, 0x1.4E7D811B74000p-1, 0x1.BB09CB0985646p-41, 0x1.50913CC018000p-1, -0x1.794B434C5A4F5p-41, 0x1.52A2D265BC000p-1, 0x1.6ABB9DF22BC57p-43, 0x1.54B2467998000p-1, 0x1.497A915428B44p-41, 0x1.56BF9D5B40000p-1, -0x1.8CD7DC73BD194p-42, 0x1.58CADB5CD8000p-1, -0x1.9DB3DB43689B4p-43, 0x1.5AD404C358000p-1, 0x1.F2CFB29AAA5F0p-41, 0x1.5CDB1DC6C0000p-1, 0x1.7648CF6E3C5D7p-41, 0x1.5EE02A9240000p-1, 0x1.67570D6095FD2p-41, 0x1.60E32F4478000p-1, 0x1.1B194F912B417p-42, 0x1.62E42FEFA4000p-1, -0x1.8432A1B0E2634p-43 };
static const double exptable[32*2] = {
0x1.0000000000000p+0, 0.0, 0x1.059B0D3158540p+0, 0x1.A1D73E2A475B4p-47, 0x1.0B5586CF98900p+0, 0x1.EC5317256E308p-49, 0x1.11301D0125B40p+0, 0x1.0A4EBBF1AED93p-48, 0x1.172B83C7D5140p+0, 0x1.D6E6FBE462876p-47, 0x1.1D4873168B980p+0, 0x1.53C02DC0144C8p-47, 0x1.2387A6E756200p+0, 0x1.C3360FD6D8E0Bp-47, 0x1.29E9DF51FDEC0p+0, 0x1.09612E8AFAD12p-47, 0x1.306FE0A31B700p+0, 0x1.52DE8D5A46306p-48, 0x1.371A7373AA9C0p+0, 0x1.54E28AA05E8A9p-49, 0x1.3DEA64C123400p+0, 0x1.11ADA0911F09Fp-47, 0x1.44E0860618900p+0, 0x1.68189B7A04EF8p-47, 0x1.4BFDAD5362A00p+0, 0x1.38EA1CBD7F621p-47, 0x1.5342B569D4F80p+0, 0x1.DF0A83C49D86Ap-52, 0x1.5AB07DD485400p+0, 0x1.4AC64980A8C8Fp-47, 0x1.6247EB03A5580p+0, 0x1.2C7C3E81BF4B7p-50, 0x1.6A09E667F3BC0p+0, 0x1.921165F626CDDp-49, 0x1.71F75E8EC5F40p+0, 0x1.9EE91B8797785p-47, 0x1.7A11473EB0180p+0, 0x1.B5F54408FDB37p-50, 0x1.82589994CCE00p+0, 0x1.28ACF88AFAB35p-48, 0x1.8ACE5422AA0C0p+0, 0x1.B5BA7C55A192Dp-48, 0x1.93737B0CDC5C0p+0, 0x1.27A280E1F92A0p-47, 0x1.9C49182A3F080p+0, 0x1.01C7C46B071F3p-48, 0x1.A5503B23E2540p+0, 0x1.C8B424491CAF8p-48, 0x1.AE89F995AD380p+0, 0x1.6AF439A68BB99p-47, 0x1.B7F76F2FB5E40p+0, 0x1.BAA9EC206AD4Fp-50, 0x1.C199BDD855280p+0, 0x1.C2220CB12A092p-48, 0x1.CB720DCEF9040p+0, 0x1.48A81E5E8F4A5p-47, 0x1.D5818DCFBA480p+0, 0x1.C976816BAD9B8p-50, 0x1.DFC97337B9B40p+0, 0x1.EB968CAC39ED3p-48, 0x1.EA4AFA2A490C0p+0, 0x1.9858F73A18F5Ep-48, 0x1.F50765B6E4540p+0, 0x1.9D3E12DD8A18Bp-54 };
static const double one = 1.0;
static const double mOne = -1.0;
static const double two = 2.0;
static const xSInt64 bias[2] = { {2045, 0}, {1023, 0} };
static const xUInt64 POWER_NAN = { 0x7FF8000000000025ULL, 0 };
static inline xDouble ipow( xDouble x, uint32_t u ) ALWAYS_INLINE;
static inline xDouble _pow( xDouble X, xDouble Y ) ALWAYS_INLINE;
static inline xDouble xscalb( xDouble x, int M )
{
static const double scale[2] = { 0x1.0p1022, 0x1.0p-1022 };
static const int step[2] = { 1022, -1022 };
int index = M >> 31;
int count = abs(M);
xSInt64 xm = _mm_cvtsi32_si128( M + 1023 );
xSInt64 xstep = _mm_cvtsi32_si128( step[-index] );
xDouble xscale = _mm_load_sd( scale - index );
if( count > 1022 )
{
x = _mm_mul_sd( x, xscale );
xm = _mm_sub_epi64( xm, xstep );
count -= 1022;
if( count > 1022 )
{
x = _mm_mul_sd( x, xscale );
xm = _mm_sub_epi64( xm, xstep );
count -= 1022;
if( count > 1022 )
return _mm_mul_sd( x, xscale );
}
}
xm = _mm_slli_epi64( xm, 52 );
return _mm_mul_sd( x, (xDouble) xm );
}
static inline xDouble ipow( xDouble x, uint32_t u )
{
xDouble result;
uint32_t mask = 1;
if( 0 == u )
return _mm_load_sd( &one );
while( u && 0 == (u & mask) )
{
x = _mm_mul_sd( x,x );
mask += mask;
}
result = x;
u &= ~mask;
while( u )
{
x = _mm_mul_sd( x,x );
mask += mask;
if( u & mask )
{
result = _mm_mul_sd( result, x );
u &= ~mask;
}
}
return result;
}
static const xUInt64 iOne = { 1, 0 };
static inline xDouble _pow( xDouble X, xDouble Y )
{
int oldMXCSR = _mm_getcsr();
int newMXCSR = (oldMXCSR | DEFAULT_MXCSR) & DEFAULT_MASK; if( newMXCSR != oldMXCSR )
_mm_setcsr( newMXCSR );
static const double tenM20 = 1e-20;
static const double ten20 = 1e20;
static const double d16 = 16.0;
static const double d128 = 128.0;
static const double r128 = 1.0/128.0;
static const double r8 = 1.0/8.0;
static const double smallestNormal = 0x1.0p-1022;
if( _mm_istrue_sd( _mm_or_pd( _mm_cmpeq_sdm( X, &one ), _mm_cmpeq_sdm( Y, (double*) &minusZeroD ) )) )
{
X = _mm_load_sd( &one );
if( newMXCSR != oldMXCSR )
_mm_setcsr( oldMXCSR );
return X;
}
if( _mm_istrue_sd( _mm_cmpunord_sd( X, Y ) ) )
{
if( newMXCSR != oldMXCSR )
_mm_setcsr( oldMXCSR );
return _mm_add_sd( X, Y );
}
xDouble fabsY = _mm_andnot_pd( minusZeroD, Y );
xDouble fabsX = _mm_andnot_pd( minusZeroD, X );
xDouble fabsyIsInf = _mm_cmpeq_sdm( fabsY, &plusinf );
xDouble signPatch = _mm_setzero_pd();
xDouble floorbias = _mm_load_sd( &T52 );
floorbias = _mm_and_pd( floorbias, _mm_cmplt_sd( fabsY, floorbias ) );
xDouble yShifted = _mm_add_sd( fabsY, floorbias);
xDouble roundFabsY = _mm_sub_sd( yShifted, floorbias );
xDouble yIsEven = (xDouble) _mm_sub_epi64( _mm_and_si128( (xUInt64) yShifted, iOne ), iOne );
xDouble yIsInt = _mm_cmpeq_sd( roundFabsY, fabsY);
int intY = _mm_cvtsd_si32( Y );
_mm_setcsr( newMXCSR ); yIsEven = _mm_or_pd( yIsEven, _mm_cmpge_sdm( fabsY, &T53 ) ); yIsInt = _mm_andnot_pd( fabsyIsInf, yIsInt );
xDouble fabsxLTInf = _mm_cmplt_sdm( fabsX, &plusinf );
if( _mm_istrue_sd( _mm_and_pd( _mm_cmplt_sdm( X, (double*) &minusZeroD ), fabsxLTInf ))) {
if( _mm_istrue_sd( yIsInt ) )
{
X = fabsX; signPatch = _mm_andnot_pd( yIsEven, minusZeroD );
if( _mm_istrue_sd( _mm_cmpeq_sdm( X, &one )) )
{
X = _mm_load_sd( &one );
goto exit;
}
}
else
{
if( _mm_istrue_sd( _mm_cmplt_sdm( fabsY, &plusinf ) ) )
{
X = (xDouble) POWER_NAN;
oldMXCSR |= INVALID_FLAG;
goto exit;
}
}
}
xDouble xGTzero = _mm_cmpgt_sdm( X, (double*) &minusZeroD );
xDouble yLTzero = _mm_cmplt_sdm( Y, (double*) &minusZeroD );
xDouble xEQzero = _mm_cmpeq_sdm( X, (double*) &minusZeroD );
if( _mm_istrue_sd( _mm_andnot_pd( xEQzero, yIsInt)) && intY != 0x80000000 )
{
if( intY < 0 )
{
_mm_setcsr( DEFAULT_MXCSR );
xDouble recip = _mm_div_sd( _mm_load_sd( &one ), X );
if( 0 == (_mm_getcsr() & INEXACT_FLAG ) )
{
X = ipow( recip, -intY );
oldMXCSR |= _mm_getcsr() & ALL_FLAGS;
_mm_setcsr( oldMXCSR );
X = _mm_xor_pd( X, signPatch );
return X;
}
_mm_setcsr( newMXCSR );
}
else
{
X = ipow( X, intY );
oldMXCSR |= _mm_getcsr() & ALL_FLAGS;
_mm_setcsr( oldMXCSR );
X = _mm_xor_pd( X, signPatch );
return X;
}
}
xDouble fabsyEQhalf = _mm_cmpeq_sdm( fabsY, &P1 );
if( _mm_istrue_sd( _mm_and_pd( fabsyEQhalf, xGTzero ) ) )
{
_mm_setcsr( oldMXCSR );
X = _MM_SQRT_SD( X );
if( _mm_istrue_sd( yLTzero ) )
X = _mm_div_sd( _mm_load_sd( &one ), X );
return X;
}
xDouble xLTinf = _mm_cmplt_sdm( X, &plusinf );
xDouble fabsyGT1em20 = _mm_cmpgt_sdm( fabsY, &tenM20 );
xDouble fabsyLT1e20 = _mm_cmplt_sdm( fabsY, &ten20 );
if( _mm_istrue_sd( _mm_and_pd( _mm_and_pd( xGTzero, xLTinf ), _mm_and_pd( fabsyGT1em20, fabsyLT1e20 ) ) ) ) {
xDouble z1, z2, w1, w2;
xDouble t1LTx = _mm_cmpgt_sdm( X, &T1 );
xDouble xLTt2 = _mm_cmplt_sdm( X, &T2 );
if( _mm_istrue_sd( _mm_and_pd( t1LTx, xLTt2 ) ) )
{
xDouble xEQone = _mm_cmpeq_sdm( X, &one );
if( _mm_istrue_sd( xEQone ) )
{
X = _mm_load_sd( &one );
goto exit;
}
xDouble f = _mm_sub_sdm( X, &one );
xDouble f1 = _mm_cvtss_sd( f, _mm_cvtsd_ss( (xFloat)f, f ));
xDouble f2 = _mm_sub_sd( f, f1 );
xDouble g = _mm_add_sdm( f, &two );
g = _mm_div_sd( _mm_load_sd( &one ), g );
xDouble u = _mm_mul_sd( f, g );
u = _mm_add_sd( u, u );
xDouble v = _mm_mul_sd( u, u );
xDouble q = _mm_add_sdm( _mm_mul_sdm( v, &C5 ), &C4 );
q = _mm_add_sdm( _mm_mul_sd( q, v ), &C3 );
q = _mm_add_sdm( _mm_mul_sd( q, v ), &C2 );
q = _mm_add_sdm( _mm_mul_sd( q, v ), &C1 );
v = _mm_mul_sd( v, u );
q = _mm_mul_sd( q, v );
xDouble u1 = _mm_cvtss_sd( u, _mm_cvtsd_ss( (xFloat)u, u ));
xDouble u2 = _mm_sub_sd( f, u1 );
u2 = _mm_add_sd( u2, u2 );
u2 = _mm_sub_sd( u2, _mm_mul_sd( u1, f1 ) );
u2 = _mm_sub_sd( u2, _mm_mul_sd( u1, f2 ) );
u2 = _mm_mul_sd( u2, g );
z2 = _mm_add_sd( q, u2 );
z1 = _mm_add_sd( u1, z2 );
z1 = _mm_cvtss_sd( z1, _mm_cvtsd_ss( (xFloat)z1, z1 ));
z2 = _mm_add_sd( z2, _mm_sub_sd( u1, z1 ));
}
else
{
xDouble xOne = _mm_load_sd( &one );
xDouble isDenormal = _mm_cmplt_sdm( fabsX, &smallestNormal );
xDouble denormBias = _mm_and_pd( xOne, isDenormal );
int isdenorm = _mm_cvtsi128_si32( (xSInt64) isDenormal );
X = _mm_or_pd( X, denormBias );
X = _mm_sub_sd( X, denormBias );
xDouble inf = _mm_load_sd( &plusinf );
xDouble exponent = _mm_and_pd( X, inf);
xDouble x = _mm_andnot_pd( inf, X );
xSInt64 xi = _mm_srli_epi64( (xUInt64) exponent, 52 );
x = _mm_or_pd( x, xOne );
xi = _mm_sub_epi32( xi, bias[1 + isdenorm] );
exponent = _mm_cvtepi32_pd( (xSInt32) xi );
int j = _mm_cvttsd_si32( _mm_add_sdm( _mm_mul_sdm( x, &d128) , &P1 ));
xDouble F = _mm_mul_sdm( _mm_cvtsi32_sd( X, j ), &r128 );
xDouble g = _mm_div_sd( xOne, _mm_add_sd( F, x ) );
xDouble f = _mm_sub_sd( x, F );
xDouble a1 = _mm_add_sdm( _mm_mul_sdm( exponent, &logtable[128*2]), &logtable[(j-128)*2] );
xDouble a2 = _mm_add_sdm( _mm_mul_sdm( exponent, &logtable[128*2]+1), &logtable[(j-128)*2+1] );
xDouble u = _mm_mul_sd( f, g );
u = _mm_add_sd( u, u );
xDouble u1 = _mm_cvtss_sd( u, _mm_cvtsd_ss( (xFloat)u, u ) );
xDouble v = _mm_mul_sd( u, u );
xDouble c = _mm_mul_sd( Y, a1 );
c = _mm_andnot_pd( minusZeroD, c );
xDouble cLTsixteen = _mm_cmplt_sdm( c, &d16 );
xDouble cLToneeighth = _mm_cmplt_sdm( c, &r8 );
xDouble q, u2;
if( _mm_istrue_sd( cLToneeighth ) )
{
u2 = _mm_sub_sd( f, _mm_mul_sd( u1, F ) );
u2 = _mm_add_sd( u2, u2 );
u2 = _mm_sub_sd( u2, _mm_mul_sd( u1, f ) );
u2 = _mm_mul_sd( u2, g );
q = _mm_add_sdm( _mm_mul_sdm( v, &B2 ), &B1 );
q = _mm_mul_sd( q, v );
q = _mm_mul_sd( q, u );
}
else
{
if( _mm_istrue_sd( cLTsixteen ) )
{
u2 = _mm_sub_sd( f, _mm_mul_sd( u1, F ) );
u2 = _mm_add_sd( u2, u2 );
u2 = _mm_sub_sd( u2, _mm_mul_sd( u1, f ) );
u2 = _mm_mul_sd( u2, g );
q = _mm_add_sdm( _mm_mul_sdm( v, &A3 ), &A2 );
q = _mm_add_sdm( _mm_mul_sd( q, v ), &A1 );
q = _mm_mul_sd( _mm_mul_sd( q, v ), u );
}
else
{
xDouble f1 = _mm_cvtss_sd( f, _mm_cvtsd_ss( (xFloat) f, f ));
xDouble f2 = _mm_sub_sd( f, f1 );
u2 = _mm_sub_sd( f, _mm_mul_sd( u1, F ) ); u2 = _mm_add_sd( u2, u2 ); u2 = _mm_sub_sd( u2, _mm_mul_sd( u1, f1 ) ); u2 = _mm_sub_sd( u2, _mm_mul_sd( u1, f2 ) ); u2 = _mm_mul_sd( u2, g );
q = _mm_add_sdm( _mm_mul_sdm( v, &A3 ), &A2 );
q = _mm_add_sdm( _mm_mul_sd( q, v ), &A1 );
q = _mm_mul_sd( _mm_mul_sd( q, v ), u );
}
}
xDouble p = _mm_add_sd( u2, q );
xDouble t = _mm_add_sd( a1, u1 );
a2 = _mm_add_sd( a2, _mm_add_sd( _mm_sub_sd( a1, t), u1 ) );
z2 = _mm_add_sd( p, a2 );
z1 = _mm_add_sd( t, z2 );
z1 = _mm_cvtss_sd( z1, _mm_cvtsd_ss( (xFloat) z1, z1 ));
z2 = _mm_add_sd( z2, _mm_sub_sd( t, z1) );
}
{
xDouble y1 = _mm_cvtss_sd( Y, _mm_cvtsd_ss( (xFloat) Y, Y ));
xDouble y2 = _mm_sub_sd( Y, y1 );
w2 = _mm_add_sd( _mm_mul_sd( y2, z1 ), _mm_mul_sd( y2, z2 ));
w2 = _mm_add_sd( w2, _mm_mul_sd( y1, z2 ) );
w1 = _mm_mul_sd( y1, z1 );
}
xDouble overflow = _mm_add_sd( w1, w2);
xDouble underflow = _mm_cmplt_sdm( overflow, &Emin );
overflow = _mm_cmpgt_sdm( overflow, &Emax );
if( _mm_istrue_sd( _mm_or_pd( overflow, underflow ) ) )
{
int overflowFlag = _mm_cvtsi128_si32( (xUInt64) overflow ) & OVERFLOW_FLAG;
int underflowFlag = _mm_cvtsi128_si32( (xUInt64) underflow ) & UNDERFLOW_FLAG;
oldMXCSR |= overflowFlag | underflowFlag | INEXACT_FLAG;
X = _mm_and_pd( _mm_load_sd( &plusinf ), overflow );
goto exit;
}
{
int N = _mm_cvtsd_si32( _mm_mul_sdm( w1, &Inv_L) );
int j = N & 31;
int M = N >> 5;
xDouble dN = _mm_cvtsi32_sd( w1, N );
xDouble r = _mm_sub_sd( w1, _mm_mul_sdm( dN, &L1 ) );
r = _mm_add_sd( r, w2 );
r = _mm_sub_sd( r, _mm_mul_sdm( dN, &L2 ) );
xDouble p = _mm_add_sdm( _mm_mul_sdm( r, &P5 ), &P4 );
p = _mm_add_sdm( _mm_mul_sd( p, r ), &P3 );
p = _mm_add_sdm( _mm_mul_sd( p, r ), &P2 );
p = _mm_add_sdm( _mm_mul_sd( p, r ), &P1 );
p = _mm_add_sd( _mm_mul_sd( _mm_mul_sd( p, r ), r), r );
xDouble S = _mm_add_sdm( _mm_load_sd( &exptable[ 2 * j ] ), &exptable[ 2 * j +1] );
xDouble t = _mm_add_sdm( _mm_mul_sd( S, p ), &exptable[ 2 * j +1] );
t = _mm_add_sdm( t, &exptable[ 2 * j ] );
X = xscalb(t, M);
oldMXCSR |= _mm_getcsr() & ALL_FLAGS;
goto exit;
}
}
xDouble yIsOddInt = _mm_andnot_pd( yIsEven, yIsInt );
xDouble resultSign = _mm_and_pd( X, minusZeroD );
if( _mm_istrue_sd( xEQzero ) )
{
int div_zero_flag = _mm_cvtsi128_si32( (xSInt64) yLTzero ) & DIVIDE_0_FLAG;
X = _mm_and_pd( _mm_load_sd( &plusinf), yLTzero );
resultSign = _mm_and_pd( yIsOddInt, resultSign );
X = _mm_or_pd( X, resultSign );
oldMXCSR |= div_zero_flag;
goto exit;
}
if( _mm_istrue_sd( _mm_cmpeq_sdm( fabsX, &plusinf ) ) )
{
X = _mm_andnot_pd( yLTzero, _mm_load_sd( &plusinf) );
resultSign = _mm_and_pd( yIsOddInt, resultSign );
X = _mm_or_pd( X, resultSign );
goto exit;
}
if( _mm_istrue_sd( fabsyIsInf ) )
{
xDouble fabsxGTone = _mm_cmpgt_sdm( fabsX, &one );
xDouble isInf = _mm_xor_pd( yLTzero, fabsxGTone );
xDouble isOne = _mm_cmpeq_sdm( X, &mOne ); X = _mm_and_pd( isInf, _mm_load_sd( &plusinf ) );
X = _mm_sel_pd( X, _mm_load_sd( &one ), isOne );
X = _mm_xor_pd( X, signPatch );
goto exit;
}
xDouble fabsxLTone = _mm_cmplt_sdm( fabsX, &one );
xDouble underflow = _mm_xor_pd( fabsxLTone, yLTzero );
xDouble overflow = _mm_andnot_pd( underflow, xLTinf ); xDouble fabsyLTone = _mm_cmplt_sdm( fabsY, &one );
xDouble fabsxEQone = _mm_cmpeq_sdm( fabsX, &one );
underflow = _mm_andnot_pd( fabsyLTone, underflow );
overflow = _mm_andnot_pd( fabsyLTone, overflow );
int overflowMask = _mm_cvtsi128_si32( (xUInt32) overflow ) & OVERFLOW_FLAG;
int underflowMask = _mm_cvtsi128_si32( (xUInt32) underflow ) & UNDERFLOW_FLAG;
int inexactMask = (~ _mm_cvtsi128_si32( (xUInt32) fabsxEQone )) & INEXACT_FLAG;
X = _mm_and_pd( overflow, _mm_load_sd( &plusinf ) );
X = _mm_sel_pd( X, _mm_load_sd( &one), fabsyLTone );
oldMXCSR |= overflowMask | underflowMask | inexactMask;
_mm_setcsr( oldMXCSR );
return X;
exit:
_mm_setcsr( oldMXCSR );
return _mm_xor_pd( X, signPatch );
}
double pow( double x, double y )
{
xDouble xd = DOUBLE_2_XDOUBLE( x );
xDouble yd = DOUBLE_2_XDOUBLE( y );
xd = _pow( xd, yd );
return XDOUBLE_2_DOUBLE( xd );
}
#endif