7 #include "../daw_json_exception.h"
9 #include <daw/daw_bit_cast.h>
10 #include <daw/daw_cxmath.h>
27 namespace fast_double_parser {
47 #define FASTFLOAT_SMALLEST_POWER -325
57 DAW_ATTRIBUTE_FLATTEN
inline constexpr std::uint64_t
59 std::uint64_t
const y ) {
60 std::uint64_t
const x0 =
static_cast<std::uint32_t
>( x );
61 std::uint64_t
const x1 = x >> 32;
62 std::uint64_t
const y0 =
static_cast<std::uint32_t
>( y );
63 std::uint64_t
const y1 = y >> 32;
64 std::uint64_t
const p11 = x1 * y1;
65 std::uint64_t
const p01 = x0 * y1;
66 std::uint64_t
const p10 = x1 * y0;
67 std::uint64_t
const p00 = x0 * y0;
70 std::uint64_t
const middle =
71 p10 + ( p00 >> 32 ) +
static_cast<std::uint32_t
>( p01 );
74 r_hi = p11 + ( middle >> 32 ) + ( p01 >> 32 );
77 return ( middle << 32 ) |
static_cast<std::uint32_t
>( p00 );
80 #if not defined( DAW_JSON_NO_INT128 ) and defined( __SIZEOF_INT128__ ) and \
81 ( not defined( _MSC_VER ) )
83 #pragma GCC diagnostic push
84 #pragma GCC diagnostic ignored "-Wpedantic"
86 DAW_ATTRIBUTE_FLATTEN
inline constexpr value128
88 std::uint64_t value2 ) {
89 __uint128_t
const r =
static_cast<__uint128_t
>( value1 ) * value2;
90 return value128{
static_cast<std::uint64_t
>( r ),
91 static_cast<std::uint64_t
>( r >> 64 ) };
94 DAW_ATTRIBUTE_FLATTEN
inline constexpr value128
96 std::uint64_t value2 ) {
103 #if defined( _MSC_VER )
104 DAW_ATTRIBUTE_FLATTEN
inline value128
106 std::uint64_t value2 ) {
112 __umulh( value1, value2 )
116 answer.
low = _umul128( value1, value2, &answer.high );
122 #if defined( _MSC_VER ) and not defined( __clang__ )
123 DAW_ATTRIBUTE_FLATTEN
inline int
124 leading_zeroes( runtime_exec_tag
const &, std::uint64_t input_num ) {
126 unsigned long leading_zero = 0;
129 if( _BitScanReverse64( &leading_zero, input_num ) ) {
130 return static_cast<int>( 63 - leading_zero );
136 DAW_ATTRIBUTE_FLATTEN
inline constexpr
int
137 leading_zeroes( constexpr_exec_tag
const &, std::uint64_t input_num ) {
138 return static_cast<int>(
139 daw::cxmath::cxmath_impl::count_leading_zeroes( input_num ) );
142 DAW_ATTRIBUTE_FLATTEN
inline constexpr
int
144 return __builtin_clzll( input_num );
158 namespace math_const {
162 1e0, 1e1, 1e2, 1e3, 1e4, 1e5, 1e6, 1e7,
163 1e8, 1e9, 1e10, 1e11, 1e12, 1e13, 1e14, 1e15,
164 1e16, 1e17, 1e18, 1e19, 1e20, 1e21, 1e22 };
173 0xa5ced43b7e3e9188, 0xcf42894a5dce35ea, 0x818995ce7aa0e1b2,
174 0xa1ebfb4219491a1f, 0xca66fa129f9b60a6, 0xfd00b897478238d0,
175 0x9e20735e8cb16382, 0xc5a890362fddbc62, 0xf712b443bbd52b7b,
176 0x9a6bb0aa55653b2d, 0xc1069cd4eabe89f8, 0xf148440a256e2c76,
177 0x96cd2a865764dbca, 0xbc807527ed3e12bc, 0xeba09271e88d976b,
178 0x93445b8731587ea3, 0xb8157268fdae9e4c, 0xe61acf033d1a45df,
179 0x8fd0c16206306bab, 0xb3c4f1ba87bc8696, 0xe0b62e2929aba83c,
180 0x8c71dcd9ba0b4925, 0xaf8e5410288e1b6f, 0xdb71e91432b1a24a,
181 0x892731ac9faf056e, 0xab70fe17c79ac6ca, 0xd64d3d9db981787d,
182 0x85f0468293f0eb4e, 0xa76c582338ed2621, 0xd1476e2c07286faa,
183 0x82cca4db847945ca, 0xa37fce126597973c, 0xcc5fc196fefd7d0c,
184 0xff77b1fcbebcdc4f, 0x9faacf3df73609b1, 0xc795830d75038c1d,
185 0xf97ae3d0d2446f25, 0x9becce62836ac577, 0xc2e801fb244576d5,
186 0xf3a20279ed56d48a, 0x9845418c345644d6, 0xbe5691ef416bd60c,
187 0xedec366b11c6cb8f, 0x94b3a202eb1c3f39, 0xb9e08a83a5e34f07,
188 0xe858ad248f5c22c9, 0x91376c36d99995be, 0xb58547448ffffb2d,
189 0xe2e69915b3fff9f9, 0x8dd01fad907ffc3b, 0xb1442798f49ffb4a,
190 0xdd95317f31c7fa1d, 0x8a7d3eef7f1cfc52, 0xad1c8eab5ee43b66,
191 0xd863b256369d4a40, 0x873e4f75e2224e68, 0xa90de3535aaae202,
192 0xd3515c2831559a83, 0x8412d9991ed58091, 0xa5178fff668ae0b6,
193 0xce5d73ff402d98e3, 0x80fa687f881c7f8e, 0xa139029f6a239f72,
194 0xc987434744ac874e, 0xfbe9141915d7a922, 0x9d71ac8fada6c9b5,
195 0xc4ce17b399107c22, 0xf6019da07f549b2b, 0x99c102844f94e0fb,
196 0xc0314325637a1939, 0xf03d93eebc589f88, 0x96267c7535b763b5,
197 0xbbb01b9283253ca2, 0xea9c227723ee8bcb, 0x92a1958a7675175f,
198 0xb749faed14125d36, 0xe51c79a85916f484, 0x8f31cc0937ae58d2,
199 0xb2fe3f0b8599ef07, 0xdfbdcece67006ac9, 0x8bd6a141006042bd,
200 0xaecc49914078536d, 0xda7f5bf590966848, 0x888f99797a5e012d,
201 0xaab37fd7d8f58178, 0xd5605fcdcf32e1d6, 0x855c3be0a17fcd26,
202 0xa6b34ad8c9dfc06f, 0xd0601d8efc57b08b, 0x823c12795db6ce57,
203 0xa2cb1717b52481ed, 0xcb7ddcdda26da268, 0xfe5d54150b090b02,
204 0x9efa548d26e5a6e1, 0xc6b8e9b0709f109a, 0xf867241c8cc6d4c0,
205 0x9b407691d7fc44f8, 0xc21094364dfb5636, 0xf294b943e17a2bc4,
206 0x979cf3ca6cec5b5a, 0xbd8430bd08277231, 0xece53cec4a314ebd,
207 0x940f4613ae5ed136, 0xb913179899f68584, 0xe757dd7ec07426e5,
208 0x9096ea6f3848984f, 0xb4bca50b065abe63, 0xe1ebce4dc7f16dfb,
209 0x8d3360f09cf6e4bd, 0xb080392cc4349dec, 0xdca04777f541c567,
210 0x89e42caaf9491b60, 0xac5d37d5b79b6239, 0xd77485cb25823ac7,
211 0x86a8d39ef77164bc, 0xa8530886b54dbdeb, 0xd267caa862a12d66,
212 0x8380dea93da4bc60, 0xa46116538d0deb78, 0xcd795be870516656,
213 0x806bd9714632dff6, 0xa086cfcd97bf97f3, 0xc8a883c0fdaf7df0,
214 0xfad2a4b13d1b5d6c, 0x9cc3a6eec6311a63, 0xc3f490aa77bd60fc,
215 0xf4f1b4d515acb93b, 0x991711052d8bf3c5, 0xbf5cd54678eef0b6,
216 0xef340a98172aace4, 0x9580869f0e7aac0e, 0xbae0a846d2195712,
217 0xe998d258869facd7, 0x91ff83775423cc06, 0xb67f6455292cbf08,
218 0xe41f3d6a7377eeca, 0x8e938662882af53e, 0xb23867fb2a35b28d,
219 0xdec681f9f4c31f31, 0x8b3c113c38f9f37e, 0xae0b158b4738705e,
220 0xd98ddaee19068c76, 0x87f8a8d4cfa417c9, 0xa9f6d30a038d1dbc,
221 0xd47487cc8470652b, 0x84c8d4dfd2c63f3b, 0xa5fb0a17c777cf09,
222 0xcf79cc9db955c2cc, 0x81ac1fe293d599bf, 0xa21727db38cb002f,
223 0xca9cf1d206fdc03b, 0xfd442e4688bd304a, 0x9e4a9cec15763e2e,
224 0xc5dd44271ad3cdba, 0xf7549530e188c128, 0x9a94dd3e8cf578b9,
225 0xc13a148e3032d6e7, 0xf18899b1bc3f8ca1, 0x96f5600f15a7b7e5,
226 0xbcb2b812db11a5de, 0xebdf661791d60f56, 0x936b9fcebb25c995,
227 0xb84687c269ef3bfb, 0xe65829b3046b0afa, 0x8ff71a0fe2c2e6dc,
228 0xb3f4e093db73a093, 0xe0f218b8d25088b8, 0x8c974f7383725573,
229 0xafbd2350644eeacf, 0xdbac6c247d62a583, 0x894bc396ce5da772,
230 0xab9eb47c81f5114f, 0xd686619ba27255a2, 0x8613fd0145877585,
231 0xa798fc4196e952e7, 0xd17f3b51fca3a7a0, 0x82ef85133de648c4,
232 0xa3ab66580d5fdaf5, 0xcc963fee10b7d1b3, 0xffbbcfe994e5c61f,
233 0x9fd561f1fd0f9bd3, 0xc7caba6e7c5382c8, 0xf9bd690a1b68637b,
234 0x9c1661a651213e2d, 0xc31bfa0fe5698db8, 0xf3e2f893dec3f126,
235 0x986ddb5c6b3a76b7, 0xbe89523386091465, 0xee2ba6c0678b597f,
236 0x94db483840b717ef, 0xba121a4650e4ddeb, 0xe896a0d7e51e1566,
237 0x915e2486ef32cd60, 0xb5b5ada8aaff80b8, 0xe3231912d5bf60e6,
238 0x8df5efabc5979c8f, 0xb1736b96b6fd83b3, 0xddd0467c64bce4a0,
239 0x8aa22c0dbef60ee4, 0xad4ab7112eb3929d, 0xd89d64d57a607744,
240 0x87625f056c7c4a8b, 0xa93af6c6c79b5d2d, 0xd389b47879823479,
241 0x843610cb4bf160cb, 0xa54394fe1eedb8fe, 0xce947a3da6a9273e,
242 0x811ccc668829b887, 0xa163ff802a3426a8, 0xc9bcff6034c13052,
243 0xfc2c3f3841f17c67, 0x9d9ba7832936edc0, 0xc5029163f384a931,
244 0xf64335bcf065d37d, 0x99ea0196163fa42e, 0xc06481fb9bcf8d39,
245 0xf07da27a82c37088, 0x964e858c91ba2655, 0xbbe226efb628afea,
246 0xeadab0aba3b2dbe5, 0x92c8ae6b464fc96f, 0xb77ada0617e3bbcb,
247 0xe55990879ddcaabd, 0x8f57fa54c2a9eab6, 0xb32df8e9f3546564,
248 0xdff9772470297ebd, 0x8bfbea76c619ef36, 0xaefae51477a06b03,
249 0xdab99e59958885c4, 0x88b402f7fd75539b, 0xaae103b5fcd2a881,
250 0xd59944a37c0752a2, 0x857fcae62d8493a5, 0xa6dfbd9fb8e5b88e,
251 0xd097ad07a71f26b2, 0x825ecc24c873782f, 0xa2f67f2dfa90563b,
252 0xcbb41ef979346bca, 0xfea126b7d78186bc, 0x9f24b832e6b0f436,
253 0xc6ede63fa05d3143, 0xf8a95fcf88747d94, 0x9b69dbe1b548ce7c,
254 0xc24452da229b021b, 0xf2d56790ab41c2a2, 0x97c560ba6b0919a5,
255 0xbdb6b8e905cb600f, 0xed246723473e3813, 0x9436c0760c86e30b,
256 0xb94470938fa89bce, 0xe7958cb87392c2c2, 0x90bd77f3483bb9b9,
257 0xb4ecd5f01a4aa828, 0xe2280b6c20dd5232, 0x8d590723948a535f,
258 0xb0af48ec79ace837, 0xdcdb1b2798182244, 0x8a08f0f8bf0f156b,
259 0xac8b2d36eed2dac5, 0xd7adf884aa879177, 0x86ccbb52ea94baea,
260 0xa87fea27a539e9a5, 0xd29fe4b18e88640e, 0x83a3eeeef9153e89,
261 0xa48ceaaab75a8e2b, 0xcdb02555653131b6, 0x808e17555f3ebf11,
262 0xa0b19d2ab70e6ed6, 0xc8de047564d20a8b, 0xfb158592be068d2e,
263 0x9ced737bb6c4183d, 0xc428d05aa4751e4c, 0xf53304714d9265df,
264 0x993fe2c6d07b7fab, 0xbf8fdb78849a5f96, 0xef73d256a5c0f77c,
265 0x95a8637627989aad, 0xbb127c53b17ec159, 0xe9d71b689dde71af,
266 0x9226712162ab070d, 0xb6b00d69bb55c8d1, 0xe45c10c42a2b3b05,
267 0x8eb98a7a9a5b04e3, 0xb267ed1940f1c61c, 0xdf01e85f912e37a3,
268 0x8b61313bbabce2c6, 0xae397d8aa96c1b77, 0xd9c7dced53c72255,
269 0x881cea14545c7575, 0xaa242499697392d2, 0xd4ad2dbfc3d07787,
270 0x84ec3c97da624ab4, 0xa6274bbdd0fadd61, 0xcfb11ead453994ba,
271 0x81ceb32c4b43fcf4, 0xa2425ff75e14fc31, 0xcad2f7f5359a3b3e,
272 0xfd87b5f28300ca0d, 0x9e74d1b791e07e48, 0xc612062576589dda,
273 0xf79687aed3eec551, 0x9abe14cd44753b52, 0xc16d9a0095928a27,
274 0xf1c90080baf72cb1, 0x971da05074da7bee, 0xbce5086492111aea,
275 0xec1e4a7db69561a5, 0x9392ee8e921d5d07, 0xb877aa3236a4b449,
276 0xe69594bec44de15b, 0x901d7cf73ab0acd9, 0xb424dc35095cd80f,
277 0xe12e13424bb40e13, 0x8cbccc096f5088cb, 0xafebff0bcb24aafe,
278 0xdbe6fecebdedd5be, 0x89705f4136b4a597, 0xabcc77118461cefc,
279 0xd6bf94d5e57a42bc, 0x8637bd05af6c69b5, 0xa7c5ac471b478423,
280 0xd1b71758e219652b, 0x83126e978d4fdf3b, 0xa3d70a3d70a3d70a,
281 0xcccccccccccccccc, 0x8000000000000000, 0xa000000000000000,
282 0xc800000000000000, 0xfa00000000000000, 0x9c40000000000000,
283 0xc350000000000000, 0xf424000000000000, 0x9896800000000000,
284 0xbebc200000000000, 0xee6b280000000000, 0x9502f90000000000,
285 0xba43b74000000000, 0xe8d4a51000000000, 0x9184e72a00000000,
286 0xb5e620f480000000, 0xe35fa931a0000000, 0x8e1bc9bf04000000,
287 0xb1a2bc2ec5000000, 0xde0b6b3a76400000, 0x8ac7230489e80000,
288 0xad78ebc5ac620000, 0xd8d726b7177a8000, 0x878678326eac9000,
289 0xa968163f0a57b400, 0xd3c21bcecceda100, 0x84595161401484a0,
290 0xa56fa5b99019a5c8, 0xcecb8f27f4200f3a, 0x813f3978f8940984,
291 0xa18f07d736b90be5, 0xc9f2c9cd04674ede, 0xfc6f7c4045812296,
292 0x9dc5ada82b70b59d, 0xc5371912364ce305, 0xf684df56c3e01bc6,
293 0x9a130b963a6c115c, 0xc097ce7bc90715b3, 0xf0bdc21abb48db20,
294 0x96769950b50d88f4, 0xbc143fa4e250eb31, 0xeb194f8e1ae525fd,
295 0x92efd1b8d0cf37be, 0xb7abc627050305ad, 0xe596b7b0c643c719,
296 0x8f7e32ce7bea5c6f, 0xb35dbf821ae4f38b, 0xe0352f62a19e306e,
297 0x8c213d9da502de45, 0xaf298d050e4395d6, 0xdaf3f04651d47b4c,
298 0x88d8762bf324cd0f, 0xab0e93b6efee0053, 0xd5d238a4abe98068,
299 0x85a36366eb71f041, 0xa70c3c40a64e6c51, 0xd0cf4b50cfe20765,
300 0x82818f1281ed449f, 0xa321f2d7226895c7, 0xcbea6f8ceb02bb39,
301 0xfee50b7025c36a08, 0x9f4f2726179a2245, 0xc722f0ef9d80aad6,
302 0xf8ebad2b84e0d58b, 0x9b934c3b330c8577, 0xc2781f49ffcfa6d5,
303 0xf316271c7fc3908a, 0x97edd871cfda3a56, 0xbde94e8e43d0c8ec,
304 0xed63a231d4c4fb27, 0x945e455f24fb1cf8, 0xb975d6b6ee39e436,
305 0xe7d34c64a9c85d44, 0x90e40fbeea1d3a4a, 0xb51d13aea4a488dd,
306 0xe264589a4dcdab14, 0x8d7eb76070a08aec, 0xb0de65388cc8ada8,
307 0xdd15fe86affad912, 0x8a2dbf142dfcc7ab, 0xacb92ed9397bf996,
308 0xd7e77a8f87daf7fb, 0x86f0ac99b4e8dafd, 0xa8acd7c0222311bc,
309 0xd2d80db02aabd62b, 0x83c7088e1aab65db, 0xa4b8cab1a1563f52,
310 0xcde6fd5e09abcf26, 0x80b05e5ac60b6178, 0xa0dc75f1778e39d6,
311 0xc913936dd571c84c, 0xfb5878494ace3a5f, 0x9d174b2dcec0e47b,
312 0xc45d1df942711d9a, 0xf5746577930d6500, 0x9968bf6abbe85f20,
313 0xbfc2ef456ae276e8, 0xefb3ab16c59b14a2, 0x95d04aee3b80ece5,
314 0xbb445da9ca61281f, 0xea1575143cf97226, 0x924d692ca61be758,
315 0xb6e0c377cfa2e12e, 0xe498f455c38b997a, 0x8edf98b59a373fec,
316 0xb2977ee300c50fe7, 0xdf3d5e9bc0f653e1, 0x8b865b215899f46c,
317 0xae67f1e9aec07187, 0xda01ee641a708de9, 0x884134fe908658b2,
318 0xaa51823e34a7eede, 0xd4e5e2cdc1d1ea96, 0x850fadc09923329e,
319 0xa6539930bf6bff45, 0xcfe87f7cef46ff16, 0x81f14fae158c5f6e,
320 0xa26da3999aef7749, 0xcb090c8001ab551c, 0xfdcb4fa002162a63,
321 0x9e9f11c4014dda7e, 0xc646d63501a1511d, 0xf7d88bc24209a565,
322 0x9ae757596946075f, 0xc1a12d2fc3978937, 0xf209787bb47d6b84,
323 0x9745eb4d50ce6332, 0xbd176620a501fbff, 0xec5d3fa8ce427aff,
324 0x93ba47c980e98cdf, 0xb8a8d9bbe123f017, 0xe6d3102ad96cec1d,
325 0x9043ea1ac7e41392, 0xb454e4a179dd1877, 0xe16a1dc9d8545e94,
326 0x8ce2529e2734bb1d, 0xb01ae745b101e9e4, 0xdc21a1171d42645d,
327 0x899504ae72497eba, 0xabfa45da0edbde69, 0xd6f8d7509292d603,
328 0x865b86925b9bc5c2, 0xa7f26836f282b732, 0xd1ef0244af2364ff,
329 0x8335616aed761f1f, 0xa402b9c5a8d3a6e7, 0xcd036837130890a1,
330 0x802221226be55a64, 0xa02aa96b06deb0fd, 0xc83553c5c8965d3d,
331 0xfa42a8b73abbf48c, 0x9c69a97284b578d7, 0xc38413cf25e2d70d,
332 0xf46518c2ef5b8cd1, 0x98bf2f79d5993802, 0xbeeefb584aff8603,
333 0xeeaaba2e5dbf6784, 0x952ab45cfa97a0b2, 0xba756174393d88df,
334 0xe912b9d1478ceb17, 0x91abb422ccb812ee, 0xb616a12b7fe617aa,
335 0xe39c49765fdf9d94, 0x8e41ade9fbebc27d, 0xb1d219647ae6b31c,
336 0xde469fbd99a05fe3, 0x8aec23d680043bee, 0xada72ccc20054ae9,
337 0xd910f7ff28069da4, 0x87aa9aff79042286, 0xa99541bf57452b28,
338 0xd3fa922f2d1675f2, 0x847c9b5d7c2e09b7, 0xa59bc234db398c25,
339 0xcf02b2c21207ef2e, 0x8161afb94b44f57d, 0xa1ba1ba79e1632dc,
340 0xca28a291859bbf93, 0xfcb2cb35e702af78, 0x9defbf01b061adab,
341 0xc56baec21c7a1916, 0xf6c69a72a3989f5b, 0x9a3c2087a63f6399,
342 0xc0cb28a98fcf3c7f, 0xf0fdf2d3f3c30b9f, 0x969eb7c47859e743,
343 0xbc4665b596706114, 0xeb57ff22fc0c7959, 0x9316ff75dd87cbd8,
344 0xb7dcbf5354e9bece, 0xe5d3ef282a242e81, 0x8fa475791a569d10,
345 0xb38d92d760ec4455, 0xe070f78d3927556a, 0x8c469ab843b89562,
346 0xaf58416654a6babb, 0xdb2e51bfe9d0696a, 0x88fcf317f22241e2,
347 0xab3c2fddeeaad25a, 0xd60b3bd56a5586f1, 0x85c7056562757456,
348 0xa738c6bebb12d16c, 0xd106f86e69d785c7, 0x82a45b450226b39c,
349 0xa34d721642b06084, 0xcc20ce9bd35c78a5, 0xff290242c83396ce,
350 0x9f79a169bd203e41, 0xc75809c42c684dd1, 0xf92e0c3537826145,
351 0x9bbcc7a142b17ccb, 0xc2abf989935ddbfe, 0xf356f7ebf83552fe,
352 0x98165af37b2153de, 0xbe1bf1b059e9a8d6, 0xeda2ee1c7064130c,
353 0x9485d4d1c63e8be7, 0xb9a74a0637ce2ee1, 0xe8111c87c5c1ba99,
354 0x910ab1d4db9914a0, 0xb54d5e4a127f59c8, 0xe2a0b5dc971f303a,
355 0x8da471a9de737e24, 0xb10d8e1456105dad, 0xdd50f1996b947518,
356 0x8a5296ffe33cc92f, 0xace73cbfdc0bfb7b, 0xd8210befd30efa5a,
357 0x8714a775e3e95c78, 0xa8d9d1535ce3b396, 0xd31045a8341ca07c,
358 0x83ea2b892091e44d, 0xa4e4b66b68b65d60, 0xce1de40642e3f4b9,
359 0x80d2ae83e9ce78f3, 0xa1075a24e4421730, 0xc94930ae1d529cfc,
360 0xfb9b7cd9a4a7443c, 0x9d412e0806e88aa5, 0xc491798a08a2ad4e,
361 0xf5b5d7ec8acb58a2, 0x9991a6f3d6bf1765, 0xbff610b0cc6edd3f,
362 0xeff394dcff8a948e, 0x95f83d0a1fb69cd9, 0xbb764c4ca7a4440f,
363 0xea53df5fd18d5513, 0x92746b9be2f8552c, 0xb7118682dbb66a77,
364 0xe4d5e82392a40515, 0x8f05b1163ba6832d, 0xb2c71d5bca9023f8,
365 0xdf78e4b2bd342cf6, 0x8bab8eefb6409c1a, 0xae9672aba3d0c320,
366 0xda3c0f568cc4f3e8, 0x8865899617fb1871, 0xaa7eebfb9df9de8d,
367 0xd51ea6fa85785631, 0x8533285c936b35de, 0xa67ff273b8460356,
368 0xd01fef10a657842c, 0x8213f56a67f6b29b, 0xa298f2c501f45f42,
369 0xcb3f2f7642717713, 0xfe0efb53d30dd4d7, 0x9ec95d1463e8a506,
370 0xc67bb4597ce2ce48, 0xf81aa16fdc1b81da, 0x9b10a4e5e9913128,
371 0xc1d4ce1f63f57d72, 0xf24a01a73cf2dccf, 0x976e41088617ca01,
372 0xbd49d14aa79dbc82, 0xec9c459d51852ba2, 0x93e1ab8252f33b45,
373 0xb8da1662e7b00a17, 0xe7109bfba19c0c9d, 0x906a617d450187e2,
374 0xb484f9dc9641e9da, 0xe1a63853bbd26451, 0x8d07e33455637eb2,
375 0xb049dc016abc5e5f, 0xdc5c5301c56b75f7, 0x89b9b3e11b6329ba,
376 0xac2820d9623bf429, 0xd732290fbacaf133, 0x867f59a9d4bed6c0,
377 0xa81f301449ee8c70, 0xd226fc195c6a2f8c, 0x83585d8fd9c25db7,
378 0xa42e74f3d032f525, 0xcd3a1230c43fb26f, 0x80444b5e7aa7cf85,
379 0xa0555e361951c366, 0xc86ab5c39fa63440, 0xfa856334878fc150,
380 0x9c935e00d4b9d8d2, 0xc3b8358109e84f07, 0xf4a642e14c6262c8,
381 0x98e7e9cccfbd7dbd, 0xbf21e44003acdd2c, 0xeeea5d5004981478,
382 0x95527a5202df0ccb, 0xbaa718e68396cffd, 0xe950df20247c83fd,
383 0x91d28b7416cdd27e, 0xb6472e511c81471d, 0xe3d8f9e563a198e5,
384 0x8e679c2f5e44ff8f };
1033 template<
typename ExecTag>
1035 std::uint64_t whole,
double sign ) {
1037 if( ( power < daw::numeric_limits<double>::min_exponent10 ) |
1038 ( power > daw::numeric_limits<double>::max_exponent10 ) ) {
1039 return daw::cxmath::copy_sign(
1040 daw::json::json_details::power10<double>(
1041 exec_tag,
static_cast<double>( whole ), power ),
1048 #if( FLT_EVAL_METHOD != 1 ) and ( FLT_EVAL_METHOD != 0 )
1050 if( ( 0 <= power ) & ( power <= 22 ) & ( whole <= 9007199254740991 ) ) {
1052 if( ( ( -22 <= power ) & ( power <= 22 ) ) &
1053 ( whole <= 9'007'199'254'740'991 ) ) {
1064 return daw::cxmath::copy_sign(
1065 daw::json::json_details::power10<double>(
1066 exec_tag,
static_cast<double>( whole ), power ),
1094 return daw::cxmath::copy_sign( 0.0, sign );
1102 std::uint64_t factor_mantissa = [&] {
1134 std::int64_t
const exponent =
1135 ( ( ( 152'170 + 65'536 ) * power ) >> 16 ) + 1024 + 63;
1138 auto const whole_orig = whole;
1144 auto [lower, upper] =
1161 ( lower + whole < lower ) ) {
1162 std::uint64_t factor_mantissa_low =
1167 auto const [product_low, product_middle2] =
1169 std::uint64_t
const product_middle1 = lower;
1170 std::uint64_t product_high = upper;
1171 std::uint64_t
const product_middle =
1172 product_middle1 + product_middle2;
1174 if( product_middle < product_middle1 ) {
1179 if( ( ( product_middle + 1 == 0 ) &&
1180 ( ( product_high & 0x1FF ) == 0x1FF ) &&
1181 ( product_low + whole <
1183 return daw::cxmath::copy_sign(
1184 daw::json::json_details::power10<double>(
1185 exec_tag,
static_cast<double>( whole_orig ), power ),
1188 upper = product_high;
1189 lower = product_middle;
1194 std::uint64_t
const upperbit = upper >> 63;
1195 std::uint64_t mantissa = upper >> ( upperbit + 9 );
1196 lz +=
static_cast<int>( 1 ^ upperbit );
1222 ( ( mantissa & 3 ) == 1 ) ) ) {
1223 return daw::cxmath::copy_sign(
1224 daw::json::json_details::power10<double>(
1225 exec_tag,
static_cast<double>( whole_orig ), power ),
1229 mantissa += mantissa & 1;
1232 if( mantissa >= ( 1ULL << 53 ) ) {
1237 mantissa = ( 1ULL << 52 );
1240 mantissa &= ~( 1ULL << 52 );
1241 auto const real_exponent =
static_cast<std::uint64_t
>( exponent - lz );
1245 ( real_exponent > 2046 ) ) ) {
1246 return daw::cxmath::copy_sign(
1247 daw::json::json_details::power10<double>(
1248 exec_tag,
static_cast<double>( whole_orig ), power ),
1252 mantissa |= real_exponent << 52;
1253 mantissa |= ( (
static_cast<uint64_t
>( sign < 0 ) ) << 63 );
1255 return DAW_BIT_CAST(
double, mantissa );
#define DAW_JSON_UNLIKELY(Bool)
Definition: daw_json_defs.h:22
#define FASTFLOAT_SMALLEST_POWER
Definition: fast_double_parser.h:47
constexpr std::uint64_t mantissa_128[]
Definition: fast_double_parser.h:388
constexpr double power_of_ten[]
Definition: fast_double_parser.h:161
constexpr std::uint64_t mantissa_64[]
Definition: fast_double_parser.h:172
constexpr double compute_float_64(ExecTag exec_tag, std::int64_t power, std::uint64_t whole, double sign)
Definition: fast_double_parser.h:1034
constexpr DAW_ATTRIBUTE_FLATTEN int leading_zeroes(constexpr_exec_tag const &, std::uint64_t input_num)
Definition: fast_double_parser.h:143
constexpr DAW_ATTRIBUTE_FLATTEN value128 full_multiplication(constexpr_exec_tag const &, std::uint64_t value1, std::uint64_t value2)
Definition: fast_double_parser.h:95
constexpr DAW_ATTRIBUTE_FLATTEN std::uint64_t Emulate64x64to128(std::uint64_t &r_hi, std::uint64_t const x, std::uint64_t const y)
Definition: fast_double_parser.h:58
Definition: daw_from_json.h:22
Definition: daw_json_exec_modes.h:21
Definition: fast_double_parser.h:49
std::uint64_t high
Definition: fast_double_parser.h:51
std::uint64_t low
Definition: fast_double_parser.h:50
Definition: daw_json_exec_modes.h:31
#define DAW_JSON_VER
Definition: version.h:11