1// origin: FreeBSD /usr/src/lib/msun/src/s_exp2.c */
2//-
3// Copyright (c) 2005 David Schultz <das@FreeBSD.ORG>
4// All rights reserved.
5//
6// Redistribution and use in source and binary forms, with or without
7// modification, are permitted provided that the following conditions
8// are met:
9// 1. Redistributions of source code must retain the above copyright
10// notice, this list of conditions and the following disclaimer.
11// 2. Redistributions in binary form must reproduce the above copyright
12// notice, this list of conditions and the following disclaimer in the
13// documentation and/or other materials provided with the distribution.
14//
15// THIS SOFTWARE IS PROVIDED BY THE AUTHOR AND CONTRIBUTORS ``AS IS'' AND
16// ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE
17// IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE
18// ARE DISCLAIMED. IN NO EVENT SHALL THE AUTHOR OR CONTRIBUTORS BE LIABLE
19// FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL
20// DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS
21// OR SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION)
22// HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT
23// LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY
24// OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF
25// SUCH DAMAGE.
26
27use super::scalbn;
28
29const TBLSIZE: usize = 256;
30
31#[cfg_attr(rustfmt, rustfmt_skip)]
32static TBL: [u64; TBLSIZE * 2] = [
33 // exp2(z + eps) eps
34 0x3fe6a09e667f3d5d, 0x3d39880000000000,
35 0x3fe6b052fa751744, 0x3cd8000000000000,
36 0x3fe6c012750bd9fe, 0xbd28780000000000,
37 0x3fe6cfdcddd476bf, 0x3d1ec00000000000,
38 0x3fe6dfb23c651a29, 0xbcd8000000000000,
39 0x3fe6ef9298593ae3, 0xbcbc000000000000,
40 0x3fe6ff7df9519386, 0xbd2fd80000000000,
41 0x3fe70f7466f42da3, 0xbd2c880000000000,
42 0x3fe71f75e8ec5fc3, 0x3d13c00000000000,
43 0x3fe72f8286eacf05, 0xbd38300000000000,
44 0x3fe73f9a48a58152, 0xbd00c00000000000,
45 0x3fe74fbd35d7ccfc, 0x3d2f880000000000,
46 0x3fe75feb564267f1, 0x3d03e00000000000,
47 0x3fe77024b1ab6d48, 0xbd27d00000000000,
48 0x3fe780694fde5d38, 0xbcdd000000000000,
49 0x3fe790b938ac1d00, 0x3ce3000000000000,
50 0x3fe7a11473eb0178, 0xbced000000000000,
51 0x3fe7b17b0976d060, 0x3d20400000000000,
52 0x3fe7c1ed0130c133, 0x3ca0000000000000,
53 0x3fe7d26a62ff8636, 0xbd26900000000000,
54 0x3fe7e2f336cf4e3b, 0xbd02e00000000000,
55 0x3fe7f3878491c3e8, 0xbd24580000000000,
56 0x3fe80427543e1b4e, 0x3d33000000000000,
57 0x3fe814d2add1071a, 0x3d0f000000000000,
58 0x3fe82589994ccd7e, 0xbd21c00000000000,
59 0x3fe8364c1eb942d0, 0x3d29d00000000000,
60 0x3fe8471a4623cab5, 0x3d47100000000000,
61 0x3fe857f4179f5bbc, 0x3d22600000000000,
62 0x3fe868d99b4491af, 0xbd32c40000000000,
63 0x3fe879cad931a395, 0xbd23000000000000,
64 0x3fe88ac7d98a65b8, 0xbd2a800000000000,
65 0x3fe89bd0a4785800, 0xbced000000000000,
66 0x3fe8ace5422aa223, 0x3d33280000000000,
67 0x3fe8be05bad619fa, 0x3d42b40000000000,
68 0x3fe8cf3216b54383, 0xbd2ed00000000000,
69 0x3fe8e06a5e08664c, 0xbd20500000000000,
70 0x3fe8f1ae99157807, 0x3d28280000000000,
71 0x3fe902fed0282c0e, 0xbd1cb00000000000,
72 0x3fe9145b0b91ff96, 0xbd05e00000000000,
73 0x3fe925c353aa2ff9, 0x3cf5400000000000,
74 0x3fe93737b0cdc64a, 0x3d17200000000000,
75 0x3fe948b82b5f98ae, 0xbd09000000000000,
76 0x3fe95a44cbc852cb, 0x3d25680000000000,
77 0x3fe96bdd9a766f21, 0xbd36d00000000000,
78 0x3fe97d829fde4e2a, 0xbd01000000000000,
79 0x3fe98f33e47a23a3, 0x3d2d000000000000,
80 0x3fe9a0f170ca0604, 0xbd38a40000000000,
81 0x3fe9b2bb4d53ff89, 0x3d355c0000000000,
82 0x3fe9c49182a3f15b, 0x3d26b80000000000,
83 0x3fe9d674194bb8c5, 0xbcec000000000000,
84 0x3fe9e86319e3238e, 0x3d17d00000000000,
85 0x3fe9fa5e8d07f302, 0x3d16400000000000,
86 0x3fea0c667b5de54d, 0xbcf5000000000000,
87 0x3fea1e7aed8eb8f6, 0x3d09e00000000000,
88 0x3fea309bec4a2e27, 0x3d2ad80000000000,
89 0x3fea42c980460a5d, 0xbd1af00000000000,
90 0x3fea5503b23e259b, 0x3d0b600000000000,
91 0x3fea674a8af46213, 0x3d38880000000000,
92 0x3fea799e1330b3a7, 0x3d11200000000000,
93 0x3fea8bfe53c12e8d, 0x3d06c00000000000,
94 0x3fea9e6b5579fcd2, 0xbd29b80000000000,
95 0x3feab0e521356fb8, 0x3d2b700000000000,
96 0x3feac36bbfd3f381, 0x3cd9000000000000,
97 0x3fead5ff3a3c2780, 0x3ce4000000000000,
98 0x3feae89f995ad2a3, 0xbd2c900000000000,
99 0x3feafb4ce622f367, 0x3d16500000000000,
100 0x3feb0e07298db790, 0x3d2fd40000000000,
101 0x3feb20ce6c9a89a9, 0x3d12700000000000,
102 0x3feb33a2b84f1a4b, 0x3d4d470000000000,
103 0x3feb468415b747e7, 0xbd38380000000000,
104 0x3feb59728de5593a, 0x3c98000000000000,
105 0x3feb6c6e29f1c56a, 0x3d0ad00000000000,
106 0x3feb7f76f2fb5e50, 0x3cde800000000000,
107 0x3feb928cf22749b2, 0xbd04c00000000000,
108 0x3feba5b030a10603, 0xbd0d700000000000,
109 0x3febb8e0b79a6f66, 0x3d0d900000000000,
110 0x3febcc1e904bc1ff, 0x3d02a00000000000,
111 0x3febdf69c3f3a16f, 0xbd1f780000000000,
112 0x3febf2c25bd71db8, 0xbd10a00000000000,
113 0x3fec06286141b2e9, 0xbd11400000000000,
114 0x3fec199bdd8552e0, 0x3d0be00000000000,
115 0x3fec2d1cd9fa64ee, 0xbd09400000000000,
116 0x3fec40ab5fffd02f, 0xbd0ed00000000000,
117 0x3fec544778fafd15, 0x3d39660000000000,
118 0x3fec67f12e57d0cb, 0xbd1a100000000000,
119 0x3fec7ba88988c1b6, 0xbd58458000000000,
120 0x3fec8f6d9406e733, 0xbd1a480000000000,
121 0x3feca3405751c4df, 0x3ccb000000000000,
122 0x3fecb720dcef9094, 0x3d01400000000000,
123 0x3feccb0f2e6d1689, 0x3cf0200000000000,
124 0x3fecdf0b555dc412, 0x3cf3600000000000,
125 0x3fecf3155b5bab3b, 0xbd06900000000000,
126 0x3fed072d4a0789bc, 0x3d09a00000000000,
127 0x3fed1b532b08c8fa, 0xbd15e00000000000,
128 0x3fed2f87080d8a85, 0x3d1d280000000000,
129 0x3fed43c8eacaa203, 0x3d01a00000000000,
130 0x3fed5818dcfba491, 0x3cdf000000000000,
131 0x3fed6c76e862e6a1, 0xbd03a00000000000,
132 0x3fed80e316c9834e, 0xbd0cd80000000000,
133 0x3fed955d71ff6090, 0x3cf4c00000000000,
134 0x3feda9e603db32ae, 0x3cff900000000000,
135 0x3fedbe7cd63a8325, 0x3ce9800000000000,
136 0x3fedd321f301b445, 0xbcf5200000000000,
137 0x3fede7d5641c05bf, 0xbd1d700000000000,
138 0x3fedfc97337b9aec, 0xbd16140000000000,
139 0x3fee11676b197d5e, 0x3d0b480000000000,
140 0x3fee264614f5a3e7, 0x3d40ce0000000000,
141 0x3fee3b333b16ee5c, 0x3d0c680000000000,
142 0x3fee502ee78b3fb4, 0xbd09300000000000,
143 0x3fee653924676d68, 0xbce5000000000000,
144 0x3fee7a51fbc74c44, 0xbd07f80000000000,
145 0x3fee8f7977cdb726, 0xbcf3700000000000,
146 0x3feea4afa2a490e8, 0x3ce5d00000000000,
147 0x3feeb9f4867ccae4, 0x3d161a0000000000,
148 0x3feecf482d8e680d, 0x3cf5500000000000,
149 0x3feee4aaa2188514, 0x3cc6400000000000,
150 0x3feefa1bee615a13, 0xbcee800000000000,
151 0x3fef0f9c1cb64106, 0xbcfa880000000000,
152 0x3fef252b376bb963, 0xbd2c900000000000,
153 0x3fef3ac948dd7275, 0x3caa000000000000,
154 0x3fef50765b6e4524, 0xbcf4f00000000000,
155 0x3fef6632798844fd, 0x3cca800000000000,
156 0x3fef7bfdad9cbe38, 0x3cfabc0000000000,
157 0x3fef91d802243c82, 0xbcd4600000000000,
158 0x3fefa7c1819e908e, 0xbd0b0c0000000000,
159 0x3fefbdba3692d511, 0xbcc0e00000000000,
160 0x3fefd3c22b8f7194, 0xbd10de8000000000,
161 0x3fefe9d96b2a23ee, 0x3cee430000000000,
162 0x3ff0000000000000, 0x0,
163 0x3ff00b1afa5abcbe, 0xbcb3400000000000,
164 0x3ff0163da9fb3303, 0xbd12170000000000,
165 0x3ff02168143b0282, 0x3cba400000000000,
166 0x3ff02c9a3e77806c, 0x3cef980000000000,
167 0x3ff037d42e11bbca, 0xbcc7400000000000,
168 0x3ff04315e86e7f89, 0x3cd8300000000000,
169 0x3ff04e5f72f65467, 0xbd1a3f0000000000,
170 0x3ff059b0d315855a, 0xbd02840000000000,
171 0x3ff0650a0e3c1f95, 0x3cf1600000000000,
172 0x3ff0706b29ddf71a, 0x3d15240000000000,
173 0x3ff07bd42b72a82d, 0xbce9a00000000000,
174 0x3ff0874518759bd0, 0x3ce6400000000000,
175 0x3ff092bdf66607c8, 0xbd00780000000000,
176 0x3ff09e3ecac6f383, 0xbc98000000000000,
177 0x3ff0a9c79b1f3930, 0x3cffa00000000000,
178 0x3ff0b5586cf988fc, 0xbcfac80000000000,
179 0x3ff0c0f145e46c8a, 0x3cd9c00000000000,
180 0x3ff0cc922b724816, 0x3d05200000000000,
181 0x3ff0d83b23395dd8, 0xbcfad00000000000,
182 0x3ff0e3ec32d3d1f3, 0x3d1bac0000000000,
183 0x3ff0efa55fdfa9a6, 0xbd04e80000000000,
184 0x3ff0fb66affed2f0, 0xbd0d300000000000,
185 0x3ff1073028d7234b, 0x3cf1500000000000,
186 0x3ff11301d0125b5b, 0x3cec000000000000,
187 0x3ff11edbab5e2af9, 0x3d16bc0000000000,
188 0x3ff12abdc06c31d5, 0x3ce8400000000000,
189 0x3ff136a814f2047d, 0xbd0ed00000000000,
190 0x3ff1429aaea92de9, 0x3ce8e00000000000,
191 0x3ff14e95934f3138, 0x3ceb400000000000,
192 0x3ff15a98c8a58e71, 0x3d05300000000000,
193 0x3ff166a45471c3df, 0x3d03380000000000,
194 0x3ff172b83c7d5211, 0x3d28d40000000000,
195 0x3ff17ed48695bb9f, 0xbd05d00000000000,
196 0x3ff18af9388c8d93, 0xbd1c880000000000,
197 0x3ff1972658375d66, 0x3d11f00000000000,
198 0x3ff1a35beb6fcba7, 0x3d10480000000000,
199 0x3ff1af99f81387e3, 0xbd47390000000000,
200 0x3ff1bbe084045d54, 0x3d24e40000000000,
201 0x3ff1c82f95281c43, 0xbd0a200000000000,
202 0x3ff1d4873168b9b2, 0x3ce3800000000000,
203 0x3ff1e0e75eb44031, 0x3ceac00000000000,
204 0x3ff1ed5022fcd938, 0x3d01900000000000,
205 0x3ff1f9c18438cdf7, 0xbd1b780000000000,
206 0x3ff2063b88628d8f, 0x3d2d940000000000,
207 0x3ff212be3578a81e, 0x3cd8000000000000,
208 0x3ff21f49917ddd41, 0x3d2b340000000000,
209 0x3ff22bdda2791323, 0x3d19f80000000000,
210 0x3ff2387a6e7561e7, 0xbd19c80000000000,
211 0x3ff2451ffb821427, 0x3d02300000000000,
212 0x3ff251ce4fb2a602, 0xbd13480000000000,
213 0x3ff25e85711eceb0, 0x3d12700000000000,
214 0x3ff26b4565e27d16, 0x3d11d00000000000,
215 0x3ff2780e341de00f, 0x3d31ee0000000000,
216 0x3ff284dfe1f5633e, 0xbd14c00000000000,
217 0x3ff291ba7591bb30, 0xbd13d80000000000,
218 0x3ff29e9df51fdf09, 0x3d08b00000000000,
219 0x3ff2ab8a66d10e9b, 0xbd227c0000000000,
220 0x3ff2b87fd0dada3a, 0x3d2a340000000000,
221 0x3ff2c57e39771af9, 0xbd10800000000000,
222 0x3ff2d285a6e402d9, 0xbd0ed00000000000,
223 0x3ff2df961f641579, 0xbcf4200000000000,
224 0x3ff2ecafa93e2ecf, 0xbd24980000000000,
225 0x3ff2f9d24abd8822, 0xbd16300000000000,
226 0x3ff306fe0a31b625, 0xbd32360000000000,
227 0x3ff31432edeea50b, 0xbd70df8000000000,
228 0x3ff32170fc4cd7b8, 0xbd22480000000000,
229 0x3ff32eb83ba8e9a2, 0xbd25980000000000,
230 0x3ff33c08b2641766, 0x3d1ed00000000000,
231 0x3ff3496266e3fa27, 0xbcdc000000000000,
232 0x3ff356c55f929f0f, 0xbd30d80000000000,
233 0x3ff36431a2de88b9, 0x3d22c80000000000,
234 0x3ff371a7373aaa39, 0x3d20600000000000,
235 0x3ff37f26231e74fe, 0xbd16600000000000,
236 0x3ff38cae6d05d838, 0xbd0ae00000000000,
237 0x3ff39a401b713ec3, 0xbd44720000000000,
238 0x3ff3a7db34e5a020, 0x3d08200000000000,
239 0x3ff3b57fbfec6e95, 0x3d3e800000000000,
240 0x3ff3c32dc313a8f2, 0x3cef800000000000,
241 0x3ff3d0e544ede122, 0xbd17a00000000000,
242 0x3ff3dea64c1234bb, 0x3d26300000000000,
243 0x3ff3ec70df1c4ecc, 0xbd48a60000000000,
244 0x3ff3fa4504ac7e8c, 0xbd3cdc0000000000,
245 0x3ff40822c367a0bb, 0x3d25b80000000000,
246 0x3ff4160a21f72e95, 0x3d1ec00000000000,
247 0x3ff423fb27094646, 0xbd13600000000000,
248 0x3ff431f5d950a920, 0x3d23980000000000,
249 0x3ff43ffa3f84b9eb, 0x3cfa000000000000,
250 0x3ff44e0860618919, 0xbcf6c00000000000,
251 0x3ff45c2042a7d201, 0xbd0bc00000000000,
252 0x3ff46a41ed1d0016, 0xbd12800000000000,
253 0x3ff4786d668b3326, 0x3d30e00000000000,
254 0x3ff486a2b5c13c00, 0xbd2d400000000000,
255 0x3ff494e1e192af04, 0x3d0c200000000000,
256 0x3ff4a32af0d7d372, 0xbd1e500000000000,
257 0x3ff4b17dea6db801, 0x3d07800000000000,
258 0x3ff4bfdad53629e1, 0xbd13800000000000,
259 0x3ff4ce41b817c132, 0x3d00800000000000,
260 0x3ff4dcb299fddddb, 0x3d2c700000000000,
261 0x3ff4eb2d81d8ab96, 0xbd1ce00000000000,
262 0x3ff4f9b2769d2d02, 0x3d19200000000000,
263 0x3ff508417f4531c1, 0xbd08c00000000000,
264 0x3ff516daa2cf662a, 0xbcfa000000000000,
265 0x3ff5257de83f51ea, 0x3d4a080000000000,
266 0x3ff5342b569d4eda, 0xbd26d80000000000,
267 0x3ff542e2f4f6ac1a, 0xbd32440000000000,
268 0x3ff551a4ca5d94db, 0x3d483c0000000000,
269 0x3ff56070dde9116b, 0x3d24b00000000000,
270 0x3ff56f4736b529de, 0x3d415a0000000000,
271 0x3ff57e27dbe2c40e, 0xbd29e00000000000,
272 0x3ff58d12d497c76f, 0xbd23080000000000,
273 0x3ff59c0827ff0b4c, 0x3d4dec0000000000,
274 0x3ff5ab07dd485427, 0xbcc4000000000000,
275 0x3ff5ba11fba87af4, 0x3d30080000000000,
276 0x3ff5c9268a59460b, 0xbd26c80000000000,
277 0x3ff5d84590998e3f, 0x3d469a0000000000,
278 0x3ff5e76f15ad20e1, 0xbd1b400000000000,
279 0x3ff5f6a320dcebca, 0x3d17700000000000,
280 0x3ff605e1b976dcb8, 0x3d26f80000000000,
281 0x3ff6152ae6cdf715, 0x3d01000000000000,
282 0x3ff6247eb03a5531, 0xbd15d00000000000,
283 0x3ff633dd1d1929b5, 0xbd12d00000000000,
284 0x3ff6434634ccc313, 0xbcea800000000000,
285 0x3ff652b9febc8efa, 0xbd28600000000000,
286 0x3ff6623882553397, 0x3d71fe0000000000,
287 0x3ff671c1c708328e, 0xbd37200000000000,
288 0x3ff68155d44ca97e, 0x3ce6800000000000,
289 0x3ff690f4b19e9471, 0xbd29780000000000,
290];
291
292// exp2(x): compute the base 2 exponential of x
293//
294// Accuracy: Peak error < 0.503 ulp for normalized results.
295//
296// Method: (accurate tables)
297//
298// Reduce x:
299// x = k + y, for integer k and |y| <= 1/2.
300// Thus we have exp2(x) = 2**k * exp2(y).
301//
302// Reduce y:
303// y = i/TBLSIZE + z - eps[i] for integer i near y * TBLSIZE.
304// Thus we have exp2(y) = exp2(i/TBLSIZE) * exp2(z - eps[i]),
305// with |z - eps[i]| <= 2**-9 + 2**-39 for the table used.
306//
307// We compute exp2(i/TBLSIZE) via table lookup and exp2(z - eps[i]) via
308// a degree-5 minimax polynomial with maximum error under 1.3 * 2**-61.
309// The values in exp2t[] and eps[] are chosen such that
310// exp2t[i] = exp2(i/TBLSIZE + eps[i]), and eps[i] is a small offset such
311// that exp2t[i] is accurate to 2**-64.
312//
313// Note that the range of i is +-TBLSIZE/2, so we actually index the tables
314// by i0 = i + TBLSIZE/2. For cache efficiency, exp2t[] and eps[] are
315// virtual tables, interleaved in the real table tbl[].
316//
317// This method is due to Gal, with many details due to Gal and Bachelis:
318//
319// Gal, S. and Bachelis, B. An Accurate Elementary Mathematical Library
320// for the IEEE Floating Point Standard. TOMS 17(1), 26-46 (1991).
321
322/// Exponential, base 2 (f64)
323///
324/// Calculate `2^x`, that is, 2 raised to the power `x`.
325#[cfg_attr(all(test, assert_no_panic), no_panic::no_panic)]
326pub fn exp2(mut x: f64) -> f64 {
327 let redux = f64::from_bits(0x4338000000000000) / TBLSIZE as f64;
328 let p1 = f64::from_bits(0x3fe62e42fefa39ef);
329 let p2 = f64::from_bits(0x3fcebfbdff82c575);
330 let p3 = f64::from_bits(0x3fac6b08d704a0a6);
331 let p4 = f64::from_bits(0x3f83b2ab88f70400);
332 let p5 = f64::from_bits(0x3f55d88003875c74);
333
334 // double_t r, t, z;
335 // uint32_t ix, i0;
336 // union {double f; uint64_t i;} u = {x};
337 // union {uint32_t u; int32_t i;} k;
338 let x1p1023 = f64::from_bits(0x7fe0000000000000);
339 let x1p52 = f64::from_bits(0x4330000000000000);
340 let _0x1p_149 = f64::from_bits(0xb6a0000000000000);
341
342 /* Filter out exceptional cases. */
343 let ui = f64::to_bits(x);
344 let ix = ui >> 32 & 0x7fffffff;
345 if ix >= 0x408ff000 {
346 /* |x| >= 1022 or nan */
347 if ix >= 0x40900000 && ui >> 63 == 0 {
348 /* x >= 1024 or nan */
349 /* overflow */
350 x *= x1p1023;
351 return x;
352 }
353 if ix >= 0x7ff00000 {
354 /* -inf or -nan */
355 return -1.0 / x;
356 }
357 if ui >> 63 != 0 {
358 /* x <= -1022 */
359 /* underflow */
360 if x <= -1075.0 || x - x1p52 + x1p52 != x {
361 force_eval!((_0x1p_149 / x) as f32);
362 }
363 if x <= -1075.0 {
364 return 0.0;
365 }
366 }
367 } else if ix < 0x3c900000 {
368 /* |x| < 0x1p-54 */
369 return 1.0 + x;
370 }
371
372 /* Reduce x, computing z, i0, and k. */
373 let ui = f64::to_bits(x + redux);
374 let mut i0 = ui as u32;
375 i0 = i0.wrapping_add(TBLSIZE as u32 / 2);
376 let ku = i0 / TBLSIZE as u32 * TBLSIZE as u32;
377 let ki = div!(ku as i32, TBLSIZE as i32);
378 i0 %= TBLSIZE as u32;
379 let uf = f64::from_bits(ui) - redux;
380 let mut z = x - uf;
381
382 /* Compute r = exp2(y) = exp2t[i0] * p(z - eps[i]). */
383 let t = f64::from_bits(i!(TBL, 2 * i0 as usize)); /* exp2t[i0] */
384 z -= f64::from_bits(i!(TBL, 2 * i0 as usize + 1)); /* eps[i0] */
385 let r = t + t * z * (p1 + z * (p2 + z * (p3 + z * (p4 + z * p5))));
386
387 scalbn(r, ki)
388}
389
390#[test]
391fn i0_wrap_test() {
392 let x: f64 = -3.0 / 256.0;
393 assert_eq!(exp2(x), f64::from_bits(0x3fefbdba3692d514));
394}
395