this repo has no description
1/*
2 * cbrt.c
3 * armLibm
4 *
5 * Created by Jeff Kidder on 5/6/08.
6 * Polynomial by Steve Canon.
7 * Copyright 2008 Apple Inc. All rights reserved.
8 *
9 */
10
11
12/*
13Given y we seek r with r*r*r ~ y.
14Write y = 2^(3n) z (1 + (y-z)/z)
15where z is chosen so cz = cbrt(z) exactly
16and |y-z| < POLY_RANGE
17Then cbrt(y) = 2^n cbrt(z) (1 + p((y-z)/z))
18
19Given y0 reduced into [1,8] we use the bottom two bits of exponent and the first six bits of fraction
20to look up cz, z, zinv with
21z = cz*cz*cz exactly
22and zinv ~ 1/z
23
24Compute w = (y-z)*zinv
25
26The table is designed by looking through all cubes of 17-bit significands
27which fit in 51-bits.
28 */
29
30#include <math.h>
31#include <stdint.h>
32
33#ifndef DAZ
34#define DAZ 1
35#endif
36
37#ifndef FENV_ACCESS_ON
38#define FENV_ACCESS_ON 0
39#endif
40
41#ifndef AVOID_UINT64
42#define AVOID_UINT64 !defined(__x86_64__)
43#endif
44
45//gcc cbrttable.c -o xct -Wall && ./xct
46static const double cbrt_table[][4] = { // z, zinv, cbrt(z), y0
47 { 0x1.0000000000000p+0, 0x1.0000000000000p+0, 0x1.0000000000000p+0, 0x1.000p+0},
48 { 0x1.01ff52f6f7680p+0, 0x1.fc0944da7bf12p-1, 0x1.00aa000000000p+0, 0x1.020p+0},
49 { 0x1.03fe450d748b0p+0, 0x1.f822dcd67af49p-1, 0x1.0153000000000p+0, 0x1.040p+0},
50 { 0x1.05ffd8005fc00p+0, 0x1.f446a644b2ad4p-1, 0x1.01fc000000000p+0, 0x1.060p+0},
51 { 0x1.07fdedafcafb0p+0, 0x1.f08004618b8b3p-1, 0x1.02a3000000000p+0, 0x1.080p+0},
52 { 0x1.09fe97c0b2e80p+0, 0x1.ecc3168ac46e4p-1, 0x1.034a000000000p+0, 0x1.0a0p+0},
53 { 0x1.0bfec00bf0000p+0, 0x1.e91562a43a245p-1, 0x1.03f0000000000p+0, 0x1.0c0p+0},
54 { 0x1.0dfe5c5e25ad0p+0, 0x1.e5769f1123ff8p-1, 0x1.0495000000000p+0, 0x1.0e0p+0},
55 { 0x1.0ffd628732690p+0, 0x1.e1e683fb1c33bp-1, 0x1.0539000000000p+0, 0x1.100p+0},
56 { 0x1.11feebec7a850p+0, 0x1.de5f503ed23bdp-1, 0x1.05dd000000000p+0, 0x1.120p+0},
57 { 0x1.13ffd2a000000p+0, 0x1.dae6557eadd2ep-1, 0x1.0680000000000p+0, 0x1.140p+0},
58 { 0x1.15fce10fe1610p+0, 0x1.d780b05602805p-1, 0x1.0721000000000p+0, 0x1.160p+0},
59 { 0x1.17ff8f34615b0p+0, 0x1.d41dfe67bb981p-1, 0x1.07c3000000000p+0, 0x1.180p+0},
60 { 0x1.19fe50c0a63b0p+0, 0x1.d0ce1fc421c47p-1, 0x1.0863000000000p+0, 0x1.1a0p+0},
61 { 0x1.1bff7df4f31b0p+0, 0x1.cd863be50966cp-1, 0x1.0903000000000p+0, 0x1.1c0p+0},
62 { 0x1.1dffdd62cb880p+0, 0x1.ca4b67cd60a30p-1, 0x1.09a2000000000p+0, 0x1.1e0p+0},
63 { 0x1.1fff64e400000p+0, 0x1.c71d66e4123bep-1, 0x1.0a40000000000p+0, 0x1.200p+0},
64 { 0x1.21fe0a5741850p+0, 0x1.c3fbfdfac741ep-1, 0x1.0add000000000p+0, 0x1.220p+0},
65 { 0x1.23ff0a0459280p+0, 0x1.c0e1ea5c76a8cp-1, 0x1.0b7a000000000p+0, 0x1.240p+0},
66 { 0x1.25ff1b1039980p+0, 0x1.bdd413c3714e1p-1, 0x1.0c16000000000p+0, 0x1.260p+0},
67 { 0x1.27fe335d41110p+0, 0x1.bad2426aa85cbp-1, 0x1.0cb1000000000p+0, 0x1.280p+0},
68 { 0x1.29ff9aaaa2c00p+0, 0x1.b7d7596e80007p-1, 0x1.0d4c000000000p+0, 0x1.2a0p+0},
69 { 0x1.2bfffca2a3580p+0, 0x1.b4e82034f4c4bp-1, 0x1.0de6000000000p+0, 0x1.2c0p+0},
70 { 0x1.2dff4f2c6b7f0p+0, 0x1.b2046226c200bp-1, 0x1.0e7f000000000p+0, 0x1.2e0p+0},
71 { 0x1.2ffd88352c870p+0, 0x1.af2bebe0bbfcbp-1, 0x1.0f17000000000p+0, 0x1.300p+0},
72 { 0x1.31fdfea9140f0p+0, 0x1.ac59d0441d895p-1, 0x1.0faf000000000p+0, 0x1.320p+0},
73 { 0x1.33fd4f07fbd80p+0, 0x1.a992adfec1582p-1, 0x1.1046000000000p+0, 0x1.340p+0},
74 { 0x1.35fed7c563850p+0, 0x1.a6d1ae764bb51p-1, 0x1.10dd000000000p+0, 0x1.360p+0},
75 { 0x1.37ff2dd5dfeb0p+0, 0x1.a41b5ca078b6cp-1, 0x1.1173000000000p+0, 0x1.380p+0},
76 { 0x1.39fe472d82000p+0, 0x1.a16f89a08f150p-1, 0x1.1208000000000p+0, 0x1.3a0p+0},
77 { 0x1.3bff8d8172c50p+0, 0x1.9ec97f9a8da23p-1, 0x1.129d000000000p+0, 0x1.3c0p+0},
78 { 0x1.3dff8a8664910p+0, 0x1.9c2dad3273edcp-1, 0x1.1331000000000p+0, 0x1.3e0p+0},
79 { 0x1.3ffe343874400p+0, 0x1.999be62171209p-1, 0x1.13c4000000000p+0, 0x1.400p+0},
80 { 0x1.41feff7b08470p+0, 0x1.970f93c925efcp-1, 0x1.1457000000000p+0, 0x1.420p+0},
81 { 0x1.43fe6ad7ff790p+0, 0x1.948d09afad30dp-1, 0x1.14e9000000000p+0, 0x1.440p+0},
82 { 0x1.45fff29b8c030p+0, 0x1.920fc5216d6aep-1, 0x1.157b000000000p+0, 0x1.460p+0},
83 { 0x1.47fc83ee37330p+0, 0x1.8fa057d9553bap-1, 0x1.160b000000000p+0, 0x1.480p+0},
84 { 0x1.49feb2bc0dc00p+0, 0x1.8d31a9f2d47fbp-1, 0x1.169c000000000p+0, 0x1.4a0p+0},
85 { 0x1.4bff687f1cc00p+0, 0x1.8acc451fcfb49p-1, 0x1.172c000000000p+0, 0x1.4c0p+0},
86 { 0x1.4dfe9b4104c30p+0, 0x1.887002348663ap-1, 0x1.17bb000000000p+0, 0x1.4e0p+0},
87 { 0x1.4fffd9b64ee80p+0, 0x1.86188df9db60ep-1, 0x1.184a000000000p+0, 0x1.500p+0},
88 { 0x1.51ff889bc6000p+0, 0x1.83ca00a5a8f32p-1, 0x1.18d8000000000p+0, 0x1.520p+0},
89 { 0x1.53fd9e064b9d0p+0, 0x1.81843523cc8a7p-1, 0x1.1965000000000p+0, 0x1.540p+0},
90 { 0x1.55fdb39fad480p+0, 0x1.7f42f32ce62adp-1, 0x1.19f2000000000p+0, 0x1.560p+0},
91 { 0x1.57ffca688f7f0p+0, 0x1.7d062f73dabb5p-1, 0x1.1a7f000000000p+0, 0x1.580p+0},
92 { 0x1.59fc8db9a7e80p+0, 0x1.7ad5e68ed5f8cp-1, 0x1.1b0a000000000p+0, 0x1.5a0p+0},
93 { 0x1.5bfef420a3980p+0, 0x1.78a5ea042bcf5p-1, 0x1.1b96000000000p+0, 0x1.5c0p+0},
94 { 0x1.5dffa558e0610p+0, 0x1.767e2f4271824p-1, 0x1.1c21000000000p+0, 0x1.5e0p+0},
95 { 0x1.5ffe978200130p+0, 0x1.745e94a033f66p-1, 0x1.1cab000000000p+0, 0x1.600p+0},
96 { 0x1.61ff79fee48d0p+0, 0x1.7243141d712b5p-1, 0x1.1d35000000000p+0, 0x1.620p+0},
97 { 0x1.63fe90eb04f80p+0, 0x1.702f816650015p-1, 0x1.1dbe000000000p+0, 0x1.640p+0},
98 { 0x1.65ff92d8b0170p+0, 0x1.6e1fe655abc69p-1, 0x1.1e47000000000p+0, 0x1.660p+0},
99 { 0x1.67febcb6716f0p+0, 0x1.6c180862ccf0dp-1, 0x1.1ecf000000000p+0, 0x1.680p+0},
100 { 0x1.69ffcc3fb9470p+0, 0x1.6a1400d859f3ep-1, 0x1.1f57000000000p+0, 0x1.6a0p+0},
101 { 0x1.6bfef73ce6780p+0, 0x1.6817875379f1cp-1, 0x1.1fde000000000p+0, 0x1.6c0p+0},
102 { 0x1.6dfc33e542400p+0, 0x1.66227ddbe3339p-1, 0x1.2064000000000p+0, 0x1.6e0p+0},
103 { 0x1.6fff1cd666d30p+0, 0x1.642d616dfe741p-1, 0x1.20eb000000000p+0, 0x1.700p+0},
104 { 0x1.71fc3c5870000p+0, 0x1.6243421ae7a84p-1, 0x1.2170000000000p+0, 0x1.720p+0},
105 { 0x1.73ff09dbd4180p+0, 0x1.6058ff28cfec5p-1, 0x1.21f6000000000p+0, 0x1.740p+0},
106 { 0x1.75ffd7375b030p+0, 0x1.5e75e1c484452p-1, 0x1.227b000000000p+0, 0x1.760p+0},
107 { 0x1.77fe9aa868ff0p+0, 0x1.5c99ce06a4e7cp-1, 0x1.22ff000000000p+0, 0x1.780p+0},
108 { 0x1.79ff2e4cfe9b0p+0, 0x1.5ac1170d9d9c5p-1, 0x1.2383000000000p+0, 0x1.7a0p+0},
109 { 0x1.7bfdab9b30d80p+0, 0x1.58ef4064450c1p-1, 0x1.2406000000000p+0, 0x1.7c0p+0},
110 { 0x1.7dfdf3b868590p+0, 0x1.5720aab2d03bfp-1, 0x1.2489000000000p+0, 0x1.7e0p+0},
111 { 0x1.7ffc19187c330p+0, 0x1.5558cd4897700p-1, 0x1.250b000000000p+0, 0x1.800p+0},
112 { 0x1.81fff5b8acb80p+0, 0x1.53909d9a091b4p-1, 0x1.258e000000000p+0, 0x1.820p+0},
113 { 0x1.83fdb4db3f2f0p+0, 0x1.51d27de463703p-1, 0x1.260f000000000p+0, 0x1.840p+0},
114 { 0x1.85fd33ff90000p+0, 0x1.50176a58004f0p-1, 0x1.2690000000000p+0, 0x1.860p+0},
115 { 0x1.87fe73ea28310p+0, 0x1.4e5f5c4e64e37p-1, 0x1.2711000000000p+0, 0x1.880p+0},
116 { 0x1.89fd759d99b10p+0, 0x1.4cadad9b3188bp-1, 0x1.2791000000000p+0, 0x1.8a0p+0},
117 { 0x1.8bfe32aa8b310p+0, 0x1.4afeeba007be7p-1, 0x1.2811000000000p+0, 0x1.8c0p+0},
118 { 0x1.8dfca52590000p+0, 0x1.495664ea7f47dp-1, 0x1.2890000000000p+0, 0x1.8e0p+0},
119 { 0x1.8ffccd8c282f0p+0, 0x1.47b0b2fa2bda1p-1, 0x1.290f000000000p+0, 0x1.900p+0},
120 { 0x1.91feac99dcb80p+0, 0x1.460dcfc6ed440p-1, 0x1.298e000000000p+0, 0x1.920p+0},
121 { 0x1.93fe3206e6c00p+0, 0x1.4470f955a1827p-1, 0x1.2a0c000000000p+0, 0x1.940p+0},
122 { 0x1.95ff68a951e80p+0, 0x1.42d6dab45c848p-1, 0x1.2a8a000000000p+0, 0x1.960p+0},
123 { 0x1.97fe3958b2570p+0, 0x1.4142a7401970ep-1, 0x1.2b07000000000p+0, 0x1.980p+0},
124 { 0x1.99feb5cb28400p+0, 0x1.3fb115744cd56p-1, 0x1.2b84000000000p+0, 0x1.9a0p+0},
125 { 0x1.9bfcc00000000p+0, 0x1.3e254e465d72cp-1, 0x1.2c00000000000p+0, 0x1.9c0p+0},
126 { 0x1.9dfc708557c00p+0, 0x1.3c9c1357411b6p-1, 0x1.2c7c000000000p+0, 0x1.9e0p+0},
127 { 0x1.9ffdc809be000p+0, 0x1.3b155f697ed3ap-1, 0x1.2cf8000000000p+0, 0x1.a00p+0},
128 { 0x1.a1fc9e5153eb0p+0, 0x1.39944c2e925eap-1, 0x1.2d73000000000p+0, 0x1.a20p+0},
129 { 0x1.a3fd162291380p+0, 0x1.3815ab70c411ep-1, 0x1.2dee000000000p+0, 0x1.a40p+0},
130 { 0x1.a5ff3027d3f90p+0, 0x1.36997838092b7p-1, 0x1.2e69000000000p+0, 0x1.a60p+0},
131 { 0x1.a7feb9f2d5bb0p+0, 0x1.3522bd6b8de66p-1, 0x1.2ee3000000000p+0, 0x1.a80p+0},
132 { 0x1.a9ffe079fb050p+0, 0x1.33ae5c7a1ab67p-1, 0x1.2f5d000000000p+0, 0x1.aa0p+0},
133 { 0x1.abfe6a8b1e980p+0, 0x1.323f56c09d10dp-1, 0x1.2fd6000000000p+0, 0x1.ac0p+0},
134 { 0x1.adfe8be115ef0p+0, 0x1.30d297ddf683ap-1, 0x1.304f000000000p+0, 0x1.ae0p+0},
135 { 0x1.affc048ecf970p+0, 0x1.2f6b17dd4ba38p-1, 0x1.30c7000000000p+0, 0x1.b00p+0},
136 { 0x1.b1ff52f400000p+0, 0x1.2e02d4701d501p-1, 0x1.3140000000000p+0, 0x1.b20p+0},
137 { 0x1.b3fff337ce000p+0, 0x1.2c9fbda84458dp-1, 0x1.31b8000000000p+0, 0x1.b40p+0},
138 { 0x1.b5fddbe6eb8f0p+0, 0x1.2b41c14adb3a1p-1, 0x1.322f000000000p+0, 0x1.b60p+0},
139 { 0x1.b7fd518be4580p+0, 0x1.29e5e36014bd4p-1, 0x1.32a6000000000p+0, 0x1.b80p+0},
140 { 0x1.b9fe54c100450p+0, 0x1.288c1fce9874bp-1, 0x1.331d000000000p+0, 0x1.ba0p+0},
141 { 0x1.bbfc917f394b0p+0, 0x1.273753a633b82p-1, 0x1.3393000000000p+0, 0x1.bc0p+0},
142 { 0x1.bdfc56545ed90p+0, 0x1.25e490e965a48p-1, 0x1.3409000000000p+0, 0x1.be0p+0},
143 { 0x1.bffda3d6dd7f0p+0, 0x1.2493d3b473c59p-1, 0x1.347f000000000p+0, 0x1.c00p+0},
144 { 0x1.c1fc1c0569400p+0, 0x1.2347ec39d66b0p-1, 0x1.34f4000000000p+0, 0x1.c20p+0},
145 { 0x1.c3fc176738f90p+0, 0x1.21fdfa077410fp-1, 0x1.3569000000000p+0, 0x1.c40p+0},
146 { 0x1.c5fd968eee780p+0, 0x1.20b5f96c5276cp-1, 0x1.35de000000000p+0, 0x1.c60p+0},
147 { 0x1.c7fc318b71c80p+0, 0x1.1f72ae201c271p-1, 0x1.3652000000000p+0, 0x1.c80p+0},
148 { 0x1.c9fc4ad339d80p+0, 0x1.1e3144d16fd97p-1, 0x1.36c6000000000p+0, 0x1.ca0p+0},
149 { 0x1.cbfde2f52e280p+0, 0x1.1cf1b9ff60523p-1, 0x1.373a000000000p+0, 0x1.cc0p+0},
150 { 0x1.cdfc881b2e750p+0, 0x1.1bb6c545bdcc4p-1, 0x1.37ad000000000p+0, 0x1.ce0p+0},
151 { 0x1.cffca6a080000p+0, 0x1.1a7da00d343a3p-1, 0x1.3820000000000p+0, 0x1.d00p+0},
152 { 0x1.d1fe3f10604b0p+0, 0x1.1946470258170p-1, 0x1.3893000000000p+0, 0x1.d20p+0},
153 { 0x1.d3fcd5bab37d0p+0, 0x1.18136600a7357p-1, 0x1.3905000000000p+0, 0x1.d40p+0},
154 { 0x1.d5fce0d4d1a70p+0, 0x1.16e242c804dcap-1, 0x1.3977000000000p+0, 0x1.d60p+0},
155 { 0x1.d7fe60e65e790p+0, 0x1.15b2da30214b8p-1, 0x1.39e9000000000p+0, 0x1.d80p+0},
156 { 0x1.d9fcd07097a80p+0, 0x1.1487ccac6a7c7p-1, 0x1.3a5a000000000p+0, 0x1.da0p+0},
157 { 0x1.dbfcaf77e3730p+0, 0x1.135e6bf4cdb3cp-1, 0x1.3acb000000000p+0, 0x1.dc0p+0},
158 { 0x1.ddfdfe805bc00p+0, 0x1.1236b509d4023p-1, 0x1.3b3c000000000p+0, 0x1.de0p+0},
159 { 0x1.dffc2e4834c00p+0, 0x1.11133d4bfd103p-1, 0x1.3bac000000000p+0, 0x1.e00p+0},
160 { 0x1.e1fbc89795c00p+0, 0x1.0ff1620f911f9p-1, 0x1.3c1c000000000p+0, 0x1.e20p+0},
161 { 0x1.e3fccdef1ec00p+0, 0x1.0ed1207bcff2ep-1, 0x1.3c8c000000000p+0, 0x1.e40p+0},
162 { 0x1.e5ff3ecf6fc00p+0, 0x1.0db275be001a6p-1, 0x1.3cfc000000000p+0, 0x1.e60p+0},
163 { 0x1.e7fe7efef0530p+0, 0x1.0c97e8e372825p-1, 0x1.3d6b000000000p+0, 0x1.e80p+0},
164 { 0x1.e9ff253c51a80p+0, 0x1.0b7ee62f4c332p-1, 0x1.3dda000000000p+0, 0x1.ea0p+0},
165 { 0x1.ebfc8edc32000p+0, 0x1.0a69edc7b41dbp-1, 0x1.3e48000000000p+0, 0x1.ec0p+0},
166 { 0x1.edffff705d670p+0, 0x1.0953f3dd361c7p-1, 0x1.3eb7000000000p+0, 0x1.ee0p+0},
167 { 0x1.effb845986400p+0, 0x1.084473fb1fdadp-1, 0x1.3f24000000000p+0, 0x1.f00p+0},
168 { 0x1.f1fd112ab0c80p+0, 0x1.0733ed7907e73p-1, 0x1.3f92000000000p+0, 0x1.f20p+0},
169 { 0x1.f400000000000p+0, 0x1.0624dd2f1a9fcp-1, 0x1.4000000000000p+0, 0x1.f40p+0},
170 { 0x1.f5ff9e1d82b50p+0, 0x1.0519b266e0edep-1, 0x1.406d000000000p+0, 0x1.f60p+0},
171 { 0x1.f7fbe263ab490p+0, 0x1.041260b1fc714p-1, 0x1.40d9000000000p+0, 0x1.f80p+0},
172 { 0x1.f9fe36d7a7d80p+0, 0x1.030a055aebeddp-1, 0x1.4146000000000p+0, 0x1.fa0p+0},
173 { 0x1.fbfd2bfe5a480p+0, 0x1.020577cc283d6p-1, 0x1.41b2000000000p+0, 0x1.fc0p+0},
174 { 0x1.fdfd78ac81780p+0, 0x1.0102473781e2ep-1, 0x1.421e000000000p+0, 0x1.fe0p+0},
175 { 0x1.ffff1d5571e80p+0, 0x1.0000715579388p-1, 0x1.428a000000000p+0, 0x1.000p+1},
176 { 0x1.01fe6eb8c0000p+1, 0x1.fc0b064e0ed42p-2, 0x1.4360000000000p+0, 0x1.020p+1},
177 { 0x1.03fff4b10b8c0p+1, 0x1.f81f97e54183ap-2, 0x1.4436000000000p+0, 0x1.040p+1},
178 { 0x1.05ff4c356ff40p+1, 0x1.f447b132ca3acp-2, 0x1.450a000000000p+0, 0x1.060p+1},
179 { 0x1.07fed2419d428p+1, 0x1.f07e5681bb219p-2, 0x1.45dd000000000p+0, 0x1.080p+1},
180 { 0x1.09fe7f156c878p+1, 0x1.ecc3443e00aeap-2, 0x1.46af000000000p+0, 0x1.0a0p+1},
181 { 0x1.0bfe4af000000p+1, 0x1.e916385d22026p-2, 0x1.4780000000000p+0, 0x1.0c0p+1},
182 { 0x1.0dfe2e0fe8000p+1, 0x1.e576f253c657bp-2, 0x1.4850000000000p+0, 0x1.0e0p+1},
183 { 0x1.0ffe20b347af8p+1, 0x1.e1e5330b8cb6ap-2, 0x1.491f000000000p+0, 0x1.100p+1},
184 { 0x1.11fe1b17f99a8p+1, 0x1.de60bcd933127p-2, 0x1.49ed000000000p+0, 0x1.120p+1},
185 { 0x1.13fe157bb4140p+1, 0x1.dae953730a179p-2, 0x1.4aba000000000p+0, 0x1.140p+1},
186 { 0x1.15fe081c2d6c0p+1, 0x1.d77ebbe7b308bp-2, 0x1.4b86000000000p+0, 0x1.160p+1},
187 { 0x1.17fdeb373ff88p+1, 0x1.d420bc9525242p-2, 0x1.4c51000000000p+0, 0x1.180p+1},
188 { 0x1.19fdb70b0df18p+1, 0x1.d0cf1d1ff8234p-2, 0x1.4d1b000000000p+0, 0x1.1a0p+1},
189 { 0x1.1bfff110868e8p+1, 0x1.cd8580d5a9203p-2, 0x1.4de5000000000p+0, 0x1.1c0p+1},
190 { 0x1.1dff7a217dba8p+1, 0x1.ca4c06da42de5p-2, 0x1.4ead000000000p+0, 0x1.1e0p+1},
191 { 0x1.1ffed4a690a00p+1, 0x1.c71e4ad4c7f13p-2, 0x1.4f74000000000p+0, 0x1.200p+1},
192 { 0x1.21fdf8e05d140p+1, 0x1.c3fc193327136p-2, 0x1.503a000000000p+0, 0x1.220p+1},
193 { 0x1.23ff788000000p+1, 0x1.c0e1408494bbcp-2, 0x1.5100000000000p+0, 0x1.240p+1},
194 { 0x1.25fe1bf00a200p+1, 0x1.bdd596a6d86afp-2, 0x1.51c4000000000p+0, 0x1.260p+1},
195 { 0x1.27ff1159f1000p+1, 0x1.bad0f650df847p-2, 0x1.5288000000000p+0, 0x1.280p+1},
196 { 0x1.29ffb78cd0798p+1, 0x1.b7d72eccd2063p-2, 0x1.534b000000000p+0, 0x1.2a0p+1},
197 { 0x1.2bfd613ee3600p+1, 0x1.b4ebec32620a1p-2, 0x1.540c000000000p+0, 0x1.2c0p+1},
198 { 0x1.2dfff74f29dc0p+1, 0x1.b203708429799p-2, 0x1.54ce000000000p+0, 0x1.2e0p+1},
199 { 0x1.2fff8163765c0p+1, 0x1.af291f5c88af1p-2, 0x1.558e000000000p+0, 0x1.300p+1},
200 { 0x1.31fe9d4aa4aa8p+1, 0x1.ac58f2343e704p-2, 0x1.564d000000000p+0, 0x1.320p+1},
201 { 0x1.33fff4d36b600p+1, 0x1.a98f0577115b3p-2, 0x1.570c000000000p+0, 0x1.340p+1},
202 { 0x1.35fe202fff0c8p+1, 0x1.a6d2a8dd1463fp-2, 0x1.57c9000000000p+0, 0x1.360p+1},
203 { 0x1.37fe7db2eb6c0p+1, 0x1.a41c49cc6d94fp-2, 0x1.5886000000000p+0, 0x1.380p+1},
204 { 0x1.39fe541ac7840p+1, 0x1.a16f787114257p-2, 0x1.5942000000000p+0, 0x1.3a0p+1},
205 { 0x1.3bfd9bb03ef28p+1, 0x1.9ecc0d110a8a2p-2, 0x1.59fd000000000p+0, 0x1.3c0p+1},
206 { 0x1.3dff0d1d47000p+1, 0x1.9c2e4fc0421fep-2, 0x1.5ab8000000000p+0, 0x1.3e0p+1},
207 { 0x1.3fffe635cfa40p+1, 0x1.9999ba9c69854p-2, 0x1.5b72000000000p+0, 0x1.400p+1},
208 { 0x1.41fd58fd78b40p+1, 0x1.9711a9e674cc2p-2, 0x1.5c2a000000000p+0, 0x1.420p+1},
209 { 0x1.43ffb09017dd8p+1, 0x1.948b72fcbd74cp-2, 0x1.5ce3000000000p+0, 0x1.440p+1},
210 { 0x1.45fe926c3b540p+1, 0x1.9211777e6b069p-2, 0x1.5d9a000000000p+0, 0x1.460p+1},
211 { 0x1.47ff8c393af88p+1, 0x1.8f9ca60787426p-2, 0x1.5e51000000000p+0, 0x1.480p+1},
212 { 0x1.49ffcd0f472b8p+1, 0x1.8d305622d9ea4p-2, 0x1.5f07000000000p+0, 0x1.4a0p+1},
213 { 0x1.4bff4d3e99e00p+1, 0x1.8acc65880024fp-2, 0x1.5fbc000000000p+0, 0x1.4c0p+1},
214 { 0x1.4dfe051ab8000p+1, 0x1.8870b2a123748p-2, 0x1.6070000000000p+0, 0x1.4e0p+1},
215 { 0x1.4ffec7aef3200p+1, 0x1.8619cc20b8cf4p-2, 0x1.6124000000000p+0, 0x1.500p+1},
216 { 0x1.51feb8683c638p+1, 0x1.83caef8563317p-2, 0x1.61d7000000000p+0, 0x1.520p+1},
217 { 0x1.53fdcf9ca12c8p+1, 0x1.8183fce9b0418p-2, 0x1.6289000000000p+0, 0x1.540p+1},
218 { 0x1.55fee906d1a18p+1, 0x1.7f4198707d934p-2, 0x1.633b000000000p+0, 0x1.560p+1},
219 { 0x1.57ff1f6250600p+1, 0x1.7d06ece2cbd90p-2, 0x1.63ec000000000p+0, 0x1.580p+1},
220 { 0x1.59fe6b0856e00p+1, 0x1.7ad3dbf1d07c5p-2, 0x1.649c000000000p+0, 0x1.5a0p+1},
221 { 0x1.5bffb05791600p+1, 0x1.78a51e4e89e8dp-2, 0x1.654c000000000p+0, 0x1.5c0p+1},
222 { 0x1.5dfd128783940p+1, 0x1.7680f0344cfa3p-2, 0x1.65fa000000000p+0, 0x1.5e0p+1},
223 { 0x1.5fff5691fc5c8p+1, 0x1.745dca8168ee1p-2, 0x1.66a9000000000p+0, 0x1.600p+1},
224 { 0x1.61fda83b744c0p+1, 0x1.7244fb4988919p-2, 0x1.6756000000000p+0, 0x1.620p+1},
225 { 0x1.63fde632fc0d8p+1, 0x1.703031f757122p-2, 0x1.6803000000000p+0, 0x1.640p+1},
226 { 0x1.65fd17207f878p+1, 0x1.6e227080885dcp-2, 0x1.68af000000000p+0, 0x1.660p+1},
227 { 0x1.67fe308281518p+1, 0x1.6c18962f9c4e0p-2, 0x1.695b000000000p+0, 0x1.680p+1},
228 { 0x1.69fe33505c6c0p+1, 0x1.6a1599e058224p-2, 0x1.6a06000000000p+0, 0x1.6a0p+1},
229 { 0x1.6bfd17f098000p+1, 0x1.6819617e32041p-2, 0x1.6ab0000000000p+0, 0x1.6c0p+1},
230 { 0x1.6dfddc60e1d40p+1, 0x1.6620de7d14ff3p-2, 0x1.6b5a000000000p+0, 0x1.6e0p+1},
231 { 0x1.6ffd791b320d8p+1, 0x1.642ef7afe7ed9p-2, 0x1.6c03000000000p+0, 0x1.700p+1},
232 { 0x1.71fef1bff2600p+1, 0x1.6240aa2fa0dfdp-2, 0x1.6cac000000000p+0, 0x1.720p+1},
233 { 0x1.73ff3924fda00p+1, 0x1.6058d25f0f1d2p-2, 0x1.6d54000000000p+0, 0x1.740p+1},
234 { 0x1.75fe47b79cc18p+1, 0x1.5e77582101fccp-2, 0x1.6dfb000000000p+0, 0x1.760p+1},
235 { 0x1.77ff298583c40p+1, 0x1.5c99499255997p-2, 0x1.6ea2000000000p+0, 0x1.780p+1},
236 { 0x1.79fec8fa79000p+1, 0x1.5ac1740057116p-2, 0x1.6f48000000000p+0, 0x1.7a0p+1},
237 { 0x1.7bfd1e8a5a9a8p+1, 0x1.58efc071ad723p-2, 0x1.6fed000000000p+0, 0x1.7c0p+1},
238 { 0x1.7dfd3ea25e640p+1, 0x1.57214d5c9f55fp-2, 0x1.7092000000000p+0, 0x1.7e0p+1},
239 { 0x1.7fff2a1026738p+1, 0x1.5556138047c4dp-2, 0x1.7137000000000p+0, 0x1.800p+1},
240 { 0x1.81ffc01990118p+1, 0x1.5390ccc5d4dcbp-2, 0x1.71db000000000p+0, 0x1.820p+1},
241 { 0x1.83fef935eefc0p+1, 0x1.51d1637b58131p-2, 0x1.727e000000000p+0, 0x1.840p+1},
242 { 0x1.85fff4ed12b08p+1, 0x1.50150adb1403fp-2, 0x1.7321000000000p+0, 0x1.860p+1},
243 { 0x1.87ff8a34e2ad8p+1, 0x1.4e5e6eecb42a3p-2, 0x1.73c3000000000p+0, 0x1.880p+1},
244 { 0x1.89fdb18c81200p+1, 0x1.4cad7afff0972p-2, 0x1.7464000000000p+0, 0x1.8a0p+1},
245 { 0x1.8bfd92c223be8p+1, 0x1.4aff7149754e8p-2, 0x1.7505000000000p+0, 0x1.8c0p+1},
246 { 0x1.8dff2e94d42c0p+1, 0x1.49544b844d5bap-2, 0x1.75a6000000000p+0, 0x1.8e0p+1},
247 { 0x1.8fff50f881ec0p+1, 0x1.47aea3dd6c456p-2, 0x1.7646000000000p+0, 0x1.900p+1},
248 { 0x1.91fdf271280e8p+1, 0x1.460e66c512f7ap-2, 0x1.76e5000000000p+0, 0x1.920p+1},
249 { 0x1.93fe45c4b4200p+1, 0x1.4470e97afe4a4p-2, 0x1.7784000000000p+0, 0x1.940p+1},
250 { 0x1.95fd0eb31cc40p+1, 0x1.42d8b9616138fp-2, 0x1.7822000000000p+0, 0x1.960p+1},
251 { 0x1.97fd857600000p+1, 0x1.414334e568ed9p-2, 0x1.78c0000000000p+0, 0x1.980p+1},
252 { 0x1.99ffaac1ec3c0p+1, 0x1.3fb056724ebb2p-2, 0x1.795e000000000p+0, 0x1.9a0p+1},
253 { 0x1.9bfcf50bbb940p+1, 0x1.3e25254fd0abap-2, 0x1.79fa000000000p+0, 0x1.9c0p+1},
254 { 0x1.9dff2c38eb838p+1, 0x1.3c99fc3c0ecc7p-2, 0x1.7a97000000000p+0, 0x1.9e0p+1},
255 { 0x1.9fffc4098f958p+1, 0x1.3b13dea578788p-2, 0x1.7b33000000000p+0, 0x1.a00p+1},
256 { 0x1.a1feb50d73dc0p+1, 0x1.3992bb06457b4p-2, 0x1.7bce000000000p+0, 0x1.a20p+1},
257 { 0x1.a3ff47c4aefc8p+1, 0x1.38140a1c79146p-2, 0x1.7c69000000000p+0, 0x1.a40p+1},
258 { 0x1.a5fe2a3c978d8p+1, 0x1.369a38ffc6242p-2, 0x1.7d03000000000p+0, 0x1.a60p+1},
259 { 0x1.a7feaa57fde28p+1, 0x1.3522c8cc34702p-2, 0x1.7d9d000000000p+0, 0x1.a80p+1},
260 { 0x1.a9fd70c4078c0p+1, 0x1.33b01ef76839dp-2, 0x1.7e36000000000p+0, 0x1.aa0p+1},
261 { 0x1.abfdd0c1c8b78p+1, 0x1.323fc4cb2b3e1p-2, 0x1.7ecf000000000p+0, 0x1.ac0p+1},
262 { 0x1.adffcaf535000p+1, 0x1.30d1b5accf7d2p-2, 0x1.7f68000000000p+0, 0x1.ae0p+1},
263 { 0x1.b000000000000p+1, 0x1.2f684bda12f68p-2, 0x1.8000000000000p+0, 0x1.b00p+1},
264 { 0x1.b1fe688084838p+1, 0x1.2e037796f3561p-2, 0x1.8097000000000p+0, 0x1.b20p+1},
265 { 0x1.b3fe626b241c0p+1, 0x1.2ca0d203aca14p-2, 0x1.812e000000000p+0, 0x1.b40p+1},
266 { 0x1.b5ffee5d79de8p+1, 0x1.2b4056dc7efdfp-2, 0x1.81c5000000000p+0, 0x1.b60p+1},
267 { 0x1.b7ffa2510ad18p+1, 0x1.29e4520b5d433p-2, 0x1.825b000000000p+0, 0x1.b80p+1},
268 { 0x1.b9fd76ec78000p+1, 0x1.288cb4a41a9b5p-2, 0x1.82f0000000000p+0, 0x1.ba0p+1},
269 { 0x1.bbfcd4c4a37e8p+1, 0x1.273726eb58088p-2, 0x1.8385000000000p+0, 0x1.bc0p+1},
270 { 0x1.bdfdbc70fa540p+1, 0x1.25e3a4edaa4cbp-2, 0x1.841a000000000p+0, 0x1.be0p+1},
271 { 0x1.bffcb956c91c0p+1, 0x1.24946cdb00998p-2, 0x1.84ae000000000p+0, 0x1.c00p+1},
272 { 0x1.c1fd3bf5cf840p+1, 0x1.234731d751cccp-2, 0x1.8542000000000p+0, 0x1.c20p+1},
273 { 0x1.c3ff44e2734c0p+1, 0x1.21fbf01dbcc84p-2, 0x1.85d6000000000p+0, 0x1.c40p+1},
274 { 0x1.c5ff5798adfc8p+1, 0x1.20b4dbddb8b22p-2, 0x1.8669000000000p+0, 0x1.c60p+1},
275 { 0x1.c7fd6cc9c6418p+1, 0x1.1f71e766caf88p-2, 0x1.86fb000000000p+0, 0x1.c80p+1},
276 { 0x1.c9fcff7c918a8p+1, 0x1.1e30d3ecab2d3p-2, 0x1.878d000000000p+0, 0x1.ca0p+1},
277 { 0x1.cbfe103f862f8p+1, 0x1.1cf19df136177p-2, 0x1.881f000000000p+0, 0x1.cc0p+1},
278 { 0x1.cdfd181598000p+1, 0x1.1bb66cda74540p-2, 0x1.88b0000000000p+0, 0x1.ce0p+1},
279 { 0x1.cffd99dca5e08p+1, 0x1.1a7d0bf6948b7p-2, 0x1.8941000000000p+0, 0x1.d00p+1},
280 { 0x1.d1ff96203de40p+1, 0x1.194577f0415c8p-2, 0x1.89d2000000000p+0, 0x1.d20p+1},
281 { 0x1.d3ff7e0eea440p+1, 0x1.1811cedb334c3p-2, 0x1.8a62000000000p+0, 0x1.d40p+1},
282 { 0x1.d5fd4a6639e88p+1, 0x1.16e20423988e5p-2, 0x1.8af1000000000p+0, 0x1.d60p+1},
283 { 0x1.d7fc887000000p+1, 0x1.15b3f02aaa7f7p-2, 0x1.8b80000000000p+0, 0x1.d80p+1},
284 { 0x1.d9fd38b218978p+1, 0x1.14878fd9777fbp-2, 0x1.8c0f000000000p+0, 0x1.da0p+1},
285 { 0x1.dbff5bb25fbc0p+1, 0x1.135ce01fba91bp-2, 0x1.8c9e000000000p+0, 0x1.dc0p+1},
286 { 0x1.ddff55aa1e600p+1, 0x1.1235f02ce295ap-2, 0x1.8d2c000000000p+0, 0x1.de0p+1},
287 { 0x1.dffd1f5f09f48p+1, 0x1.1112b422eaaf9p-2, 0x1.8db9000000000p+0, 0x1.e00p+1},
288 { 0x1.e1fff478800b8p+1, 0x1.0fef07911ab67p-2, 0x1.8e47000000000p+0, 0x1.e20p+1},
289 { 0x1.e3fcf12a08858p+1, 0x1.0ed10cc540ecbp-2, 0x1.8ed3000000000p+0, 0x1.e40p+1},
290 { 0x1.e5fefa40c0000p+1, 0x1.0db29bc986108p-2, 0x1.8f60000000000p+0, 0x1.e60p+1},
291 { 0x1.e7fec5a970600p+1, 0x1.0c97c1fe67aafp-2, 0x1.8fec000000000p+0, 0x1.e80p+1},
292 { 0x1.e9fff7e32f000p+1, 0x1.0b7e733018fafp-2, 0x1.9078000000000p+0, 0x1.ea0p+1},
293 { 0x1.ebfee329a58d8p+1, 0x1.0a68aae26ff8bp-2, 0x1.9103000000000p+0, 0x1.ec0p+1},
294 { 0x1.edff311c5e5c0p+1, 0x1.095462af12046p-2, 0x1.918e000000000p+0, 0x1.ee0p+1},
295 { 0x1.effd2edcdb000p+1, 0x1.084390bb22179p-2, 0x1.9218000000000p+0, 0x1.f00p+1},
296 { 0x1.f1fc8b255bc40p+1, 0x1.0734344eaebefp-2, 0x1.92a2000000000p+0, 0x1.f20p+1},
297 { 0x1.f3fd466e2e600p+1, 0x1.06264aeb4dfe1p-2, 0x1.932c000000000p+0, 0x1.f40p+1},
298 { 0x1.f5ff612fa08c0p+1, 0x1.0519d217b1777p-2, 0x1.93b6000000000p+0, 0x1.f60p+1},
299 { 0x1.f7ff1e5d465f8p+1, 0x1.0410b571c6692p-2, 0x1.943f000000000p+0, 0x1.f80p+1},
300 { 0x1.f9fc76d31dcb8p+1, 0x1.030aeab7a83cep-2, 0x1.94c7000000000p+0, 0x1.fa0p+1},
301 { 0x1.fbfee88f68000p+1, 0x1.020495fe39c9dp-2, 0x1.9550000000000p+0, 0x1.fc0p+1},
302 { 0x1.fdfef16dc3000p+1, 0x1.0101895a920fbp-2, 0x1.95d8000000000p+0, 0x1.fe0p+1},
303 { 0x1.fffc8a4e2b8f8p+1, 0x1.0001badbe84f3p-2, 0x1.965f000000000p+0, 0x1.000p+2},
304 { 0x1.01ffc11b68ce0p+2, 0x1.fc086bf7be35fp-3, 0x1.976e000000000p+0, 0x1.020p+2},
305 { 0x1.03fe2f65f54a0p+2, 0x1.f82306d38867bp-3, 0x1.987a000000000p+0, 0x1.040p+2},
306 { 0x1.05ff3d3150b60p+2, 0x1.f447cddf17c9bp-3, 0x1.9986000000000p+0, 0x1.060p+2},
307 { 0x1.07ff1086e4000p+2, 0x1.f07de1653d505p-3, 0x1.9a90000000000p+0, 0x1.080p+2},
308 { 0x1.09ff8c6d39e24p+2, 0x1.ecc1514885e00p-3, 0x1.9b99000000000p+0, 0x1.0a0p+2},
309 { 0x1.0bfeb843a0000p+2, 0x1.e91570d824941p-3, 0x1.9ca0000000000p+0, 0x1.0c0p+2},
310 { 0x1.0dfe7c0fa2160p+2, 0x1.e5766614ac00bp-3, 0x1.9da6000000000p+0, 0x1.0e0p+2},
311 { 0x1.0ffed1fe3584cp+2, 0x1.e1e3f8ef59221p-3, 0x1.9eab000000000p+0, 0x1.100p+2},
312 { 0x1.11ffb43a3103cp+2, 0x1.de5df2897c620p-3, 0x1.9faf000000000p+0, 0x1.120p+2},
313 { 0x1.13ff203b5f444p+2, 0x1.dae788736ea8dp-3, 0x1.a0b1000000000p+0, 0x1.140p+2},
314 { 0x1.15ff07eeb6920p+2, 0x1.d77d0a049390ep-3, 0x1.a1b2000000000p+0, 0x1.160p+2},
315 { 0x1.17ff657c09920p+2, 0x1.d41e4427c8534p-3, 0x1.a2b2000000000p+0, 0x1.180p+2},
316 { 0x1.19fe2f010c000p+2, 0x1.d0ce5764ac9ddp-3, 0x1.a3b0000000000p+0, 0x1.1a0p+2},
317 { 0x1.1bff6441c48e0p+2, 0x1.cd8665a8dc5dfp-3, 0x1.a4ae000000000p+0, 0x1.1c0p+2},
318 { 0x1.1dfef4e374da0p+2, 0x1.ca4cdc5e38b4fp-3, 0x1.a5aa000000000p+0, 0x1.1e0p+2},
319 { 0x1.1ffedf132b574p+2, 0x1.c71e3a5b98854p-3, 0x1.a6a5000000000p+0, 0x1.200p+2},
320 { 0x1.21ff1cf442b7cp+2, 0x1.c3fa51f8aa0afp-3, 0x1.a79f000000000p+0, 0x1.220p+2},
321 { 0x1.23ffa8a8e5800p+2, 0x1.c0e0f67bc6bcap-3, 0x1.a898000000000p+0, 0x1.240p+2},
322 { 0x1.25fe69bfce6bcp+2, 0x1.bdd520a702f83p-3, 0x1.a98f000000000p+0, 0x1.260p+2},
323 { 0x1.27ff7d151bb60p+2, 0x1.bad055262311fp-3, 0x1.aa86000000000p+0, 0x1.280p+2},
324 { 0x1.29feb53f5f80cp+2, 0x1.b7d8ac0df92bep-3, 0x1.ab7b000000000p+0, 0x1.2a0p+2},
325 { 0x1.2bfe1ef29893cp+2, 0x1.b4ead7e836b48p-3, 0x1.ac6f000000000p+0, 0x1.2c0p+2},
326 { 0x1.2dffd076334ecp+2, 0x1.b203a858682cbp-3, 0x1.ad63000000000p+0, 0x1.2e0p+2},
327 { 0x1.2fff8dff263b4p+2, 0x1.af290d7ab4dc8p-3, 0x1.ae55000000000p+0, 0x1.300p+2},
328 { 0x1.31ff6b7103f60p+2, 0x1.ac57d1a0a3a79p-3, 0x1.af46000000000p+0, 0x1.320p+2},
329 { 0x1.33ff62eb29c60p+2, 0x1.a98fcf107c213p-3, 0x1.b036000000000p+0, 0x1.340p+2},
330 { 0x1.35ff6e8c98374p+2, 0x1.a6d0e0cf35543p-3, 0x1.b125000000000p+0, 0x1.360p+2},
331 { 0x1.37ff88740832cp+2, 0x1.a41ae29c0d9c3p-3, 0x1.b213000000000p+0, 0x1.380p+2},
332 { 0x1.39ffaac000000p+2, 0x1.a16db0ec408b2p-3, 0x1.b300000000000p+0, 0x1.3a0p+2},
333 { 0x1.3bffcf8ee8300p+2, 0x1.9ec928e6d9f5dp-3, 0x1.b3ec000000000p+0, 0x1.3c0p+2},
334 { 0x1.3dfff0ff2071cp+2, 0x1.9c2d2860a546ep-3, 0x1.b4d7000000000p+0, 0x1.3e0p+2},
335 { 0x1.3ffdd7c700000p+2, 0x1.999c5c76af5a0p-3, 0x1.b5c0000000000p+0, 0x1.400p+2},
336 { 0x1.41fdde7efa2e4p+2, 0x1.9711011e7f5e1p-3, 0x1.b6a9000000000p+0, 0x1.420p+2},
337 { 0x1.43fdd035526c4p+2, 0x1.948dcac574e71p-3, 0x1.b791000000000p+0, 0x1.440p+2},
338 { 0x1.45ffdf6fec0a4p+2, 0x1.920fdcc619066p-3, 0x1.b879000000000p+0, 0x1.460p+2},
339 { 0x1.47ff97d2c007cp+2, 0x1.8f9c97e5a8a7ep-3, 0x1.b95f000000000p+0, 0x1.480p+2},
340 { 0x1.49ff2990eb100p+2, 0x1.8d311aeb5c884p-3, 0x1.ba44000000000p+0, 0x1.4a0p+2},
341 { 0x1.4bfe8ecace800p+2, 0x1.8acd4803076e4p-3, 0x1.bb28000000000p+0, 0x1.4c0p+2},
342 { 0x1.4dfdc1a1664ccp+2, 0x1.887101e950c8fp-3, 0x1.bc0b000000000p+0, 0x1.4e0p+2},
343 { 0x1.4fff002ce14e0p+2, 0x1.86198a8a05330p-3, 0x1.bcee000000000p+0, 0x1.500p+2},
344 { 0x1.51fdbeedcb9bcp+2, 0x1.83cc0dc244b6ap-3, 0x1.bdcf000000000p+0, 0x1.520p+2},
345 { 0x1.53fe823f4c000p+2, 0x1.8183325c32c1bp-3, 0x1.beb0000000000p+0, 0x1.540p+2},
346 { 0x1.55ff004aa4000p+2, 0x1.7f417e5e20dedp-3, 0x1.bf90000000000p+0, 0x1.560p+2},
347 { 0x1.57ff33308793cp+2, 0x1.7d06d6f2c9b6cp-3, 0x1.c06f000000000p+0, 0x1.580p+2},
348 { 0x1.59ff1512ac954p+2, 0x1.7ad321c4f107fp-3, 0x1.c14d000000000p+0, 0x1.5a0p+2},
349 { 0x1.5bfea013de5a0p+2, 0x1.78a644fc9b7e4p-3, 0x1.c22a000000000p+0, 0x1.5c0p+2},
350 { 0x1.5dfdce5811360p+2, 0x1.7680273c586edp-3, 0x1.c306000000000p+0, 0x1.5e0p+2},
351 { 0x1.5ffef03fb1a20p+2, 0x1.745e36bf9a9f8p-3, 0x1.c3e2000000000p+0, 0x1.600p+2},
352 { 0x1.61ffae3c2c094p+2, 0x1.7242dd79c5d7bp-3, 0x1.c4bd000000000p+0, 0x1.620p+2},
353 { 0x1.63fda7ae36e60p+2, 0x1.703072a07c8fbp-3, 0x1.c596000000000p+0, 0x1.640p+2},
354 { 0x1.65ffe701dc000p+2, 0x1.6e1f9043853d7p-3, 0x1.c670000000000p+0, 0x1.660p+2},
355 { 0x1.67ff5615bc800p+2, 0x1.6c176d44b9477p-3, 0x1.c748000000000p+0, 0x1.680p+2},
356 { 0x1.69fe49d3f317cp+2, 0x1.6a15835b4e485p-3, 0x1.c81f000000000p+0, 0x1.6a0p+2},
357 { 0x1.6bff202662060p+2, 0x1.68175eda585dfp-3, 0x1.c8f6000000000p+0, 0x1.6c0p+2},
358 { 0x1.6dff73efaeb00p+2, 0x1.661f4fb1a0608p-3, 0x1.c9cc000000000p+0, 0x1.6e0p+2},
359 { 0x1.6fff3f57a2f84p+2, 0x1.642d400879d8cp-3, 0x1.caa1000000000p+0, 0x1.700p+2},
360 { 0x1.71fe7c87d2534p+2, 0x1.62411a6b0ce8fp-3, 0x1.cb75000000000p+0, 0x1.720p+2},
361 { 0x1.73ff925b24e64p+2, 0x1.60587ddf5d7bdp-3, 0x1.cc49000000000p+0, 0x1.740p+2},
362 { 0x1.75fda3d6e6f8cp+2, 0x1.5e77f1b2d4024p-3, 0x1.cd1b000000000p+0, 0x1.760p+2},
363 { 0x1.77fff7e0844e0p+2, 0x1.5c988a411d6eap-3, 0x1.cdee000000000p+0, 0x1.780p+2},
364 { 0x1.79ff3be92f0fcp+2, 0x1.5ac10a9168160p-3, 0x1.cebf000000000p+0, 0x1.7a0p+2},
365 { 0x1.7bfdd9085aebcp+2, 0x1.58ef1727fb30fp-3, 0x1.cf8f000000000p+0, 0x1.7c0p+2},
366 { 0x1.7dfe412fa147cp+2, 0x1.5720651d4d5c8p-3, 0x1.d05f000000000p+0, 0x1.7e0p+2},
367 { 0x1.7ffdfb35820e0p+2, 0x1.555720b668692p-3, 0x1.d12e000000000p+0, 0x1.800p+2},
368 { 0x1.81ff7d7349794p+2, 0x1.53910767a7e9dp-3, 0x1.d1fd000000000p+0, 0x1.820p+2},
369 { 0x1.83fdcbf8773a0p+2, 0x1.51d269c44b634p-3, 0x1.d2ca000000000p+0, 0x1.840p+2},
370 { 0x1.85fddb7be481cp+2, 0x1.5016da018b848p-3, 0x1.d397000000000p+0, 0x1.860p+2},
371 { 0x1.87ffacc2c0900p+2, 0x1.4e5e517350cf3p-3, 0x1.d464000000000p+0, 0x1.880p+2},
372 { 0x1.89fe36b4dd23cp+2, 0x1.4cad0a90993f5p-3, 0x1.d52f000000000p+0, 0x1.8a0p+2},
373 { 0x1.8bfe7b2f91ca0p+2, 0x1.4afeaf0242604p-3, 0x1.d5fa000000000p+0, 0x1.8c0p+2},
374 { 0x1.8dfdf1a9c1100p+2, 0x1.495551c26a875p-3, 0x1.d6c4000000000p+0, 0x1.8e0p+2},
375 { 0x1.8fff1fcd612e0p+2, 0x1.47aecc24f4847p-3, 0x1.d78e000000000p+0, 0x1.900p+2},
376 { 0x1.91ff78b50511cp+2, 0x1.460d2a3ade09ep-3, 0x1.d857000000000p+0, 0x1.920p+2},
377 { 0x1.93fef6970fd7cp+2, 0x1.44705b7a7ca45p-3, 0x1.d91f000000000p+0, 0x1.940p+2},
378 { 0x1.95fd93acacd60p+2, 0x1.42d84fa34911ep-3, 0x1.d9e6000000000p+0, 0x1.960p+2},
379 { 0x1.97fdde4c4fdd4p+2, 0x1.4142eef190046p-3, 0x1.daad000000000p+0, 0x1.980p+2},
380 { 0x1.99ffd72a58500p+2, 0x1.3fb033d201f0dp-3, 0x1.db74000000000p+0, 0x1.9a0p+2},
381 { 0x1.9bfe4e1f89da4p+2, 0x1.3e241ad6ffe2ap-3, 0x1.dc39000000000p+0, 0x1.9c0p+2},
382 { 0x1.9dfe6c1816fe0p+2, 0x1.3c9a8f2a1f8a5p-3, 0x1.dcfe000000000p+0, 0x1.9e0p+2},
383 { 0x1.9ffd950c31420p+2, 0x1.3b158608a35b4p-3, 0x1.ddc2000000000p+0, 0x1.a00p+2},
384 { 0x1.a1fe621497b60p+2, 0x1.3992f944e0082p-3, 0x1.de86000000000p+0, 0x1.a20p+2},
385 { 0x1.a3fe32de87264p+2, 0x1.3814d7dcdaa81p-3, 0x1.df49000000000p+0, 0x1.a40p+2},
386 { 0x1.a5ffa4ca81b00p+2, 0x1.3699225f72272p-3, 0x1.e00c000000000p+0, 0x1.a60p+2},
387 { 0x1.a7fd6dfa85354p+2, 0x1.3523af768b748p-3, 0x1.e0cd000000000p+0, 0x1.a80p+2},
388 { 0x1.a9ff7876b86bcp+2, 0x1.33aea799e6168p-3, 0x1.e18f000000000p+0, 0x1.aa0p+2},
389 { 0x1.abfdcebbdafbcp+2, 0x1.323fc63dc5c59p-3, 0x1.e24f000000000p+0, 0x1.ac0p+2},
390 { 0x1.adfdbbf3a58bcp+2, 0x1.30d32b448c48ap-3, 0x1.e30f000000000p+0, 0x1.ae0p+2},
391 { 0x1.afff40c0181bcp+2, 0x1.2f68d22c69be3p-3, 0x1.e3cf000000000p+0, 0x1.b00p+2},
392 { 0x1.b1ffade2d82e0p+2, 0x1.2e029528d4f7dp-3, 0x1.e48e000000000p+0, 0x1.b20p+2},
393 { 0x1.b3fefda1c8b00p+2, 0x1.2ca066fdd32b7p-3, 0x1.e54c000000000p+0, 0x1.b40p+2},
394 { 0x1.b5ffde5c62fa0p+2, 0x1.2b4061cbb8c88p-3, 0x1.e60a000000000p+0, 0x1.b60p+2},
395 { 0x1.b7ff9a7c1465cp+2, 0x1.29e45758c86a6p-3, 0x1.e6c7000000000p+0, 0x1.b80p+2},
396 { 0x1.b9fe2c4b6aa6cp+2, 0x1.288c3af3d5cdcp-3, 0x1.e783000000000p+0, 0x1.ba0p+2},
397 { 0x1.bbfe487b622fcp+2, 0x1.27362fc35f9d7p-3, 0x1.e83f000000000p+0, 0x1.bc0p+2},
398 { 0x1.bdffefa410a0cp+2, 0x1.25e231cf996f8p-3, 0x1.e8fb000000000p+0, 0x1.be0p+2},
399 { 0x1.bffda53057834p+2, 0x1.2493d2d2d3588p-3, 0x1.e9b5000000000p+0, 0x1.c00p+2},
400 { 0x1.c1ff9f2cdc000p+2, 0x1.2345a635acc4dp-3, 0x1.ea70000000000p+0, 0x1.c20p+2},
401 { 0x1.c3fd9c2b178e4p+2, 0x1.21fd009a10925p-3, 0x1.eb29000000000p+0, 0x1.c40p+2},
402 { 0x1.c5ffdec0212ecp+2, 0x1.20b485eb4e5cfp-3, 0x1.ebe3000000000p+0, 0x1.c60p+2},
403 { 0x1.c7fe18f7fd98cp+2, 0x1.1f717add1edcdp-3, 0x1.ec9b000000000p+0, 0x1.c80p+2},
404 { 0x1.c9fdd0e87622cp+2, 0x1.1e30510f8c8ecp-3, 0x1.ed53000000000p+0, 0x1.ca0p+2},
405 { 0x1.cbff07201fcccp+2, 0x1.1cf10503b6bcap-3, 0x1.ee0b000000000p+0, 0x1.cc0p+2},
406 { 0x1.cdfeef0724420p+2, 0x1.1bb54ba55bb8ep-3, 0x1.eec2000000000p+0, 0x1.ce0p+2},
407 { 0x1.cffd82f367800p+2, 0x1.1a7d19e97b606p-3, 0x1.ef78000000000p+0, 0x1.d00p+2},
408 { 0x1.d1fd8e832f0e0p+2, 0x1.1946b193a1280p-3, 0x1.f02e000000000p+0, 0x1.d20p+2},
409 { 0x1.d3ff124076900p+2, 0x1.18120f5f532e7p-3, 0x1.f0e4000000000p+0, 0x1.d40p+2},
410 { 0x1.d5ff394d32624p+2, 0x1.16e0de7a64731p-3, 0x1.f199000000000p+0, 0x1.d60p+2},
411 { 0x1.d7fdfe030f554p+2, 0x1.15b3145e80a1fp-3, 0x1.f24d000000000p+0, 0x1.d80p+2},
412 { 0x1.d9fe344036404p+2, 0x1.1486fd17547b9p-3, 0x1.f301000000000p+0, 0x1.da0p+2},
413 { 0x1.dbffdc8a23034p+2, 0x1.135c9596d2896p-3, 0x1.f3b5000000000p+0, 0x1.dc0p+2},
414 { 0x1.ddfd3c2cb21dcp+2, 0x1.1237248528065p-3, 0x1.f467000000000p+0, 0x1.de0p+2},
415 { 0x1.dffee657c82a0p+2, 0x1.1111b14cb8f39p-3, 0x1.f51a000000000p+0, 0x1.e00p+2},
416 { 0x1.e1ff1e4c3eb00p+2, 0x1.0fef806635fe8p-3, 0x1.f5cc000000000p+0, 0x1.e20p+2},
417 { 0x1.e3fdde6a2fd94p+2, 0x1.0ed0880474f71p-3, 0x1.f67d000000000p+0, 0x1.e40p+2},
418 { 0x1.e5fe06d9140e0p+2, 0x1.0db322dce8431p-3, 0x1.f72e000000000p+0, 0x1.e60p+2},
419 { 0x1.e7ff9817d6e7cp+2, 0x1.0c974e2c4e003p-3, 0x1.f7df000000000p+0, 0x1.e80p+2},
420 { 0x1.e9ffa8cd61abcp+2, 0x1.0b7e9e5c6ec09p-3, 0x1.f88f000000000p+0, 0x1.ea0p+2},
421 { 0x1.ebfe335e93be0p+2, 0x1.0a690a131c86ap-3, 0x1.f93e000000000p+0, 0x1.ec0p+2},
422 { 0x1.edfe201620cd4p+2, 0x1.0954f55423991p-3, 0x1.f9ed000000000p+0, 0x1.ee0p+2},
423 { 0x1.efff6f6eb3700p+2, 0x1.08425d89f8618p-3, 0x1.fa9c000000000p+0, 0x1.f00p+2},
424 { 0x1.f1ff2ff2d4ba0p+2, 0x1.0732ce999c3d1p-3, 0x1.fb4a000000000p+0, 0x1.f20p+2},
425 { 0x1.f3fd5c0c8c49cp+2, 0x1.06263f9594b61p-3, 0x1.fbf7000000000p+0, 0x1.f40p+2},
426 { 0x1.f5ffda1397d74p+2, 0x1.05199336faf21p-3, 0x1.fca5000000000p+0, 0x1.f60p+2},
427 { 0x1.f7fdc89c9cbc4p+2, 0x1.041165caebb1fp-3, 0x1.fd51000000000p+0, 0x1.f80p+2},
428 { 0x1.f9fd100472794p+2, 0x1.030a9c4a34299p-3, 0x1.fdfd000000000p+0, 0x1.fa0p+2},
429 { 0x1.fbfdb0bf902e4p+2, 0x1.0205345e3761ep-3, 0x1.fea9000000000p+0, 0x1.fc0p+2},
430 { 0x1.fdffab426cfb4p+2, 0x1.01012bb50ef58p-3, 0x1.ff55000000000p+0, 0x1.fe0p+2},
431};
432
433
434// Describe the destination floating-point type.
435#define SignificandBits 53
436#define ExponentBits 11
437
438#if AVOID_UINT64
439double cbrt(double x) {
440 // deal with exponent
441
442 // Define a structure for accessing the internal components of a float.
443 typedef union
444 {
445 double d;
446 struct
447 {
448 #if defined __BIG_ENDIAN__
449 unsigned int sign : 1;
450 unsigned int exponent : ExponentBits;
451 uint64_t fraction : SignificandBits-1;
452 #else // defined __BIG_ENDIAN__
453 uint64_t fraction : SignificandBits-1;
454 unsigned int exponent : ExponentBits;
455 unsigned int sign : 1;
456 #endif // defined __BIG_ENDIAN__
457 } s;
458 } Double;
459
460 Double X;
461 X.d = x;
462 int sign = X.s.sign;
463 int exponent = X.s.exponent;
464 uint64_t fraction = X.s.fraction;
465
466 if( exponent == 0x7ff) {
467 #if FENV_ACCESS_ON
468 return x+x; // inf, -inf, NaN, raise invalid for signalling NaNs
469 #else
470 return x; // inf, -inf, NaN
471 #endif
472 }
473
474 if (exponent == 0x000) { // denormal/zero path
475 #if DAZ
476 return 0.0 * x; //cbrt(+/-denorm) = +/-0 if DAZ
477 #else
478 if(fraction == 0)
479 return x; //cbrt(+/-0) = +/-0
480 Double fixed;
481 fixed.s.sign = 0;
482 fixed.s.exponent = 0x400;
483 fixed.s.fraction = fraction;
484 double newx = fixed.d - 2.0;
485 Double newscale;
486 newscale.s.sign = sign;
487 newscale.s.exponent = 0x2aa;
488 newscale.s.fraction = 0;
489 return newscale.d * cbrt(newx);
490 #endif
491 }
492
493 Double Y;
494 Y.d = 0.0;
495 int e = exponent; // - 0x3ff;
496
497 int expdiv3 = (e * 0x000aaaab)>>21; // e/3
498 int expmod3 = 0x003 & ((e * 0x002aaaab)>>21); // e%3
499
500 Y.s.exponent = expmod3 + 0x3ff;
501 Y.s.fraction = fraction;
502 Double scale;
503 scale.d = 0.0;
504 scale.s.exponent = expdiv3 + 0x2aa; // need to add 2/3 of the bias = bias - bias/3
505 scale.s.sign = sign;
506
507 double y = Y.d; // reduced argument we try to take the cube root of
508
509 int ylookup = (int)((expmod3 << 7) | (fraction >> (52-7)));
510
511 const double z = cbrt_table[ylookup][0];
512 const double zinv = cbrt_table[ylookup][1]; // 1.0/z;
513 const double cbrtz = cbrt_table[ylookup][2]; //cbrt(z); exactly
514
515 const double w = (y - z) * zinv;
516/*
517 Remes of order 5 on [-0x1p-10, 0x1.33a3c38cf408p-7] converged to:
518
519 P(x) = 9.99999999999999988582933092574e-1 + 3.33333333333348975533452008402e-1 x^1 - 1.11111111092259896957294965013e-1 x^2 + 6.17283764468193710192949460754e-2 x^3 - 4.11470773517990145835234033841e-2 x^4 + 2.95939821802870215940915362711e-2 x^5
520 rounded to double P(x) = 0x1p+0 + 0x1.555555555566fp-2 x^1 - 0x1.c71c71c5d0cf7p-4 x^2 + 0x1.f9adc9c26062dp-5 x^3 - 0x1.5113acf1a9a61p-5 x^4 + 0x1.e4de2867daf6fp-6 x^5
521 with eps = 0x1.ffffffffffeaap-57
522 We pull off the leading 1.0
523 */
524 const double pcoef[5] = {
525 0x1.555555555566fp-2,
526 - 0x1.c71c71c5d0cf7p-4,
527 0x1.f9adc9c26062dp-5,
528 - 0x1.5113acf1a9a61p-5,
529 0x1.e4de2867daf6fp-6,
530 };
531 const double pw = pcoef[0] + w*( pcoef[1] + w*(pcoef[2] + w * (pcoef[3] + w * pcoef[4])));
532 double res = scale.d * (cbrtz + (cbrtz * w) * pw);
533 return res;
534}
535#else // AVOID_UINT64
536double cbrt(double x) {
537 // deal with exponent
538
539 // Define a structure for accessing the internal components of a float.
540 typedef union
541 {
542 double d;
543 uint64_t u;
544 } Double;
545
546 Double X;
547 X.d = x;
548// int sign = X.u >> 63;
549 uint64_t signx = X.u & 0x8000000000000000LL;
550 int exponent = (int)(X.u >> 52) & 0x7ff;
551 uint64_t fraction = X.u & 0x000fffffffffffffLL;
552
553 if( exponent == 0x7ff) {
554 #if FENV_ACCESS_ON
555 return x+x; // inf, -inf, NaN, raise invalid for signalling NaNs
556 #else
557 return x; // inf, -inf, NaN
558 #endif
559 }
560
561 if (exponent == 0x000) { // denormal/zero path
562 #if DAZ
563 return 0.0 * x; //cbrt(+/-denorm) = +/-0 if DAZ
564 #else
565 if(fraction == 0)
566 return x; //cbrt(+/-0) = +/-0
567 Double fixed;
568// fixed.s.sign = 0;
569// fixed.s.exponent = 0x400;
570// fixed.s.fraction = fraction;
571 fixed.u = 0x4000000000000000LL | fraction;
572 double newx = fixed.d - 2.0;
573 Double newscale;
574// newscale.s.sign = sign;
575// newscale.s.exponent = 0x2aa;
576// newscale.s.fraction = 0;
577 newscale.u = signx | 0x2aa0000000000000LL;
578 return newscale.d * cbrt(newx);
579 #endif
580 }
581
582 int e = exponent; // - 0x3ff;
583
584 int expdiv3 = (e * 0x000aaaab)>>21; // e/3
585 int expmod3 = 0x003 & ((e * 0x002aaaab)>>21); // e%3
586
587 Double Y;
588// Y.d = 0.0;
589// Y.s.exponent = expmod3 + 0x3ff;
590// Y.s.fraction = fraction;
591 Y.u = ((uint64_t)(expmod3 + 0x3ff)<<52) | fraction;
592 Double scale;
593// scale.d = 0.0;
594// scale.s.exponent = expdiv3 + 0x2aa; // need to add 2/3 of the bias = bias - bias/3
595// scale.s.sign = sign;
596 scale.u = signx | ((uint64_t)(expdiv3 + 0x2aa) << 52);
597 double y = Y.d; // reduced argument we try to take the cube root of
598
599 int ylookup = (int)((expmod3 << 7) | (fraction >> (52-7)));
600
601 const double z = cbrt_table[ylookup][0];
602 const double zinv = cbrt_table[ylookup][1]; // 1.0/z;
603 const double cbrtz = cbrt_table[ylookup][2]; //cbrt(z); exactly
604
605 const double w = (y - z) * zinv;
606/*
607 Remes of order 5 on [-0x1p-10, 0x1.33a3c38cf408p-7] converged to:
608
609 P(x) = 9.99999999999999988582933092574e-1 + 3.33333333333348975533452008402e-1 x^1 - 1.11111111092259896957294965013e-1 x^2 + 6.17283764468193710192949460754e-2 x^3 - 4.11470773517990145835234033841e-2 x^4 + 2.95939821802870215940915362711e-2 x^5
610 rounded to double P(x) = 0x1p+0 + 0x1.555555555566fp-2 x^1 - 0x1.c71c71c5d0cf7p-4 x^2 + 0x1.f9adc9c26062dp-5 x^3 - 0x1.5113acf1a9a61p-5 x^4 + 0x1.e4de2867daf6fp-6 x^5
611 with eps = 0x1.ffffffffffeaap-57
612 We pull off the leading 1.0
613 */
614 const double pcoef[5] = {
615 0x1.555555555566fp-2,
616 - 0x1.c71c71c5d0cf7p-4,
617 0x1.f9adc9c26062dp-5,
618 - 0x1.5113acf1a9a61p-5,
619 0x1.e4de2867daf6fp-6,
620 };
621 const double pw = pcoef[0] + w*( pcoef[1] + w*(pcoef[2] + w * (pcoef[3] + w * pcoef[4])));
622 double res = scale.d * (cbrtz + (cbrtz * w) * pw);
623 return res;
624}
625#endif // AVOID_UINT64
626
627/*
628// Code to demonstrate how to compute (e/3,e%3) either with the exponent where you want it to end up
629// or with an integer result.
630#include <stdio.h>
631#include <stdint.h>
632int main(void) {
633 uint32_t e;
634 int bad = 0;
635 for(e = 0; e <= 0x7ff; e++) {
636 uint32_t f = e << 20;
637 uint32_t ediv3 = 0x7ff00000 & (e * 0x00055556);
638 uint32_t emod3 = 0x00300000 & (e * 0x00155556);
639 uint32_t exp = 3 * ediv3 + emod3;
640 if (exp == f) printf("ok\t%03x\t%08x\t%08x\t%08x\n", e, ediv3, emod3, f);
641 else bad++, printf("not ok\t%03x\t%08x\t%08x\t%08x\n", e, ediv3, emod3, f);
642 }
643 for(e = 0; e <= 0x7ff; e++) {
644 uint32_t f = e << 20;
645 uint32_t ediv3 = (e * 0x000aaaab)>>21;
646 uint32_t emod3 = 0x003 & ((e * 0x002aaaab)>>21);
647 uint32_t exp = 3 * ediv3 + emod3;
648 if (exp == e) printf("ok\t%03x\t%08x\t%08x\t%08x\n", e, ediv3, emod3, f);
649 else bad++, printf("not ok\t%03x\t%08x\t%08x\t%08x\n", e, ediv3, emod3, f);
650 }
651 if(bad) printf ("%d failures.\n",bad);
652 else printf("done. passed.\n");
653 return 0;
654}
655*/