1 // fast_float by Daniel Lemire
2 // fast_float by João Paulo Magalhaes
3 
4 
5 // with contributions from Eugene Golushkov
6 // with contributions from Maksim Kita
7 // with contributions from Marcin Wojdyr
8 // with contributions from Neal Richardson
9 // with contributions from Tim Paine
10 // with contributions from Fabio Pellacini
11 
12 
13 // Permission is hereby granted, free of charge, to any
14 // person obtaining a copy of this software and associated
15 // documentation files (the "Software"), to deal in the
16 // Software without restriction, including without
17 // limitation the rights to use, copy, modify, merge,
18 // publish, distribute, sublicense, and/or sell copies of
19 // the Software, and to permit persons to whom the Software
20 // is furnished to do so, subject to the following
21 // conditions:
22 //
23 // The above copyright notice and this permission notice
24 // shall be included in all copies or substantial portions
25 // of the Software.
26 //
27 // THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF
28 // ANY KIND, EXPRESS OR IMPLIED, INCLUDING BUT NOT LIMITED
29 // TO THE WARRANTIES OF MERCHANTABILITY, FITNESS FOR A
30 // PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT
31 // SHALL THE AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY
32 // CLAIM, DAMAGES OR OTHER LIABILITY, WHETHER IN AN ACTION
33 // OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, OUT OF OR
34 // IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER
35 // DEALINGS IN THE SOFTWARE.
36 
37 
38 #ifndef FASTFLOAT_FAST_FLOAT_H
39 #define FASTFLOAT_FAST_FLOAT_H
40 
41 #include <system_error>
42 
43 namespace fast_float {
44 enum chars_format {
45     scientific = 1<<0,
46     fixed = 1<<2,
47     hex = 1<<3,
48     general = fixed | scientific
49 };
50 
51 
52 struct from_chars_result {
53   const char *ptr;
54   std::errc ec;
55 };
56 
57 struct parse_options {
58   constexpr explicit parse_options(chars_format fmt = chars_format::general,
59                          char dot = '.')
formatparse_options60     : format(fmt), decimal_point(dot) {}
61 
62   /** Which number formats are accepted */
63   chars_format format;
64   /** The character used as decimal point */
65   char decimal_point;
66 };
67 
68 /**
69  * This function parses the character sequence [first,last) for a number. It parses floating-point numbers expecting
70  * a locale-indepent format equivalent to what is used by std::strtod in the default ("C") locale.
71  * The resulting floating-point value is the closest floating-point values (using either float or double),
72  * using the "round to even" convention for values that would otherwise fall right in-between two values.
73  * That is, we provide exact parsing according to the IEEE standard.
74  *
75  * Given a successful parse, the pointer (`ptr`) in the returned value is set to point right after the
76  * parsed number, and the `value` referenced is set to the parsed value. In case of error, the returned
77  * `ec` contains a representative error, otherwise the default (`std::errc()`) value is stored.
78  *
79  * The implementation does not throw and does not allocate memory (e.g., with `new` or `malloc`).
80  *
81  * Like the C++17 standard, the `fast_float::from_chars` functions take an optional last argument of
82  * the type `fast_float::chars_format`. It is a bitset value: we check whether
83  * `fmt & fast_float::chars_format::fixed` and `fmt & fast_float::chars_format::scientific` are set
84  * to determine whether we allowe the fixed point and scientific notation respectively.
85  * The default is  `fast_float::chars_format::general` which allows both `fixed` and `scientific`.
86  */
87 template<typename T>
88 from_chars_result from_chars(const char *first, const char *last,
89                              T &value, chars_format fmt = chars_format::general)  noexcept;
90 
91 /**
92  * Like from_chars, but accepts an `options` argument to govern number parsing.
93  */
94 template<typename T>
95 from_chars_result from_chars_advanced(const char *first, const char *last,
96                                       T &value, parse_options options)  noexcept;
97 
98 }
99 #endif // FASTFLOAT_FAST_FLOAT_H
100 
101 
102 #ifndef FASTFLOAT_FLOAT_COMMON_H
103 #define FASTFLOAT_FLOAT_COMMON_H
104 
105 #include <cfloat>
106 #include <cstdint>
107 #include <cassert>
108 #include <cstring>
109 
110 #if (defined(__x86_64) || defined(__x86_64__) || defined(_M_X64)   \
111        || defined(__amd64) || defined(__aarch64__) || defined(_M_ARM64) \
112        || defined(__MINGW64__)                                          \
113        || defined(__s390x__)                                            \
114        || (defined(__ppc64__) || defined(__PPC64__) || defined(__ppc64le__) || defined(__PPC64LE__)) \
115        || defined(__EMSCRIPTEN__))
116 #define FASTFLOAT_64BIT
117 #elif (defined(__i386) || defined(__i386__) || defined(_M_IX86)   \
118      || defined(__arm__) || defined(_M_ARM)                   \
119      || defined(__MINGW32__))
120 #define FASTFLOAT_32BIT
121 #else
122   // Need to check incrementally, since SIZE_MAX is a size_t, avoid overflow.
123   // We can never tell the register width, but the SIZE_MAX is a good approximation.
124   // UINTPTR_MAX and INTPTR_MAX are optional, so avoid them for max portability.
125   #if SIZE_MAX == 0xffff
126     #error Unknown platform (16-bit, unsupported)
127   #elif SIZE_MAX == 0xffffffff
128     #define FASTFLOAT_32BIT
129   #elif SIZE_MAX == 0xffffffffffffffff
130     #define FASTFLOAT_64BIT
131   #else
132     #error Unknown platform (not 32-bit, not 64-bit?)
133   #endif
134 #endif
135 
136 #if ((defined(_WIN32) || defined(_WIN64)) && !defined(__clang__))
137 #include <intrin.h>
138 #endif
139 
140 #if defined(_MSC_VER) && !defined(__clang__)
141 #define FASTFLOAT_VISUAL_STUDIO 1
142 #endif
143 
144 #ifdef _WIN32
145 #define FASTFLOAT_IS_BIG_ENDIAN 0
146 #else
147 #if defined(__APPLE__) || defined(__FreeBSD__)
148 #include <machine/endian.h>
149 #elif defined(sun) || defined(__sun)
150 #include <sys/byteorder.h>
151 #else
152 #include <endian.h>
153 #endif
154 #
155 #ifndef __BYTE_ORDER__
156 // safe choice
157 #define FASTFLOAT_IS_BIG_ENDIAN 0
158 #endif
159 #
160 #ifndef __ORDER_LITTLE_ENDIAN__
161 // safe choice
162 #define FASTFLOAT_IS_BIG_ENDIAN 0
163 #endif
164 #
165 #if __BYTE_ORDER__ == __ORDER_LITTLE_ENDIAN__
166 #define FASTFLOAT_IS_BIG_ENDIAN 0
167 #else
168 #define FASTFLOAT_IS_BIG_ENDIAN 1
169 #endif
170 #endif
171 
172 #ifdef FASTFLOAT_VISUAL_STUDIO
173 #define fastfloat_really_inline __forceinline
174 #else
175 #define fastfloat_really_inline inline __attribute__((always_inline))
176 #endif
177 
178 #ifndef FASTFLOAT_ASSERT
179 #define FASTFLOAT_ASSERT(x)  { if (!(x)) abort(); }
180 #endif
181 
182 #ifndef FASTFLOAT_DEBUG_ASSERT
183 #include <cassert>
184 #define FASTFLOAT_DEBUG_ASSERT(x) assert(x)
185 #endif
186 
187 // rust style `try!()` macro, or `?` operator
188 #define FASTFLOAT_TRY(x) { if (!(x)) return false; }
189 
190 namespace fast_float {
191 
192 // Compares two ASCII strings in a case insensitive manner.
fastfloat_strncasecmp(const char * input1,const char * input2,size_t length)193 inline bool fastfloat_strncasecmp(const char *input1, const char *input2,
194                                   size_t length) {
195   char running_diff{0};
196   for (size_t i = 0; i < length; i++) {
197     running_diff |= (input1[i] ^ input2[i]);
198   }
199   return (running_diff == 0) || (running_diff == 32);
200 }
201 
202 #ifndef FLT_EVAL_METHOD
203 #error "FLT_EVAL_METHOD should be defined, please include cfloat."
204 #endif
205 
206 // a pointer and a length to a contiguous block of memory
207 template <typename T>
208 struct span {
209   const T* ptr;
210   size_t length;
spanspan211   span(const T* _ptr, size_t _length) : ptr(_ptr), length(_length) {}
spanspan212   span() : ptr(nullptr), length(0) {}
213 
lenspan214   constexpr size_t len() const noexcept {
215     return length;
216   }
217 
218   const T& operator[](size_t index) const noexcept {
219     FASTFLOAT_DEBUG_ASSERT(index < length);
220     return ptr[index];
221   }
222 };
223 
224 struct value128 {
225   uint64_t low;
226   uint64_t high;
value128value128227   value128(uint64_t _low, uint64_t _high) : low(_low), high(_high) {}
value128value128228   value128() : low(0), high(0) {}
229 };
230 
231 /* result might be undefined when input_num is zero */
leading_zeroes(uint64_t input_num)232 fastfloat_really_inline int leading_zeroes(uint64_t input_num) {
233   assert(input_num > 0);
234 #ifdef FASTFLOAT_VISUAL_STUDIO
235   #if defined(_M_X64) || defined(_M_ARM64)
236   unsigned long leading_zero = 0;
237   // Search the mask data from most significant bit (MSB)
238   // to least significant bit (LSB) for a set bit (1).
239   _BitScanReverse64(&leading_zero, input_num);
240   return (int)(63 - leading_zero);
241   #else
242   int last_bit = 0;
243   if(input_num & uint64_t(0xffffffff00000000)) input_num >>= 32, last_bit |= 32;
244   if(input_num & uint64_t(        0xffff0000)) input_num >>= 16, last_bit |= 16;
245   if(input_num & uint64_t(            0xff00)) input_num >>=  8, last_bit |=  8;
246   if(input_num & uint64_t(              0xf0)) input_num >>=  4, last_bit |=  4;
247   if(input_num & uint64_t(               0xc)) input_num >>=  2, last_bit |=  2;
248   if(input_num & uint64_t(               0x2)) input_num >>=  1, last_bit |=  1;
249   return 63 - last_bit;
250   #endif
251 #else
252   return __builtin_clzll(input_num);
253 #endif
254 }
255 
256 #ifdef FASTFLOAT_32BIT
257 
258 // slow emulation routine for 32-bit
emulu(uint32_t x,uint32_t y)259 fastfloat_really_inline uint64_t emulu(uint32_t x, uint32_t y) {
260     return x * (uint64_t)y;
261 }
262 
263 // slow emulation routine for 32-bit
264 #if !defined(__MINGW64__)
_umul128(uint64_t ab,uint64_t cd,uint64_t * hi)265 fastfloat_really_inline uint64_t _umul128(uint64_t ab, uint64_t cd,
266                                           uint64_t *hi) {
267   uint64_t ad = emulu((uint32_t)(ab >> 32), (uint32_t)cd);
268   uint64_t bd = emulu((uint32_t)ab, (uint32_t)cd);
269   uint64_t adbc = ad + emulu((uint32_t)ab, (uint32_t)(cd >> 32));
270   uint64_t adbc_carry = !!(adbc < ad);
271   uint64_t lo = bd + (adbc << 32);
272   *hi = emulu((uint32_t)(ab >> 32), (uint32_t)(cd >> 32)) + (adbc >> 32) +
273         (adbc_carry << 32) + !!(lo < bd);
274   return lo;
275 }
276 #endif // !__MINGW64__
277 
278 #endif // FASTFLOAT_32BIT
279 
280 
281 // compute 64-bit a*b
full_multiplication(uint64_t a,uint64_t b)282 fastfloat_really_inline value128 full_multiplication(uint64_t a,
283                                                      uint64_t b) {
284   value128 answer;
285 #ifdef _M_ARM64
286   // ARM64 has native support for 64-bit multiplications, no need to emulate
287   answer.high = __umulh(a, b);
288   answer.low = a * b;
289 #elif defined(FASTFLOAT_32BIT) || (defined(_WIN64) && !defined(__clang__))
290   answer.low = _umul128(a, b, &answer.high); // _umul128 not available on ARM64
291 #elif defined(FASTFLOAT_64BIT)
292   __uint128_t r = ((__uint128_t)a) * b;
293   answer.low = uint64_t(r);
294   answer.high = uint64_t(r >> 64);
295 #else
296   #error Not implemented
297 #endif
298   return answer;
299 }
300 
301 struct adjusted_mantissa {
302   uint64_t mantissa{0};
303   int32_t power2{0}; // a negative value indicates an invalid result
304   adjusted_mantissa() = default;
305   bool operator==(const adjusted_mantissa &o) const {
306     return mantissa == o.mantissa && power2 == o.power2;
307   }
308   bool operator!=(const adjusted_mantissa &o) const {
309     return mantissa != o.mantissa || power2 != o.power2;
310   }
311 };
312 
313 // Bias so we can get the real exponent with an invalid adjusted_mantissa.
314 constexpr static int32_t invalid_am_bias = -0x8000;
315 
316 constexpr static double powers_of_ten_double[] = {
317     1e0,  1e1,  1e2,  1e3,  1e4,  1e5,  1e6,  1e7,  1e8,  1e9,  1e10, 1e11,
318     1e12, 1e13, 1e14, 1e15, 1e16, 1e17, 1e18, 1e19, 1e20, 1e21, 1e22};
319 constexpr static float powers_of_ten_float[] = {1e0, 1e1, 1e2, 1e3, 1e4, 1e5,
320                                                 1e6, 1e7, 1e8, 1e9, 1e10};
321 
322 template <typename T> struct binary_format {
323   static inline constexpr int mantissa_explicit_bits();
324   static inline constexpr int minimum_exponent();
325   static inline constexpr int infinite_power();
326   static inline constexpr int sign_index();
327   static inline constexpr int min_exponent_fast_path();
328   static inline constexpr int max_exponent_fast_path();
329   static inline constexpr int max_exponent_round_to_even();
330   static inline constexpr int min_exponent_round_to_even();
331   static inline constexpr uint64_t max_mantissa_fast_path();
332   static inline constexpr int largest_power_of_ten();
333   static inline constexpr int smallest_power_of_ten();
334   static inline constexpr T exact_power_of_ten(int64_t power);
335   static inline constexpr size_t max_digits();
336 };
337 
mantissa_explicit_bits()338 template <> inline constexpr int binary_format<double>::mantissa_explicit_bits() {
339   return 52;
340 }
mantissa_explicit_bits()341 template <> inline constexpr int binary_format<float>::mantissa_explicit_bits() {
342   return 23;
343 }
344 
max_exponent_round_to_even()345 template <> inline constexpr int binary_format<double>::max_exponent_round_to_even() {
346   return 23;
347 }
348 
max_exponent_round_to_even()349 template <> inline constexpr int binary_format<float>::max_exponent_round_to_even() {
350   return 10;
351 }
352 
min_exponent_round_to_even()353 template <> inline constexpr int binary_format<double>::min_exponent_round_to_even() {
354   return -4;
355 }
356 
min_exponent_round_to_even()357 template <> inline constexpr int binary_format<float>::min_exponent_round_to_even() {
358   return -17;
359 }
360 
minimum_exponent()361 template <> inline constexpr int binary_format<double>::minimum_exponent() {
362   return -1023;
363 }
minimum_exponent()364 template <> inline constexpr int binary_format<float>::minimum_exponent() {
365   return -127;
366 }
367 
infinite_power()368 template <> inline constexpr int binary_format<double>::infinite_power() {
369   return 0x7FF;
370 }
infinite_power()371 template <> inline constexpr int binary_format<float>::infinite_power() {
372   return 0xFF;
373 }
374 
sign_index()375 template <> inline constexpr int binary_format<double>::sign_index() { return 63; }
sign_index()376 template <> inline constexpr int binary_format<float>::sign_index() { return 31; }
377 
min_exponent_fast_path()378 template <> inline constexpr int binary_format<double>::min_exponent_fast_path() {
379 #if (FLT_EVAL_METHOD != 1) && (FLT_EVAL_METHOD != 0)
380   return 0;
381 #else
382   return -22;
383 #endif
384 }
min_exponent_fast_path()385 template <> inline constexpr int binary_format<float>::min_exponent_fast_path() {
386 #if (FLT_EVAL_METHOD != 1) && (FLT_EVAL_METHOD != 0)
387   return 0;
388 #else
389   return -10;
390 #endif
391 }
392 
max_exponent_fast_path()393 template <> inline constexpr int binary_format<double>::max_exponent_fast_path() {
394   return 22;
395 }
max_exponent_fast_path()396 template <> inline constexpr int binary_format<float>::max_exponent_fast_path() {
397   return 10;
398 }
399 
max_mantissa_fast_path()400 template <> inline constexpr uint64_t binary_format<double>::max_mantissa_fast_path() {
401   return uint64_t(2) << mantissa_explicit_bits();
402 }
max_mantissa_fast_path()403 template <> inline constexpr uint64_t binary_format<float>::max_mantissa_fast_path() {
404   return uint64_t(2) << mantissa_explicit_bits();
405 }
406 
407 template <>
exact_power_of_ten(int64_t power)408 inline constexpr double binary_format<double>::exact_power_of_ten(int64_t power) {
409   return powers_of_ten_double[power];
410 }
411 template <>
exact_power_of_ten(int64_t power)412 inline constexpr float binary_format<float>::exact_power_of_ten(int64_t power) {
413 
414   return powers_of_ten_float[power];
415 }
416 
417 
418 template <>
largest_power_of_ten()419 inline constexpr int binary_format<double>::largest_power_of_ten() {
420   return 308;
421 }
422 template <>
largest_power_of_ten()423 inline constexpr int binary_format<float>::largest_power_of_ten() {
424   return 38;
425 }
426 
427 template <>
smallest_power_of_ten()428 inline constexpr int binary_format<double>::smallest_power_of_ten() {
429   return -342;
430 }
431 template <>
smallest_power_of_ten()432 inline constexpr int binary_format<float>::smallest_power_of_ten() {
433   return -65;
434 }
435 
max_digits()436 template <> inline constexpr size_t binary_format<double>::max_digits() {
437   return 769;
438 }
max_digits()439 template <> inline constexpr size_t binary_format<float>::max_digits() {
440   return 114;
441 }
442 
443 template<typename T>
to_float(bool negative,adjusted_mantissa am,T & value)444 fastfloat_really_inline void to_float(bool negative, adjusted_mantissa am, T &value) {
445   uint64_t word = am.mantissa;
446   word |= uint64_t(am.power2) << binary_format<T>::mantissa_explicit_bits();
447   word = negative
448   ? word | (uint64_t(1) << binary_format<T>::sign_index()) : word;
449 #if FASTFLOAT_IS_BIG_ENDIAN == 1
450    if (std::is_same<T, float>::value) {
451      ::memcpy(&value, (char *)&word + 4, sizeof(T)); // extract value at offset 4-7 if float on big-endian
452    } else {
453      ::memcpy(&value, &word, sizeof(T));
454    }
455 #else
456    // For little-endian systems:
457    ::memcpy(&value, &word, sizeof(T));
458 #endif
459 }
460 
461 } // namespace fast_float
462 
463 #endif
464 
465 
466 #ifndef FASTFLOAT_ASCII_NUMBER_H
467 #define FASTFLOAT_ASCII_NUMBER_H
468 
469 #include <cctype>
470 #include <cstdint>
471 #include <cstring>
472 #include <iterator>
473 
474 
475 namespace fast_float {
476 
477 // Next function can be micro-optimized, but compilers are entirely
478 // able to optimize it well.
is_integer(char c)479 fastfloat_really_inline bool is_integer(char c)  noexcept  { return c >= '0' && c <= '9'; }
480 
byteswap(uint64_t val)481 fastfloat_really_inline uint64_t byteswap(uint64_t val) {
482   return (val & 0xFF00000000000000) >> 56
483     | (val & 0x00FF000000000000) >> 40
484     | (val & 0x0000FF0000000000) >> 24
485     | (val & 0x000000FF00000000) >> 8
486     | (val & 0x00000000FF000000) << 8
487     | (val & 0x0000000000FF0000) << 24
488     | (val & 0x000000000000FF00) << 40
489     | (val & 0x00000000000000FF) << 56;
490 }
491 
read_u64(const char * chars)492 fastfloat_really_inline uint64_t read_u64(const char *chars) {
493   uint64_t val;
494   ::memcpy(&val, chars, sizeof(uint64_t));
495 #if FASTFLOAT_IS_BIG_ENDIAN == 1
496   // Need to read as-if the number was in little-endian order.
497   val = byteswap(val);
498 #endif
499   return val;
500 }
501 
write_u64(uint8_t * chars,uint64_t val)502 fastfloat_really_inline void write_u64(uint8_t *chars, uint64_t val) {
503 #if FASTFLOAT_IS_BIG_ENDIAN == 1
504   // Need to read as-if the number was in little-endian order.
505   val = byteswap(val);
506 #endif
507   ::memcpy(chars, &val, sizeof(uint64_t));
508 }
509 
510 // credit  @aqrit
parse_eight_digits_unrolled(uint64_t val)511 fastfloat_really_inline uint32_t  parse_eight_digits_unrolled(uint64_t val) {
512   const uint64_t mask = 0x000000FF000000FF;
513   const uint64_t mul1 = 0x000F424000000064; // 100 + (1000000ULL << 32)
514   const uint64_t mul2 = 0x0000271000000001; // 1 + (10000ULL << 32)
515   val -= 0x3030303030303030;
516   val = (val * 10) + (val >> 8); // val = (val * 2561) >> 8;
517   val = (((val & mask) * mul1) + (((val >> 16) & mask) * mul2)) >> 32;
518   return uint32_t(val);
519 }
520 
parse_eight_digits_unrolled(const char * chars)521 fastfloat_really_inline uint32_t parse_eight_digits_unrolled(const char *chars)  noexcept  {
522   return parse_eight_digits_unrolled(read_u64(chars));
523 }
524 
525 // credit @aqrit
is_made_of_eight_digits_fast(uint64_t val)526 fastfloat_really_inline bool is_made_of_eight_digits_fast(uint64_t val)  noexcept  {
527   return !((((val + 0x4646464646464646) | (val - 0x3030303030303030)) &
528      0x8080808080808080));
529 }
530 
is_made_of_eight_digits_fast(const char * chars)531 fastfloat_really_inline bool is_made_of_eight_digits_fast(const char *chars)  noexcept  {
532   return is_made_of_eight_digits_fast(read_u64(chars));
533 }
534 
535 typedef span<const char> byte_span;
536 
537 struct parsed_number_string {
538   int64_t exponent{0};
539   uint64_t mantissa{0};
540   const char *lastmatch{nullptr};
541   bool negative{false};
542   bool valid{false};
543   bool too_many_digits{false};
544   // contains the range of the significant digits
545   byte_span integer{};  // non-nullable
546   byte_span fraction{}; // nullable
547 };
548 
549 // Assuming that you use no more than 19 digits, this will
550 // parse an ASCII string.
551 fastfloat_really_inline
parse_number_string(const char * p,const char * pend,parse_options options)552 parsed_number_string parse_number_string(const char *p, const char *pend, parse_options options) noexcept {
553   const chars_format fmt = options.format;
554   const char decimal_point = options.decimal_point;
555 
556   parsed_number_string answer;
557   answer.valid = false;
558   answer.too_many_digits = false;
559   answer.negative = (*p == '-');
560   if (*p == '-') { // C++17 20.19.3.(7.1) explicitly forbids '+' sign here
561     ++p;
562     if (p == pend) {
563       return answer;
564     }
565     if (!is_integer(*p) && (*p != decimal_point)) { // a sign must be followed by an integer or the dot
566       return answer;
567     }
568   }
569   const char *const start_digits = p;
570 
571   uint64_t i = 0; // an unsigned int avoids signed overflows (which are bad)
572 
573   while ((std::distance(p, pend) >= 8) && is_made_of_eight_digits_fast(p)) {
574     i = i * 100000000 + parse_eight_digits_unrolled(p); // in rare cases, this will overflow, but that's ok
575     p += 8;
576   }
577   while ((p != pend) && is_integer(*p)) {
578     // a multiplication by 10 is cheaper than an arbitrary integer
579     // multiplication
580     i = 10 * i +
581         uint64_t(*p - '0'); // might overflow, we will handle the overflow later
582     ++p;
583   }
584   const char *const end_of_integer_part = p;
585   int64_t digit_count = int64_t(end_of_integer_part - start_digits);
586   answer.integer = byte_span(start_digits, size_t(digit_count));
587   int64_t exponent = 0;
588   if ((p != pend) && (*p == decimal_point)) {
589     ++p;
590     const char* before = p;
591     // can occur at most twice without overflowing, but let it occur more, since
592     // for integers with many digits, digit parsing is the primary bottleneck.
593     while ((std::distance(p, pend) >= 8) && is_made_of_eight_digits_fast(p)) {
594       i = i * 100000000 + parse_eight_digits_unrolled(p); // in rare cases, this will overflow, but that's ok
595       p += 8;
596     }
597     while ((p != pend) && is_integer(*p)) {
598       uint8_t digit = uint8_t(*p - '0');
599       ++p;
600       i = i * 10 + digit; // in rare cases, this will overflow, but that's ok
601     }
602     exponent = before - p;
603     answer.fraction = byte_span(before, size_t(p - before));
604     digit_count -= exponent;
605   }
606   // we must have encountered at least one integer!
607   if (digit_count == 0) {
608     return answer;
609   }
610   int64_t exp_number = 0;            // explicit exponential part
611   if ((fmt & chars_format::scientific) && (p != pend) && (('e' == *p) || ('E' == *p))) {
612     const char * location_of_e = p;
613     ++p;
614     bool neg_exp = false;
615     if ((p != pend) && ('-' == *p)) {
616       neg_exp = true;
617       ++p;
618     } else if ((p != pend) && ('+' == *p)) { // '+' on exponent is allowed by C++17 20.19.3.(7.1)
619       ++p;
620     }
621     if ((p == pend) || !is_integer(*p)) {
622       if(!(fmt & chars_format::fixed)) {
623         // We are in error.
624         return answer;
625       }
626       // Otherwise, we will be ignoring the 'e'.
627       p = location_of_e;
628     } else {
629       while ((p != pend) && is_integer(*p)) {
630         uint8_t digit = uint8_t(*p - '0');
631         if (exp_number < 0x10000000) {
632           exp_number = 10 * exp_number + digit;
633         }
634         ++p;
635       }
636       if(neg_exp) { exp_number = - exp_number; }
637       exponent += exp_number;
638     }
639   } else {
640     // If it scientific and not fixed, we have to bail out.
641     if((fmt & chars_format::scientific) && !(fmt & chars_format::fixed)) { return answer; }
642   }
643   answer.lastmatch = p;
644   answer.valid = true;
645 
646   // If we frequently had to deal with long strings of digits,
647   // we could extend our code by using a 128-bit integer instead
648   // of a 64-bit integer. However, this is uncommon.
649   //
650   // We can deal with up to 19 digits.
651   if (digit_count > 19) { // this is uncommon
652     // It is possible that the integer had an overflow.
653     // We have to handle the case where we have 0.0000somenumber.
654     // We need to be mindful of the case where we only have zeroes...
655     // E.g., 0.000000000...000.
656     const char *start = start_digits;
657     while ((start != pend) && (*start == '0' || *start == decimal_point)) {
658       if(*start == '0') { digit_count --; }
659       start++;
660     }
661     if (digit_count > 19) {
662       answer.too_many_digits = true;
663       // Let us start again, this time, avoiding overflows.
664       // We don't need to check if is_integer, since we use the
665       // pre-tokenized spans from above.
666       i = 0;
667       p = answer.integer.ptr;
668       const char* int_end = p + answer.integer.len();
669       const uint64_t minimal_nineteen_digit_integer{1000000000000000000};
670       while((i < minimal_nineteen_digit_integer) && (p != int_end)) {
671         i = i * 10 + uint64_t(*p - '0');
672         ++p;
673       }
674       if (i >= minimal_nineteen_digit_integer) { // We have a big integers
675         exponent = end_of_integer_part - p + exp_number;
676       } else { // We have a value with a fractional component.
677           p = answer.fraction.ptr;
678           const char* frac_end = p + answer.fraction.len();
679           while((i < minimal_nineteen_digit_integer) && (p != frac_end)) {
680             i = i * 10 + uint64_t(*p - '0');
681             ++p;
682           }
683           exponent = answer.fraction.ptr - p + exp_number;
684       }
685       // We have now corrected both exponent and i, to a truncated value
686     }
687   }
688   answer.exponent = exponent;
689   answer.mantissa = i;
690   return answer;
691 }
692 
693 } // namespace fast_float
694 
695 #endif
696 
697 
698 #ifndef FASTFLOAT_FAST_TABLE_H
699 #define FASTFLOAT_FAST_TABLE_H
700 
701 #include <cstdint>
702 
703 namespace fast_float {
704 
705 /**
706  * When mapping numbers from decimal to binary,
707  * we go from w * 10^q to m * 2^p but we have
708  * 10^q = 5^q * 2^q, so effectively
709  * we are trying to match
710  * w * 2^q * 5^q to m * 2^p. Thus the powers of two
711  * are not a concern since they can be represented
712  * exactly using the binary notation, only the powers of five
713  * affect the binary significand.
714  */
715 
716 /**
717  * The smallest non-zero float (binary64) is 2^−1074.
718  * We take as input numbers of the form w x 10^q where w < 2^64.
719  * We have that w * 10^-343  <  2^(64-344) 5^-343 < 2^-1076.
720  * However, we have that
721  * (2^64-1) * 10^-342 =  (2^64-1) * 2^-342 * 5^-342 > 2^−1074.
722  * Thus it is possible for a number of the form w * 10^-342 where
723  * w is a 64-bit value to be a non-zero floating-point number.
724  *********
725  * Any number of form w * 10^309 where w>= 1 is going to be
726  * infinite in binary64 so we never need to worry about powers
727  * of 5 greater than 308.
728  */
729 template <class unused = void>
730 struct powers_template {
731 
732 constexpr static int smallest_power_of_five = binary_format<double>::smallest_power_of_ten();
733 constexpr static int largest_power_of_five = binary_format<double>::largest_power_of_ten();
734 constexpr static int number_of_entries = 2 * (largest_power_of_five - smallest_power_of_five + 1);
735 // Powers of five from 5^-342 all the way to 5^308 rounded toward one.
736 static const uint64_t power_of_five_128[number_of_entries];
737 };
738 
739 template <class unused>
740 const uint64_t powers_template<unused>::power_of_five_128[number_of_entries] = {
741         0xeef453d6923bd65a,0x113faa2906a13b3f,
742         0x9558b4661b6565f8,0x4ac7ca59a424c507,
743         0xbaaee17fa23ebf76,0x5d79bcf00d2df649,
744         0xe95a99df8ace6f53,0xf4d82c2c107973dc,
745         0x91d8a02bb6c10594,0x79071b9b8a4be869,
746         0xb64ec836a47146f9,0x9748e2826cdee284,
747         0xe3e27a444d8d98b7,0xfd1b1b2308169b25,
748         0x8e6d8c6ab0787f72,0xfe30f0f5e50e20f7,
749         0xb208ef855c969f4f,0xbdbd2d335e51a935,
750         0xde8b2b66b3bc4723,0xad2c788035e61382,
751         0x8b16fb203055ac76,0x4c3bcb5021afcc31,
752         0xaddcb9e83c6b1793,0xdf4abe242a1bbf3d,
753         0xd953e8624b85dd78,0xd71d6dad34a2af0d,
754         0x87d4713d6f33aa6b,0x8672648c40e5ad68,
755         0xa9c98d8ccb009506,0x680efdaf511f18c2,
756         0xd43bf0effdc0ba48,0x212bd1b2566def2,
757         0x84a57695fe98746d,0x14bb630f7604b57,
758         0xa5ced43b7e3e9188,0x419ea3bd35385e2d,
759         0xcf42894a5dce35ea,0x52064cac828675b9,
760         0x818995ce7aa0e1b2,0x7343efebd1940993,
761         0xa1ebfb4219491a1f,0x1014ebe6c5f90bf8,
762         0xca66fa129f9b60a6,0xd41a26e077774ef6,
763         0xfd00b897478238d0,0x8920b098955522b4,
764         0x9e20735e8cb16382,0x55b46e5f5d5535b0,
765         0xc5a890362fddbc62,0xeb2189f734aa831d,
766         0xf712b443bbd52b7b,0xa5e9ec7501d523e4,
767         0x9a6bb0aa55653b2d,0x47b233c92125366e,
768         0xc1069cd4eabe89f8,0x999ec0bb696e840a,
769         0xf148440a256e2c76,0xc00670ea43ca250d,
770         0x96cd2a865764dbca,0x380406926a5e5728,
771         0xbc807527ed3e12bc,0xc605083704f5ecf2,
772         0xeba09271e88d976b,0xf7864a44c633682e,
773         0x93445b8731587ea3,0x7ab3ee6afbe0211d,
774         0xb8157268fdae9e4c,0x5960ea05bad82964,
775         0xe61acf033d1a45df,0x6fb92487298e33bd,
776         0x8fd0c16206306bab,0xa5d3b6d479f8e056,
777         0xb3c4f1ba87bc8696,0x8f48a4899877186c,
778         0xe0b62e2929aba83c,0x331acdabfe94de87,
779         0x8c71dcd9ba0b4925,0x9ff0c08b7f1d0b14,
780         0xaf8e5410288e1b6f,0x7ecf0ae5ee44dd9,
781         0xdb71e91432b1a24a,0xc9e82cd9f69d6150,
782         0x892731ac9faf056e,0xbe311c083a225cd2,
783         0xab70fe17c79ac6ca,0x6dbd630a48aaf406,
784         0xd64d3d9db981787d,0x92cbbccdad5b108,
785         0x85f0468293f0eb4e,0x25bbf56008c58ea5,
786         0xa76c582338ed2621,0xaf2af2b80af6f24e,
787         0xd1476e2c07286faa,0x1af5af660db4aee1,
788         0x82cca4db847945ca,0x50d98d9fc890ed4d,
789         0xa37fce126597973c,0xe50ff107bab528a0,
790         0xcc5fc196fefd7d0c,0x1e53ed49a96272c8,
791         0xff77b1fcbebcdc4f,0x25e8e89c13bb0f7a,
792         0x9faacf3df73609b1,0x77b191618c54e9ac,
793         0xc795830d75038c1d,0xd59df5b9ef6a2417,
794         0xf97ae3d0d2446f25,0x4b0573286b44ad1d,
795         0x9becce62836ac577,0x4ee367f9430aec32,
796         0xc2e801fb244576d5,0x229c41f793cda73f,
797         0xf3a20279ed56d48a,0x6b43527578c1110f,
798         0x9845418c345644d6,0x830a13896b78aaa9,
799         0xbe5691ef416bd60c,0x23cc986bc656d553,
800         0xedec366b11c6cb8f,0x2cbfbe86b7ec8aa8,
801         0x94b3a202eb1c3f39,0x7bf7d71432f3d6a9,
802         0xb9e08a83a5e34f07,0xdaf5ccd93fb0cc53,
803         0xe858ad248f5c22c9,0xd1b3400f8f9cff68,
804         0x91376c36d99995be,0x23100809b9c21fa1,
805         0xb58547448ffffb2d,0xabd40a0c2832a78a,
806         0xe2e69915b3fff9f9,0x16c90c8f323f516c,
807         0x8dd01fad907ffc3b,0xae3da7d97f6792e3,
808         0xb1442798f49ffb4a,0x99cd11cfdf41779c,
809         0xdd95317f31c7fa1d,0x40405643d711d583,
810         0x8a7d3eef7f1cfc52,0x482835ea666b2572,
811         0xad1c8eab5ee43b66,0xda3243650005eecf,
812         0xd863b256369d4a40,0x90bed43e40076a82,
813         0x873e4f75e2224e68,0x5a7744a6e804a291,
814         0xa90de3535aaae202,0x711515d0a205cb36,
815         0xd3515c2831559a83,0xd5a5b44ca873e03,
816         0x8412d9991ed58091,0xe858790afe9486c2,
817         0xa5178fff668ae0b6,0x626e974dbe39a872,
818         0xce5d73ff402d98e3,0xfb0a3d212dc8128f,
819         0x80fa687f881c7f8e,0x7ce66634bc9d0b99,
820         0xa139029f6a239f72,0x1c1fffc1ebc44e80,
821         0xc987434744ac874e,0xa327ffb266b56220,
822         0xfbe9141915d7a922,0x4bf1ff9f0062baa8,
823         0x9d71ac8fada6c9b5,0x6f773fc3603db4a9,
824         0xc4ce17b399107c22,0xcb550fb4384d21d3,
825         0xf6019da07f549b2b,0x7e2a53a146606a48,
826         0x99c102844f94e0fb,0x2eda7444cbfc426d,
827         0xc0314325637a1939,0xfa911155fefb5308,
828         0xf03d93eebc589f88,0x793555ab7eba27ca,
829         0x96267c7535b763b5,0x4bc1558b2f3458de,
830         0xbbb01b9283253ca2,0x9eb1aaedfb016f16,
831         0xea9c227723ee8bcb,0x465e15a979c1cadc,
832         0x92a1958a7675175f,0xbfacd89ec191ec9,
833         0xb749faed14125d36,0xcef980ec671f667b,
834         0xe51c79a85916f484,0x82b7e12780e7401a,
835         0x8f31cc0937ae58d2,0xd1b2ecb8b0908810,
836         0xb2fe3f0b8599ef07,0x861fa7e6dcb4aa15,
837         0xdfbdcece67006ac9,0x67a791e093e1d49a,
838         0x8bd6a141006042bd,0xe0c8bb2c5c6d24e0,
839         0xaecc49914078536d,0x58fae9f773886e18,
840         0xda7f5bf590966848,0xaf39a475506a899e,
841         0x888f99797a5e012d,0x6d8406c952429603,
842         0xaab37fd7d8f58178,0xc8e5087ba6d33b83,
843         0xd5605fcdcf32e1d6,0xfb1e4a9a90880a64,
844         0x855c3be0a17fcd26,0x5cf2eea09a55067f,
845         0xa6b34ad8c9dfc06f,0xf42faa48c0ea481e,
846         0xd0601d8efc57b08b,0xf13b94daf124da26,
847         0x823c12795db6ce57,0x76c53d08d6b70858,
848         0xa2cb1717b52481ed,0x54768c4b0c64ca6e,
849         0xcb7ddcdda26da268,0xa9942f5dcf7dfd09,
850         0xfe5d54150b090b02,0xd3f93b35435d7c4c,
851         0x9efa548d26e5a6e1,0xc47bc5014a1a6daf,
852         0xc6b8e9b0709f109a,0x359ab6419ca1091b,
853         0xf867241c8cc6d4c0,0xc30163d203c94b62,
854         0x9b407691d7fc44f8,0x79e0de63425dcf1d,
855         0xc21094364dfb5636,0x985915fc12f542e4,
856         0xf294b943e17a2bc4,0x3e6f5b7b17b2939d,
857         0x979cf3ca6cec5b5a,0xa705992ceecf9c42,
858         0xbd8430bd08277231,0x50c6ff782a838353,
859         0xece53cec4a314ebd,0xa4f8bf5635246428,
860         0x940f4613ae5ed136,0x871b7795e136be99,
861         0xb913179899f68584,0x28e2557b59846e3f,
862         0xe757dd7ec07426e5,0x331aeada2fe589cf,
863         0x9096ea6f3848984f,0x3ff0d2c85def7621,
864         0xb4bca50b065abe63,0xfed077a756b53a9,
865         0xe1ebce4dc7f16dfb,0xd3e8495912c62894,
866         0x8d3360f09cf6e4bd,0x64712dd7abbbd95c,
867         0xb080392cc4349dec,0xbd8d794d96aacfb3,
868         0xdca04777f541c567,0xecf0d7a0fc5583a0,
869         0x89e42caaf9491b60,0xf41686c49db57244,
870         0xac5d37d5b79b6239,0x311c2875c522ced5,
871         0xd77485cb25823ac7,0x7d633293366b828b,
872         0x86a8d39ef77164bc,0xae5dff9c02033197,
873         0xa8530886b54dbdeb,0xd9f57f830283fdfc,
874         0xd267caa862a12d66,0xd072df63c324fd7b,
875         0x8380dea93da4bc60,0x4247cb9e59f71e6d,
876         0xa46116538d0deb78,0x52d9be85f074e608,
877         0xcd795be870516656,0x67902e276c921f8b,
878         0x806bd9714632dff6,0xba1cd8a3db53b6,
879         0xa086cfcd97bf97f3,0x80e8a40eccd228a4,
880         0xc8a883c0fdaf7df0,0x6122cd128006b2cd,
881         0xfad2a4b13d1b5d6c,0x796b805720085f81,
882         0x9cc3a6eec6311a63,0xcbe3303674053bb0,
883         0xc3f490aa77bd60fc,0xbedbfc4411068a9c,
884         0xf4f1b4d515acb93b,0xee92fb5515482d44,
885         0x991711052d8bf3c5,0x751bdd152d4d1c4a,
886         0xbf5cd54678eef0b6,0xd262d45a78a0635d,
887         0xef340a98172aace4,0x86fb897116c87c34,
888         0x9580869f0e7aac0e,0xd45d35e6ae3d4da0,
889         0xbae0a846d2195712,0x8974836059cca109,
890         0xe998d258869facd7,0x2bd1a438703fc94b,
891         0x91ff83775423cc06,0x7b6306a34627ddcf,
892         0xb67f6455292cbf08,0x1a3bc84c17b1d542,
893         0xe41f3d6a7377eeca,0x20caba5f1d9e4a93,
894         0x8e938662882af53e,0x547eb47b7282ee9c,
895         0xb23867fb2a35b28d,0xe99e619a4f23aa43,
896         0xdec681f9f4c31f31,0x6405fa00e2ec94d4,
897         0x8b3c113c38f9f37e,0xde83bc408dd3dd04,
898         0xae0b158b4738705e,0x9624ab50b148d445,
899         0xd98ddaee19068c76,0x3badd624dd9b0957,
900         0x87f8a8d4cfa417c9,0xe54ca5d70a80e5d6,
901         0xa9f6d30a038d1dbc,0x5e9fcf4ccd211f4c,
902         0xd47487cc8470652b,0x7647c3200069671f,
903         0x84c8d4dfd2c63f3b,0x29ecd9f40041e073,
904         0xa5fb0a17c777cf09,0xf468107100525890,
905         0xcf79cc9db955c2cc,0x7182148d4066eeb4,
906         0x81ac1fe293d599bf,0xc6f14cd848405530,
907         0xa21727db38cb002f,0xb8ada00e5a506a7c,
908         0xca9cf1d206fdc03b,0xa6d90811f0e4851c,
909         0xfd442e4688bd304a,0x908f4a166d1da663,
910         0x9e4a9cec15763e2e,0x9a598e4e043287fe,
911         0xc5dd44271ad3cdba,0x40eff1e1853f29fd,
912         0xf7549530e188c128,0xd12bee59e68ef47c,
913         0x9a94dd3e8cf578b9,0x82bb74f8301958ce,
914         0xc13a148e3032d6e7,0xe36a52363c1faf01,
915         0xf18899b1bc3f8ca1,0xdc44e6c3cb279ac1,
916         0x96f5600f15a7b7e5,0x29ab103a5ef8c0b9,
917         0xbcb2b812db11a5de,0x7415d448f6b6f0e7,
918         0xebdf661791d60f56,0x111b495b3464ad21,
919         0x936b9fcebb25c995,0xcab10dd900beec34,
920         0xb84687c269ef3bfb,0x3d5d514f40eea742,
921         0xe65829b3046b0afa,0xcb4a5a3112a5112,
922         0x8ff71a0fe2c2e6dc,0x47f0e785eaba72ab,
923         0xb3f4e093db73a093,0x59ed216765690f56,
924         0xe0f218b8d25088b8,0x306869c13ec3532c,
925         0x8c974f7383725573,0x1e414218c73a13fb,
926         0xafbd2350644eeacf,0xe5d1929ef90898fa,
927         0xdbac6c247d62a583,0xdf45f746b74abf39,
928         0x894bc396ce5da772,0x6b8bba8c328eb783,
929         0xab9eb47c81f5114f,0x66ea92f3f326564,
930         0xd686619ba27255a2,0xc80a537b0efefebd,
931         0x8613fd0145877585,0xbd06742ce95f5f36,
932         0xa798fc4196e952e7,0x2c48113823b73704,
933         0xd17f3b51fca3a7a0,0xf75a15862ca504c5,
934         0x82ef85133de648c4,0x9a984d73dbe722fb,
935         0xa3ab66580d5fdaf5,0xc13e60d0d2e0ebba,
936         0xcc963fee10b7d1b3,0x318df905079926a8,
937         0xffbbcfe994e5c61f,0xfdf17746497f7052,
938         0x9fd561f1fd0f9bd3,0xfeb6ea8bedefa633,
939         0xc7caba6e7c5382c8,0xfe64a52ee96b8fc0,
940         0xf9bd690a1b68637b,0x3dfdce7aa3c673b0,
941         0x9c1661a651213e2d,0x6bea10ca65c084e,
942         0xc31bfa0fe5698db8,0x486e494fcff30a62,
943         0xf3e2f893dec3f126,0x5a89dba3c3efccfa,
944         0x986ddb5c6b3a76b7,0xf89629465a75e01c,
945         0xbe89523386091465,0xf6bbb397f1135823,
946         0xee2ba6c0678b597f,0x746aa07ded582e2c,
947         0x94db483840b717ef,0xa8c2a44eb4571cdc,
948         0xba121a4650e4ddeb,0x92f34d62616ce413,
949         0xe896a0d7e51e1566,0x77b020baf9c81d17,
950         0x915e2486ef32cd60,0xace1474dc1d122e,
951         0xb5b5ada8aaff80b8,0xd819992132456ba,
952         0xe3231912d5bf60e6,0x10e1fff697ed6c69,
953         0x8df5efabc5979c8f,0xca8d3ffa1ef463c1,
954         0xb1736b96b6fd83b3,0xbd308ff8a6b17cb2,
955         0xddd0467c64bce4a0,0xac7cb3f6d05ddbde,
956         0x8aa22c0dbef60ee4,0x6bcdf07a423aa96b,
957         0xad4ab7112eb3929d,0x86c16c98d2c953c6,
958         0xd89d64d57a607744,0xe871c7bf077ba8b7,
959         0x87625f056c7c4a8b,0x11471cd764ad4972,
960         0xa93af6c6c79b5d2d,0xd598e40d3dd89bcf,
961         0xd389b47879823479,0x4aff1d108d4ec2c3,
962         0x843610cb4bf160cb,0xcedf722a585139ba,
963         0xa54394fe1eedb8fe,0xc2974eb4ee658828,
964         0xce947a3da6a9273e,0x733d226229feea32,
965         0x811ccc668829b887,0x806357d5a3f525f,
966         0xa163ff802a3426a8,0xca07c2dcb0cf26f7,
967         0xc9bcff6034c13052,0xfc89b393dd02f0b5,
968         0xfc2c3f3841f17c67,0xbbac2078d443ace2,
969         0x9d9ba7832936edc0,0xd54b944b84aa4c0d,
970         0xc5029163f384a931,0xa9e795e65d4df11,
971         0xf64335bcf065d37d,0x4d4617b5ff4a16d5,
972         0x99ea0196163fa42e,0x504bced1bf8e4e45,
973         0xc06481fb9bcf8d39,0xe45ec2862f71e1d6,
974         0xf07da27a82c37088,0x5d767327bb4e5a4c,
975         0x964e858c91ba2655,0x3a6a07f8d510f86f,
976         0xbbe226efb628afea,0x890489f70a55368b,
977         0xeadab0aba3b2dbe5,0x2b45ac74ccea842e,
978         0x92c8ae6b464fc96f,0x3b0b8bc90012929d,
979         0xb77ada0617e3bbcb,0x9ce6ebb40173744,
980         0xe55990879ddcaabd,0xcc420a6a101d0515,
981         0x8f57fa54c2a9eab6,0x9fa946824a12232d,
982         0xb32df8e9f3546564,0x47939822dc96abf9,
983         0xdff9772470297ebd,0x59787e2b93bc56f7,
984         0x8bfbea76c619ef36,0x57eb4edb3c55b65a,
985         0xaefae51477a06b03,0xede622920b6b23f1,
986         0xdab99e59958885c4,0xe95fab368e45eced,
987         0x88b402f7fd75539b,0x11dbcb0218ebb414,
988         0xaae103b5fcd2a881,0xd652bdc29f26a119,
989         0xd59944a37c0752a2,0x4be76d3346f0495f,
990         0x857fcae62d8493a5,0x6f70a4400c562ddb,
991         0xa6dfbd9fb8e5b88e,0xcb4ccd500f6bb952,
992         0xd097ad07a71f26b2,0x7e2000a41346a7a7,
993         0x825ecc24c873782f,0x8ed400668c0c28c8,
994         0xa2f67f2dfa90563b,0x728900802f0f32fa,
995         0xcbb41ef979346bca,0x4f2b40a03ad2ffb9,
996         0xfea126b7d78186bc,0xe2f610c84987bfa8,
997         0x9f24b832e6b0f436,0xdd9ca7d2df4d7c9,
998         0xc6ede63fa05d3143,0x91503d1c79720dbb,
999         0xf8a95fcf88747d94,0x75a44c6397ce912a,
1000         0x9b69dbe1b548ce7c,0xc986afbe3ee11aba,
1001         0xc24452da229b021b,0xfbe85badce996168,
1002         0xf2d56790ab41c2a2,0xfae27299423fb9c3,
1003         0x97c560ba6b0919a5,0xdccd879fc967d41a,
1004         0xbdb6b8e905cb600f,0x5400e987bbc1c920,
1005         0xed246723473e3813,0x290123e9aab23b68,
1006         0x9436c0760c86e30b,0xf9a0b6720aaf6521,
1007         0xb94470938fa89bce,0xf808e40e8d5b3e69,
1008         0xe7958cb87392c2c2,0xb60b1d1230b20e04,
1009         0x90bd77f3483bb9b9,0xb1c6f22b5e6f48c2,
1010         0xb4ecd5f01a4aa828,0x1e38aeb6360b1af3,
1011         0xe2280b6c20dd5232,0x25c6da63c38de1b0,
1012         0x8d590723948a535f,0x579c487e5a38ad0e,
1013         0xb0af48ec79ace837,0x2d835a9df0c6d851,
1014         0xdcdb1b2798182244,0xf8e431456cf88e65,
1015         0x8a08f0f8bf0f156b,0x1b8e9ecb641b58ff,
1016         0xac8b2d36eed2dac5,0xe272467e3d222f3f,
1017         0xd7adf884aa879177,0x5b0ed81dcc6abb0f,
1018         0x86ccbb52ea94baea,0x98e947129fc2b4e9,
1019         0xa87fea27a539e9a5,0x3f2398d747b36224,
1020         0xd29fe4b18e88640e,0x8eec7f0d19a03aad,
1021         0x83a3eeeef9153e89,0x1953cf68300424ac,
1022         0xa48ceaaab75a8e2b,0x5fa8c3423c052dd7,
1023         0xcdb02555653131b6,0x3792f412cb06794d,
1024         0x808e17555f3ebf11,0xe2bbd88bbee40bd0,
1025         0xa0b19d2ab70e6ed6,0x5b6aceaeae9d0ec4,
1026         0xc8de047564d20a8b,0xf245825a5a445275,
1027         0xfb158592be068d2e,0xeed6e2f0f0d56712,
1028         0x9ced737bb6c4183d,0x55464dd69685606b,
1029         0xc428d05aa4751e4c,0xaa97e14c3c26b886,
1030         0xf53304714d9265df,0xd53dd99f4b3066a8,
1031         0x993fe2c6d07b7fab,0xe546a8038efe4029,
1032         0xbf8fdb78849a5f96,0xde98520472bdd033,
1033         0xef73d256a5c0f77c,0x963e66858f6d4440,
1034         0x95a8637627989aad,0xdde7001379a44aa8,
1035         0xbb127c53b17ec159,0x5560c018580d5d52,
1036         0xe9d71b689dde71af,0xaab8f01e6e10b4a6,
1037         0x9226712162ab070d,0xcab3961304ca70e8,
1038         0xb6b00d69bb55c8d1,0x3d607b97c5fd0d22,
1039         0xe45c10c42a2b3b05,0x8cb89a7db77c506a,
1040         0x8eb98a7a9a5b04e3,0x77f3608e92adb242,
1041         0xb267ed1940f1c61c,0x55f038b237591ed3,
1042         0xdf01e85f912e37a3,0x6b6c46dec52f6688,
1043         0x8b61313bbabce2c6,0x2323ac4b3b3da015,
1044         0xae397d8aa96c1b77,0xabec975e0a0d081a,
1045         0xd9c7dced53c72255,0x96e7bd358c904a21,
1046         0x881cea14545c7575,0x7e50d64177da2e54,
1047         0xaa242499697392d2,0xdde50bd1d5d0b9e9,
1048         0xd4ad2dbfc3d07787,0x955e4ec64b44e864,
1049         0x84ec3c97da624ab4,0xbd5af13bef0b113e,
1050         0xa6274bbdd0fadd61,0xecb1ad8aeacdd58e,
1051         0xcfb11ead453994ba,0x67de18eda5814af2,
1052         0x81ceb32c4b43fcf4,0x80eacf948770ced7,
1053         0xa2425ff75e14fc31,0xa1258379a94d028d,
1054         0xcad2f7f5359a3b3e,0x96ee45813a04330,
1055         0xfd87b5f28300ca0d,0x8bca9d6e188853fc,
1056         0x9e74d1b791e07e48,0x775ea264cf55347e,
1057         0xc612062576589dda,0x95364afe032a819e,
1058         0xf79687aed3eec551,0x3a83ddbd83f52205,
1059         0x9abe14cd44753b52,0xc4926a9672793543,
1060         0xc16d9a0095928a27,0x75b7053c0f178294,
1061         0xf1c90080baf72cb1,0x5324c68b12dd6339,
1062         0x971da05074da7bee,0xd3f6fc16ebca5e04,
1063         0xbce5086492111aea,0x88f4bb1ca6bcf585,
1064         0xec1e4a7db69561a5,0x2b31e9e3d06c32e6,
1065         0x9392ee8e921d5d07,0x3aff322e62439fd0,
1066         0xb877aa3236a4b449,0x9befeb9fad487c3,
1067         0xe69594bec44de15b,0x4c2ebe687989a9b4,
1068         0x901d7cf73ab0acd9,0xf9d37014bf60a11,
1069         0xb424dc35095cd80f,0x538484c19ef38c95,
1070         0xe12e13424bb40e13,0x2865a5f206b06fba,
1071         0x8cbccc096f5088cb,0xf93f87b7442e45d4,
1072         0xafebff0bcb24aafe,0xf78f69a51539d749,
1073         0xdbe6fecebdedd5be,0xb573440e5a884d1c,
1074         0x89705f4136b4a597,0x31680a88f8953031,
1075         0xabcc77118461cefc,0xfdc20d2b36ba7c3e,
1076         0xd6bf94d5e57a42bc,0x3d32907604691b4d,
1077         0x8637bd05af6c69b5,0xa63f9a49c2c1b110,
1078         0xa7c5ac471b478423,0xfcf80dc33721d54,
1079         0xd1b71758e219652b,0xd3c36113404ea4a9,
1080         0x83126e978d4fdf3b,0x645a1cac083126ea,
1081         0xa3d70a3d70a3d70a,0x3d70a3d70a3d70a4,
1082         0xcccccccccccccccc,0xcccccccccccccccd,
1083         0x8000000000000000,0x0,
1084         0xa000000000000000,0x0,
1085         0xc800000000000000,0x0,
1086         0xfa00000000000000,0x0,
1087         0x9c40000000000000,0x0,
1088         0xc350000000000000,0x0,
1089         0xf424000000000000,0x0,
1090         0x9896800000000000,0x0,
1091         0xbebc200000000000,0x0,
1092         0xee6b280000000000,0x0,
1093         0x9502f90000000000,0x0,
1094         0xba43b74000000000,0x0,
1095         0xe8d4a51000000000,0x0,
1096         0x9184e72a00000000,0x0,
1097         0xb5e620f480000000,0x0,
1098         0xe35fa931a0000000,0x0,
1099         0x8e1bc9bf04000000,0x0,
1100         0xb1a2bc2ec5000000,0x0,
1101         0xde0b6b3a76400000,0x0,
1102         0x8ac7230489e80000,0x0,
1103         0xad78ebc5ac620000,0x0,
1104         0xd8d726b7177a8000,0x0,
1105         0x878678326eac9000,0x0,
1106         0xa968163f0a57b400,0x0,
1107         0xd3c21bcecceda100,0x0,
1108         0x84595161401484a0,0x0,
1109         0xa56fa5b99019a5c8,0x0,
1110         0xcecb8f27f4200f3a,0x0,
1111         0x813f3978f8940984,0x4000000000000000,
1112         0xa18f07d736b90be5,0x5000000000000000,
1113         0xc9f2c9cd04674ede,0xa400000000000000,
1114         0xfc6f7c4045812296,0x4d00000000000000,
1115         0x9dc5ada82b70b59d,0xf020000000000000,
1116         0xc5371912364ce305,0x6c28000000000000,
1117         0xf684df56c3e01bc6,0xc732000000000000,
1118         0x9a130b963a6c115c,0x3c7f400000000000,
1119         0xc097ce7bc90715b3,0x4b9f100000000000,
1120         0xf0bdc21abb48db20,0x1e86d40000000000,
1121         0x96769950b50d88f4,0x1314448000000000,
1122         0xbc143fa4e250eb31,0x17d955a000000000,
1123         0xeb194f8e1ae525fd,0x5dcfab0800000000,
1124         0x92efd1b8d0cf37be,0x5aa1cae500000000,
1125         0xb7abc627050305ad,0xf14a3d9e40000000,
1126         0xe596b7b0c643c719,0x6d9ccd05d0000000,
1127         0x8f7e32ce7bea5c6f,0xe4820023a2000000,
1128         0xb35dbf821ae4f38b,0xdda2802c8a800000,
1129         0xe0352f62a19e306e,0xd50b2037ad200000,
1130         0x8c213d9da502de45,0x4526f422cc340000,
1131         0xaf298d050e4395d6,0x9670b12b7f410000,
1132         0xdaf3f04651d47b4c,0x3c0cdd765f114000,
1133         0x88d8762bf324cd0f,0xa5880a69fb6ac800,
1134         0xab0e93b6efee0053,0x8eea0d047a457a00,
1135         0xd5d238a4abe98068,0x72a4904598d6d880,
1136         0x85a36366eb71f041,0x47a6da2b7f864750,
1137         0xa70c3c40a64e6c51,0x999090b65f67d924,
1138         0xd0cf4b50cfe20765,0xfff4b4e3f741cf6d,
1139         0x82818f1281ed449f,0xbff8f10e7a8921a4,
1140         0xa321f2d7226895c7,0xaff72d52192b6a0d,
1141         0xcbea6f8ceb02bb39,0x9bf4f8a69f764490,
1142         0xfee50b7025c36a08,0x2f236d04753d5b4,
1143         0x9f4f2726179a2245,0x1d762422c946590,
1144         0xc722f0ef9d80aad6,0x424d3ad2b7b97ef5,
1145         0xf8ebad2b84e0d58b,0xd2e0898765a7deb2,
1146         0x9b934c3b330c8577,0x63cc55f49f88eb2f,
1147         0xc2781f49ffcfa6d5,0x3cbf6b71c76b25fb,
1148         0xf316271c7fc3908a,0x8bef464e3945ef7a,
1149         0x97edd871cfda3a56,0x97758bf0e3cbb5ac,
1150         0xbde94e8e43d0c8ec,0x3d52eeed1cbea317,
1151         0xed63a231d4c4fb27,0x4ca7aaa863ee4bdd,
1152         0x945e455f24fb1cf8,0x8fe8caa93e74ef6a,
1153         0xb975d6b6ee39e436,0xb3e2fd538e122b44,
1154         0xe7d34c64a9c85d44,0x60dbbca87196b616,
1155         0x90e40fbeea1d3a4a,0xbc8955e946fe31cd,
1156         0xb51d13aea4a488dd,0x6babab6398bdbe41,
1157         0xe264589a4dcdab14,0xc696963c7eed2dd1,
1158         0x8d7eb76070a08aec,0xfc1e1de5cf543ca2,
1159         0xb0de65388cc8ada8,0x3b25a55f43294bcb,
1160         0xdd15fe86affad912,0x49ef0eb713f39ebe,
1161         0x8a2dbf142dfcc7ab,0x6e3569326c784337,
1162         0xacb92ed9397bf996,0x49c2c37f07965404,
1163         0xd7e77a8f87daf7fb,0xdc33745ec97be906,
1164         0x86f0ac99b4e8dafd,0x69a028bb3ded71a3,
1165         0xa8acd7c0222311bc,0xc40832ea0d68ce0c,
1166         0xd2d80db02aabd62b,0xf50a3fa490c30190,
1167         0x83c7088e1aab65db,0x792667c6da79e0fa,
1168         0xa4b8cab1a1563f52,0x577001b891185938,
1169         0xcde6fd5e09abcf26,0xed4c0226b55e6f86,
1170         0x80b05e5ac60b6178,0x544f8158315b05b4,
1171         0xa0dc75f1778e39d6,0x696361ae3db1c721,
1172         0xc913936dd571c84c,0x3bc3a19cd1e38e9,
1173         0xfb5878494ace3a5f,0x4ab48a04065c723,
1174         0x9d174b2dcec0e47b,0x62eb0d64283f9c76,
1175         0xc45d1df942711d9a,0x3ba5d0bd324f8394,
1176         0xf5746577930d6500,0xca8f44ec7ee36479,
1177         0x9968bf6abbe85f20,0x7e998b13cf4e1ecb,
1178         0xbfc2ef456ae276e8,0x9e3fedd8c321a67e,
1179         0xefb3ab16c59b14a2,0xc5cfe94ef3ea101e,
1180         0x95d04aee3b80ece5,0xbba1f1d158724a12,
1181         0xbb445da9ca61281f,0x2a8a6e45ae8edc97,
1182         0xea1575143cf97226,0xf52d09d71a3293bd,
1183         0x924d692ca61be758,0x593c2626705f9c56,
1184         0xb6e0c377cfa2e12e,0x6f8b2fb00c77836c,
1185         0xe498f455c38b997a,0xb6dfb9c0f956447,
1186         0x8edf98b59a373fec,0x4724bd4189bd5eac,
1187         0xb2977ee300c50fe7,0x58edec91ec2cb657,
1188         0xdf3d5e9bc0f653e1,0x2f2967b66737e3ed,
1189         0x8b865b215899f46c,0xbd79e0d20082ee74,
1190         0xae67f1e9aec07187,0xecd8590680a3aa11,
1191         0xda01ee641a708de9,0xe80e6f4820cc9495,
1192         0x884134fe908658b2,0x3109058d147fdcdd,
1193         0xaa51823e34a7eede,0xbd4b46f0599fd415,
1194         0xd4e5e2cdc1d1ea96,0x6c9e18ac7007c91a,
1195         0x850fadc09923329e,0x3e2cf6bc604ddb0,
1196         0xa6539930bf6bff45,0x84db8346b786151c,
1197         0xcfe87f7cef46ff16,0xe612641865679a63,
1198         0x81f14fae158c5f6e,0x4fcb7e8f3f60c07e,
1199         0xa26da3999aef7749,0xe3be5e330f38f09d,
1200         0xcb090c8001ab551c,0x5cadf5bfd3072cc5,
1201         0xfdcb4fa002162a63,0x73d9732fc7c8f7f6,
1202         0x9e9f11c4014dda7e,0x2867e7fddcdd9afa,
1203         0xc646d63501a1511d,0xb281e1fd541501b8,
1204         0xf7d88bc24209a565,0x1f225a7ca91a4226,
1205         0x9ae757596946075f,0x3375788de9b06958,
1206         0xc1a12d2fc3978937,0x52d6b1641c83ae,
1207         0xf209787bb47d6b84,0xc0678c5dbd23a49a,
1208         0x9745eb4d50ce6332,0xf840b7ba963646e0,
1209         0xbd176620a501fbff,0xb650e5a93bc3d898,
1210         0xec5d3fa8ce427aff,0xa3e51f138ab4cebe,
1211         0x93ba47c980e98cdf,0xc66f336c36b10137,
1212         0xb8a8d9bbe123f017,0xb80b0047445d4184,
1213         0xe6d3102ad96cec1d,0xa60dc059157491e5,
1214         0x9043ea1ac7e41392,0x87c89837ad68db2f,
1215         0xb454e4a179dd1877,0x29babe4598c311fb,
1216         0xe16a1dc9d8545e94,0xf4296dd6fef3d67a,
1217         0x8ce2529e2734bb1d,0x1899e4a65f58660c,
1218         0xb01ae745b101e9e4,0x5ec05dcff72e7f8f,
1219         0xdc21a1171d42645d,0x76707543f4fa1f73,
1220         0x899504ae72497eba,0x6a06494a791c53a8,
1221         0xabfa45da0edbde69,0x487db9d17636892,
1222         0xd6f8d7509292d603,0x45a9d2845d3c42b6,
1223         0x865b86925b9bc5c2,0xb8a2392ba45a9b2,
1224         0xa7f26836f282b732,0x8e6cac7768d7141e,
1225         0xd1ef0244af2364ff,0x3207d795430cd926,
1226         0x8335616aed761f1f,0x7f44e6bd49e807b8,
1227         0xa402b9c5a8d3a6e7,0x5f16206c9c6209a6,
1228         0xcd036837130890a1,0x36dba887c37a8c0f,
1229         0x802221226be55a64,0xc2494954da2c9789,
1230         0xa02aa96b06deb0fd,0xf2db9baa10b7bd6c,
1231         0xc83553c5c8965d3d,0x6f92829494e5acc7,
1232         0xfa42a8b73abbf48c,0xcb772339ba1f17f9,
1233         0x9c69a97284b578d7,0xff2a760414536efb,
1234         0xc38413cf25e2d70d,0xfef5138519684aba,
1235         0xf46518c2ef5b8cd1,0x7eb258665fc25d69,
1236         0x98bf2f79d5993802,0xef2f773ffbd97a61,
1237         0xbeeefb584aff8603,0xaafb550ffacfd8fa,
1238         0xeeaaba2e5dbf6784,0x95ba2a53f983cf38,
1239         0x952ab45cfa97a0b2,0xdd945a747bf26183,
1240         0xba756174393d88df,0x94f971119aeef9e4,
1241         0xe912b9d1478ceb17,0x7a37cd5601aab85d,
1242         0x91abb422ccb812ee,0xac62e055c10ab33a,
1243         0xb616a12b7fe617aa,0x577b986b314d6009,
1244         0xe39c49765fdf9d94,0xed5a7e85fda0b80b,
1245         0x8e41ade9fbebc27d,0x14588f13be847307,
1246         0xb1d219647ae6b31c,0x596eb2d8ae258fc8,
1247         0xde469fbd99a05fe3,0x6fca5f8ed9aef3bb,
1248         0x8aec23d680043bee,0x25de7bb9480d5854,
1249         0xada72ccc20054ae9,0xaf561aa79a10ae6a,
1250         0xd910f7ff28069da4,0x1b2ba1518094da04,
1251         0x87aa9aff79042286,0x90fb44d2f05d0842,
1252         0xa99541bf57452b28,0x353a1607ac744a53,
1253         0xd3fa922f2d1675f2,0x42889b8997915ce8,
1254         0x847c9b5d7c2e09b7,0x69956135febada11,
1255         0xa59bc234db398c25,0x43fab9837e699095,
1256         0xcf02b2c21207ef2e,0x94f967e45e03f4bb,
1257         0x8161afb94b44f57d,0x1d1be0eebac278f5,
1258         0xa1ba1ba79e1632dc,0x6462d92a69731732,
1259         0xca28a291859bbf93,0x7d7b8f7503cfdcfe,
1260         0xfcb2cb35e702af78,0x5cda735244c3d43e,
1261         0x9defbf01b061adab,0x3a0888136afa64a7,
1262         0xc56baec21c7a1916,0x88aaa1845b8fdd0,
1263         0xf6c69a72a3989f5b,0x8aad549e57273d45,
1264         0x9a3c2087a63f6399,0x36ac54e2f678864b,
1265         0xc0cb28a98fcf3c7f,0x84576a1bb416a7dd,
1266         0xf0fdf2d3f3c30b9f,0x656d44a2a11c51d5,
1267         0x969eb7c47859e743,0x9f644ae5a4b1b325,
1268         0xbc4665b596706114,0x873d5d9f0dde1fee,
1269         0xeb57ff22fc0c7959,0xa90cb506d155a7ea,
1270         0x9316ff75dd87cbd8,0x9a7f12442d588f2,
1271         0xb7dcbf5354e9bece,0xc11ed6d538aeb2f,
1272         0xe5d3ef282a242e81,0x8f1668c8a86da5fa,
1273         0x8fa475791a569d10,0xf96e017d694487bc,
1274         0xb38d92d760ec4455,0x37c981dcc395a9ac,
1275         0xe070f78d3927556a,0x85bbe253f47b1417,
1276         0x8c469ab843b89562,0x93956d7478ccec8e,
1277         0xaf58416654a6babb,0x387ac8d1970027b2,
1278         0xdb2e51bfe9d0696a,0x6997b05fcc0319e,
1279         0x88fcf317f22241e2,0x441fece3bdf81f03,
1280         0xab3c2fddeeaad25a,0xd527e81cad7626c3,
1281         0xd60b3bd56a5586f1,0x8a71e223d8d3b074,
1282         0x85c7056562757456,0xf6872d5667844e49,
1283         0xa738c6bebb12d16c,0xb428f8ac016561db,
1284         0xd106f86e69d785c7,0xe13336d701beba52,
1285         0x82a45b450226b39c,0xecc0024661173473,
1286         0xa34d721642b06084,0x27f002d7f95d0190,
1287         0xcc20ce9bd35c78a5,0x31ec038df7b441f4,
1288         0xff290242c83396ce,0x7e67047175a15271,
1289         0x9f79a169bd203e41,0xf0062c6e984d386,
1290         0xc75809c42c684dd1,0x52c07b78a3e60868,
1291         0xf92e0c3537826145,0xa7709a56ccdf8a82,
1292         0x9bbcc7a142b17ccb,0x88a66076400bb691,
1293         0xc2abf989935ddbfe,0x6acff893d00ea435,
1294         0xf356f7ebf83552fe,0x583f6b8c4124d43,
1295         0x98165af37b2153de,0xc3727a337a8b704a,
1296         0xbe1bf1b059e9a8d6,0x744f18c0592e4c5c,
1297         0xeda2ee1c7064130c,0x1162def06f79df73,
1298         0x9485d4d1c63e8be7,0x8addcb5645ac2ba8,
1299         0xb9a74a0637ce2ee1,0x6d953e2bd7173692,
1300         0xe8111c87c5c1ba99,0xc8fa8db6ccdd0437,
1301         0x910ab1d4db9914a0,0x1d9c9892400a22a2,
1302         0xb54d5e4a127f59c8,0x2503beb6d00cab4b,
1303         0xe2a0b5dc971f303a,0x2e44ae64840fd61d,
1304         0x8da471a9de737e24,0x5ceaecfed289e5d2,
1305         0xb10d8e1456105dad,0x7425a83e872c5f47,
1306         0xdd50f1996b947518,0xd12f124e28f77719,
1307         0x8a5296ffe33cc92f,0x82bd6b70d99aaa6f,
1308         0xace73cbfdc0bfb7b,0x636cc64d1001550b,
1309         0xd8210befd30efa5a,0x3c47f7e05401aa4e,
1310         0x8714a775e3e95c78,0x65acfaec34810a71,
1311         0xa8d9d1535ce3b396,0x7f1839a741a14d0d,
1312         0xd31045a8341ca07c,0x1ede48111209a050,
1313         0x83ea2b892091e44d,0x934aed0aab460432,
1314         0xa4e4b66b68b65d60,0xf81da84d5617853f,
1315         0xce1de40642e3f4b9,0x36251260ab9d668e,
1316         0x80d2ae83e9ce78f3,0xc1d72b7c6b426019,
1317         0xa1075a24e4421730,0xb24cf65b8612f81f,
1318         0xc94930ae1d529cfc,0xdee033f26797b627,
1319         0xfb9b7cd9a4a7443c,0x169840ef017da3b1,
1320         0x9d412e0806e88aa5,0x8e1f289560ee864e,
1321         0xc491798a08a2ad4e,0xf1a6f2bab92a27e2,
1322         0xf5b5d7ec8acb58a2,0xae10af696774b1db,
1323         0x9991a6f3d6bf1765,0xacca6da1e0a8ef29,
1324         0xbff610b0cc6edd3f,0x17fd090a58d32af3,
1325         0xeff394dcff8a948e,0xddfc4b4cef07f5b0,
1326         0x95f83d0a1fb69cd9,0x4abdaf101564f98e,
1327         0xbb764c4ca7a4440f,0x9d6d1ad41abe37f1,
1328         0xea53df5fd18d5513,0x84c86189216dc5ed,
1329         0x92746b9be2f8552c,0x32fd3cf5b4e49bb4,
1330         0xb7118682dbb66a77,0x3fbc8c33221dc2a1,
1331         0xe4d5e82392a40515,0xfabaf3feaa5334a,
1332         0x8f05b1163ba6832d,0x29cb4d87f2a7400e,
1333         0xb2c71d5bca9023f8,0x743e20e9ef511012,
1334         0xdf78e4b2bd342cf6,0x914da9246b255416,
1335         0x8bab8eefb6409c1a,0x1ad089b6c2f7548e,
1336         0xae9672aba3d0c320,0xa184ac2473b529b1,
1337         0xda3c0f568cc4f3e8,0xc9e5d72d90a2741e,
1338         0x8865899617fb1871,0x7e2fa67c7a658892,
1339         0xaa7eebfb9df9de8d,0xddbb901b98feeab7,
1340         0xd51ea6fa85785631,0x552a74227f3ea565,
1341         0x8533285c936b35de,0xd53a88958f87275f,
1342         0xa67ff273b8460356,0x8a892abaf368f137,
1343         0xd01fef10a657842c,0x2d2b7569b0432d85,
1344         0x8213f56a67f6b29b,0x9c3b29620e29fc73,
1345         0xa298f2c501f45f42,0x8349f3ba91b47b8f,
1346         0xcb3f2f7642717713,0x241c70a936219a73,
1347         0xfe0efb53d30dd4d7,0xed238cd383aa0110,
1348         0x9ec95d1463e8a506,0xf4363804324a40aa,
1349         0xc67bb4597ce2ce48,0xb143c6053edcd0d5,
1350         0xf81aa16fdc1b81da,0xdd94b7868e94050a,
1351         0x9b10a4e5e9913128,0xca7cf2b4191c8326,
1352         0xc1d4ce1f63f57d72,0xfd1c2f611f63a3f0,
1353         0xf24a01a73cf2dccf,0xbc633b39673c8cec,
1354         0x976e41088617ca01,0xd5be0503e085d813,
1355         0xbd49d14aa79dbc82,0x4b2d8644d8a74e18,
1356         0xec9c459d51852ba2,0xddf8e7d60ed1219e,
1357         0x93e1ab8252f33b45,0xcabb90e5c942b503,
1358         0xb8da1662e7b00a17,0x3d6a751f3b936243,
1359         0xe7109bfba19c0c9d,0xcc512670a783ad4,
1360         0x906a617d450187e2,0x27fb2b80668b24c5,
1361         0xb484f9dc9641e9da,0xb1f9f660802dedf6,
1362         0xe1a63853bbd26451,0x5e7873f8a0396973,
1363         0x8d07e33455637eb2,0xdb0b487b6423e1e8,
1364         0xb049dc016abc5e5f,0x91ce1a9a3d2cda62,
1365         0xdc5c5301c56b75f7,0x7641a140cc7810fb,
1366         0x89b9b3e11b6329ba,0xa9e904c87fcb0a9d,
1367         0xac2820d9623bf429,0x546345fa9fbdcd44,
1368         0xd732290fbacaf133,0xa97c177947ad4095,
1369         0x867f59a9d4bed6c0,0x49ed8eabcccc485d,
1370         0xa81f301449ee8c70,0x5c68f256bfff5a74,
1371         0xd226fc195c6a2f8c,0x73832eec6fff3111,
1372         0x83585d8fd9c25db7,0xc831fd53c5ff7eab,
1373         0xa42e74f3d032f525,0xba3e7ca8b77f5e55,
1374         0xcd3a1230c43fb26f,0x28ce1bd2e55f35eb,
1375         0x80444b5e7aa7cf85,0x7980d163cf5b81b3,
1376         0xa0555e361951c366,0xd7e105bcc332621f,
1377         0xc86ab5c39fa63440,0x8dd9472bf3fefaa7,
1378         0xfa856334878fc150,0xb14f98f6f0feb951,
1379         0x9c935e00d4b9d8d2,0x6ed1bf9a569f33d3,
1380         0xc3b8358109e84f07,0xa862f80ec4700c8,
1381         0xf4a642e14c6262c8,0xcd27bb612758c0fa,
1382         0x98e7e9cccfbd7dbd,0x8038d51cb897789c,
1383         0xbf21e44003acdd2c,0xe0470a63e6bd56c3,
1384         0xeeea5d5004981478,0x1858ccfce06cac74,
1385         0x95527a5202df0ccb,0xf37801e0c43ebc8,
1386         0xbaa718e68396cffd,0xd30560258f54e6ba,
1387         0xe950df20247c83fd,0x47c6b82ef32a2069,
1388         0x91d28b7416cdd27e,0x4cdc331d57fa5441,
1389         0xb6472e511c81471d,0xe0133fe4adf8e952,
1390         0xe3d8f9e563a198e5,0x58180fddd97723a6,
1391         0x8e679c2f5e44ff8f,0x570f09eaa7ea7648,};
1392 using powers = powers_template<>;
1393 
1394 }
1395 
1396 #endif
1397 
1398 
1399 #ifndef FASTFLOAT_DECIMAL_TO_BINARY_H
1400 #define FASTFLOAT_DECIMAL_TO_BINARY_H
1401 
1402 #include <cfloat>
1403 #include <cinttypes>
1404 #include <cmath>
1405 #include <cstdint>
1406 #include <cstdlib>
1407 #include <cstring>
1408 
1409 namespace fast_float {
1410 
1411 // This will compute or rather approximate w * 5**q and return a pair of 64-bit words approximating
1412 // the result, with the "high" part corresponding to the most significant bits and the
1413 // low part corresponding to the least significant bits.
1414 //
1415 template <int bit_precision>
1416 fastfloat_really_inline
compute_product_approximation(int64_t q,uint64_t w)1417 value128 compute_product_approximation(int64_t q, uint64_t w) {
1418   const int index = 2 * int(q - powers::smallest_power_of_five);
1419   // For small values of q, e.g., q in [0,27], the answer is always exact because
1420   // The line value128 firstproduct = full_multiplication(w, power_of_five_128[index]);
1421   // gives the exact answer.
1422   value128 firstproduct = full_multiplication(w, powers::power_of_five_128[index]);
1423   static_assert((bit_precision >= 0) && (bit_precision <= 64), " precision should  be in (0,64]");
1424   constexpr uint64_t precision_mask = (bit_precision < 64) ?
1425                (uint64_t(0xFFFFFFFFFFFFFFFF) >> bit_precision)
1426                : uint64_t(0xFFFFFFFFFFFFFFFF);
1427   if((firstproduct.high & precision_mask) == precision_mask) { // could further guard with  (lower + w < lower)
1428     // regarding the second product, we only need secondproduct.high, but our expectation is that the compiler will optimize this extra work away if needed.
1429     value128 secondproduct = full_multiplication(w, powers::power_of_five_128[index + 1]);
1430     firstproduct.low += secondproduct.high;
1431     if(secondproduct.high > firstproduct.low) {
1432       firstproduct.high++;
1433     }
1434   }
1435   return firstproduct;
1436 }
1437 
1438 namespace detail {
1439 /**
1440  * For q in (0,350), we have that
1441  *  f = (((152170 + 65536) * q ) >> 16);
1442  * is equal to
1443  *   floor(p) + q
1444  * where
1445  *   p = log(5**q)/log(2) = q * log(5)/log(2)
1446  *
1447  * For negative values of q in (-400,0), we have that
1448  *  f = (((152170 + 65536) * q ) >> 16);
1449  * is equal to
1450  *   -ceil(p) + q
1451  * where
1452  *   p = log(5**-q)/log(2) = -q * log(5)/log(2)
1453  */
power(int32_t q)1454   constexpr fastfloat_really_inline int32_t power(int32_t q)  noexcept  {
1455     return (((152170 + 65536) * q) >> 16) + 63;
1456   }
1457 } // namespace detail
1458 
1459 // create an adjusted mantissa, biased by the invalid power2
1460 // for significant digits already multiplied by 10 ** q.
1461 template <typename binary>
1462 fastfloat_really_inline
compute_error_scaled(int64_t q,uint64_t w,int lz)1463 adjusted_mantissa compute_error_scaled(int64_t q, uint64_t w, int lz) noexcept  {
1464   int hilz = int(w >> 63) ^ 1;
1465   adjusted_mantissa answer;
1466   answer.mantissa = w << hilz;
1467   int bias = binary::mantissa_explicit_bits() - binary::minimum_exponent();
1468   answer.power2 = int32_t(detail::power(int32_t(q)) + bias - hilz - lz - 62 + invalid_am_bias);
1469   return answer;
1470 }
1471 
1472 // w * 10 ** q, without rounding the representation up.
1473 // the power2 in the exponent will be adjusted by invalid_am_bias.
1474 template <typename binary>
1475 fastfloat_really_inline
compute_error(int64_t q,uint64_t w)1476 adjusted_mantissa compute_error(int64_t q, uint64_t w)  noexcept  {
1477   int lz = leading_zeroes(w);
1478   w <<= lz;
1479   value128 product = compute_product_approximation<binary::mantissa_explicit_bits() + 3>(q, w);
1480   return compute_error_scaled<binary>(q, product.high, lz);
1481 }
1482 
1483 // w * 10 ** q
1484 // The returned value should be a valid ieee64 number that simply need to be packed.
1485 // However, in some very rare cases, the computation will fail. In such cases, we
1486 // return an adjusted_mantissa with a negative power of 2: the caller should recompute
1487 // in such cases.
1488 template <typename binary>
1489 fastfloat_really_inline
compute_float(int64_t q,uint64_t w)1490 adjusted_mantissa compute_float(int64_t q, uint64_t w)  noexcept  {
1491   adjusted_mantissa answer;
1492   if ((w == 0) || (q < binary::smallest_power_of_ten())) {
1493     answer.power2 = 0;
1494     answer.mantissa = 0;
1495     // result should be zero
1496     return answer;
1497   }
1498   if (q > binary::largest_power_of_ten()) {
1499     // we want to get infinity:
1500     answer.power2 = binary::infinite_power();
1501     answer.mantissa = 0;
1502     return answer;
1503   }
1504   // At this point in time q is in [powers::smallest_power_of_five, powers::largest_power_of_five].
1505 
1506   // We want the most significant bit of i to be 1. Shift if needed.
1507   int lz = leading_zeroes(w);
1508   w <<= lz;
1509 
1510   // The required precision is binary::mantissa_explicit_bits() + 3 because
1511   // 1. We need the implicit bit
1512   // 2. We need an extra bit for rounding purposes
1513   // 3. We might lose a bit due to the "upperbit" routine (result too small, requiring a shift)
1514 
1515   value128 product = compute_product_approximation<binary::mantissa_explicit_bits() + 3>(q, w);
1516   if(product.low == 0xFFFFFFFFFFFFFFFF) { //  could guard it further
1517     // In some very rare cases, this could happen, in which case we might need a more accurate
1518     // computation that what we can provide cheaply. This is very, very unlikely.
1519     //
1520     const bool inside_safe_exponent = (q >= -27) && (q <= 55); // always good because 5**q <2**128 when q>=0,
1521     // and otherwise, for q<0, we have 5**-q<2**64 and the 128-bit reciprocal allows for exact computation.
1522     if(!inside_safe_exponent) {
1523       return compute_error_scaled<binary>(q, product.high, lz);
1524     }
1525   }
1526   // The "compute_product_approximation" function can be slightly slower than a branchless approach:
1527   // value128 product = compute_product(q, w);
1528   // but in practice, we can win big with the compute_product_approximation if its additional branch
1529   // is easily predicted. Which is best is data specific.
1530   int upperbit = int(product.high >> 63);
1531 
1532   answer.mantissa = product.high >> (upperbit + 64 - binary::mantissa_explicit_bits() - 3);
1533 
1534   answer.power2 = int32_t(detail::power(int32_t(q)) + upperbit - lz - binary::minimum_exponent());
1535   if (answer.power2 <= 0) { // we have a subnormal?
1536     // Here have that answer.power2 <= 0 so -answer.power2 >= 0
1537     if(-answer.power2 + 1 >= 64) { // if we have more than 64 bits below the minimum exponent, you have a zero for sure.
1538       answer.power2 = 0;
1539       answer.mantissa = 0;
1540       // result should be zero
1541       return answer;
1542     }
1543     // next line is safe because -answer.power2 + 1 < 64
1544     answer.mantissa >>= -answer.power2 + 1;
1545     // Thankfully, we can't have both "round-to-even" and subnormals because
1546     // "round-to-even" only occurs for powers close to 0.
1547     answer.mantissa += (answer.mantissa & 1); // round up
1548     answer.mantissa >>= 1;
1549     // There is a weird scenario where we don't have a subnormal but just.
1550     // Suppose we start with 2.2250738585072013e-308, we end up
1551     // with 0x3fffffffffffff x 2^-1023-53 which is technically subnormal
1552     // whereas 0x40000000000000 x 2^-1023-53  is normal. Now, we need to round
1553     // up 0x3fffffffffffff x 2^-1023-53  and once we do, we are no longer
1554     // subnormal, but we can only know this after rounding.
1555     // So we only declare a subnormal if we are smaller than the threshold.
1556     answer.power2 = (answer.mantissa < (uint64_t(1) << binary::mantissa_explicit_bits())) ? 0 : 1;
1557     return answer;
1558   }
1559 
1560   // usually, we round *up*, but if we fall right in between and and we have an
1561   // even basis, we need to round down
1562   // We are only concerned with the cases where 5**q fits in single 64-bit word.
1563   if ((product.low <= 1) &&  (q >= binary::min_exponent_round_to_even()) && (q <= binary::max_exponent_round_to_even()) &&
1564       ((answer.mantissa & 3) == 1) ) { // we may fall between two floats!
1565     // To be in-between two floats we need that in doing
1566     //   answer.mantissa = product.high >> (upperbit + 64 - binary::mantissa_explicit_bits() - 3);
1567     // ... we dropped out only zeroes. But if this happened, then we can go back!!!
1568     if((answer.mantissa  << (upperbit + 64 - binary::mantissa_explicit_bits() - 3)) ==  product.high) {
1569       answer.mantissa &= ~uint64_t(1);          // flip it so that we do not round up
1570     }
1571   }
1572 
1573   answer.mantissa += (answer.mantissa & 1); // round up
1574   answer.mantissa >>= 1;
1575   if (answer.mantissa >= (uint64_t(2) << binary::mantissa_explicit_bits())) {
1576     answer.mantissa = (uint64_t(1) << binary::mantissa_explicit_bits());
1577     answer.power2++; // undo previous addition
1578   }
1579 
1580   answer.mantissa &= ~(uint64_t(1) << binary::mantissa_explicit_bits());
1581   if (answer.power2 >= binary::infinite_power()) { // infinity
1582     answer.power2 = binary::infinite_power();
1583     answer.mantissa = 0;
1584   }
1585   return answer;
1586 }
1587 
1588 } // namespace fast_float
1589 
1590 #endif
1591 
1592 
1593 #ifndef FASTFLOAT_BIGINT_H
1594 #define FASTFLOAT_BIGINT_H
1595 
1596 #include <algorithm>
1597 #include <cstdint>
1598 #include <climits>
1599 #include <cstring>
1600 
1601 
1602 namespace fast_float {
1603 
1604 // the limb width: we want efficient multiplication of double the bits in
1605 // limb, or for 64-bit limbs, at least 64-bit multiplication where we can
1606 // extract the high and low parts efficiently. this is every 64-bit
1607 // architecture except for sparc, which emulates 128-bit multiplication.
1608 // we might have platforms where `CHAR_BIT` is not 8, so let's avoid
1609 // doing `8 * sizeof(limb)`.
1610 #if defined(FASTFLOAT_64BIT) && !defined(__sparc)
1611 #define FASTFLOAT_64BIT_LIMB
1612 typedef uint64_t limb;
1613 constexpr size_t limb_bits = 64;
1614 #else
1615 #define FASTFLOAT_32BIT_LIMB
1616 typedef uint32_t limb;
1617 constexpr size_t limb_bits = 32;
1618 #endif
1619 
1620 typedef span<limb> limb_span;
1621 
1622 // number of bits in a bigint. this needs to be at least the number
1623 // of bits required to store the largest bigint, which is
1624 // `log2(10**(digits + max_exp))`, or `log2(10**(767 + 342))`, or
1625 // ~3600 bits, so we round to 4000.
1626 constexpr size_t bigint_bits = 4000;
1627 constexpr size_t bigint_limbs = bigint_bits / limb_bits;
1628 
1629 // vector-like type that is allocated on the stack. the entire
1630 // buffer is pre-allocated, and only the length changes.
1631 template <uint16_t size>
1632 struct stackvec {
1633   limb data[size];
1634   // we never need more than 150 limbs
1635   uint16_t length{0};
1636 
1637   stackvec() = default;
1638   stackvec(const stackvec &) = delete;
1639   stackvec &operator=(const stackvec &) = delete;
1640   stackvec(stackvec &&) = delete;
1641   stackvec &operator=(stackvec &&other) = delete;
1642 
1643   // create stack vector from existing limb span.
stackvecstackvec1644   stackvec(limb_span s) {
1645     FASTFLOAT_ASSERT(try_extend(s));
1646   }
1647 
1648   limb& operator[](size_t index) noexcept {
1649     FASTFLOAT_DEBUG_ASSERT(index < length);
1650     return data[index];
1651   }
1652   const limb& operator[](size_t index) const noexcept {
1653     FASTFLOAT_DEBUG_ASSERT(index < length);
1654     return data[index];
1655   }
1656   // index from the end of the container
rindexstackvec1657   const limb& rindex(size_t index) const noexcept {
1658     FASTFLOAT_DEBUG_ASSERT(index < length);
1659     size_t rindex = length - index - 1;
1660     return data[rindex];
1661   }
1662 
1663   // set the length, without bounds checking.
set_lenstackvec1664   void set_len(size_t len) noexcept {
1665     length = uint16_t(len);
1666   }
lenstackvec1667   constexpr size_t len() const noexcept {
1668     return length;
1669   }
is_emptystackvec1670   constexpr bool is_empty() const noexcept {
1671     return length == 0;
1672   }
capacitystackvec1673   constexpr size_t capacity() const noexcept {
1674     return size;
1675   }
1676   // append item to vector, without bounds checking
push_uncheckedstackvec1677   void push_unchecked(limb value) noexcept {
1678     data[length] = value;
1679     length++;
1680   }
1681   // append item to vector, returning if item was added
try_pushstackvec1682   bool try_push(limb value) noexcept {
1683     if (len() < capacity()) {
1684       push_unchecked(value);
1685       return true;
1686     } else {
1687       return false;
1688     }
1689   }
1690   // add items to the vector, from a span, without bounds checking
extend_uncheckedstackvec1691   void extend_unchecked(limb_span s) noexcept {
1692     limb* ptr = data + length;
1693     ::memcpy((void*)ptr, (const void*)s.ptr, sizeof(limb) * s.len());
1694     set_len(len() + s.len());
1695   }
1696   // try to add items to the vector, returning if items were added
try_extendstackvec1697   bool try_extend(limb_span s) noexcept {
1698     if (len() + s.len() <= capacity()) {
1699       extend_unchecked(s);
1700       return true;
1701     } else {
1702       return false;
1703     }
1704   }
1705   // resize the vector, without bounds checking
1706   // if the new size is longer than the vector, assign value to each
1707   // appended item.
resize_uncheckedstackvec1708   void resize_unchecked(size_t new_len, limb value) noexcept {
1709     if (new_len > len()) {
1710       size_t count = new_len - len();
1711       limb* first = data + len();
1712       limb* last = first + count;
1713       ::std::fill(first, last, value);
1714       set_len(new_len);
1715     } else {
1716       set_len(new_len);
1717     }
1718   }
1719   // try to resize the vector, returning if the vector was resized.
try_resizestackvec1720   bool try_resize(size_t new_len, limb value) noexcept {
1721     if (new_len > capacity()) {
1722       return false;
1723     } else {
1724       resize_unchecked(new_len, value);
1725       return true;
1726     }
1727   }
1728   // check if any limbs are non-zero after the given index.
1729   // this needs to be done in reverse order, since the index
1730   // is relative to the most significant limbs.
nonzerostackvec1731   bool nonzero(size_t index) const noexcept {
1732     while (index < len()) {
1733       if (rindex(index) != 0) {
1734         return true;
1735       }
1736       index++;
1737     }
1738     return false;
1739   }
1740   // normalize the big integer, so most-significant zero limbs are removed.
normalizestackvec1741   void normalize() noexcept {
1742     while (len() > 0 && rindex(0) == 0) {
1743       length--;
1744     }
1745   }
1746 };
1747 
1748 fastfloat_really_inline
empty_hi64(bool & truncated)1749 uint64_t empty_hi64(bool& truncated) noexcept {
1750   truncated = false;
1751   return 0;
1752 }
1753 
1754 fastfloat_really_inline
uint64_hi64(uint64_t r0,bool & truncated)1755 uint64_t uint64_hi64(uint64_t r0, bool& truncated) noexcept {
1756   truncated = false;
1757   int shl = leading_zeroes(r0);
1758   return r0 << shl;
1759 }
1760 
1761 fastfloat_really_inline
uint64_hi64(uint64_t r0,uint64_t r1,bool & truncated)1762 uint64_t uint64_hi64(uint64_t r0, uint64_t r1, bool& truncated) noexcept {
1763   int shl = leading_zeroes(r0);
1764   if (shl == 0) {
1765     truncated = r1 != 0;
1766     return r0;
1767   } else {
1768     int shr = 64 - shl;
1769     truncated = (r1 << shl) != 0;
1770     return (r0 << shl) | (r1 >> shr);
1771   }
1772 }
1773 
1774 fastfloat_really_inline
uint32_hi64(uint32_t r0,bool & truncated)1775 uint64_t uint32_hi64(uint32_t r0, bool& truncated) noexcept {
1776   return uint64_hi64(r0, truncated);
1777 }
1778 
1779 fastfloat_really_inline
uint32_hi64(uint32_t r0,uint32_t r1,bool & truncated)1780 uint64_t uint32_hi64(uint32_t r0, uint32_t r1, bool& truncated) noexcept {
1781   uint64_t x0 = r0;
1782   uint64_t x1 = r1;
1783   return uint64_hi64((x0 << 32) | x1, truncated);
1784 }
1785 
1786 fastfloat_really_inline
uint32_hi64(uint32_t r0,uint32_t r1,uint32_t r2,bool & truncated)1787 uint64_t uint32_hi64(uint32_t r0, uint32_t r1, uint32_t r2, bool& truncated) noexcept {
1788   uint64_t x0 = r0;
1789   uint64_t x1 = r1;
1790   uint64_t x2 = r2;
1791   return uint64_hi64(x0, (x1 << 32) | x2, truncated);
1792 }
1793 
1794 // add two small integers, checking for overflow.
1795 // we want an efficient operation. for msvc, where
1796 // we don't have built-in intrinsics, this is still
1797 // pretty fast.
1798 fastfloat_really_inline
scalar_add(limb x,limb y,bool & overflow)1799 limb scalar_add(limb x, limb y, bool& overflow) noexcept {
1800   limb z;
1801 
1802 // gcc and clang
1803 #if defined(__has_builtin)
1804   #if __has_builtin(__builtin_add_overflow)
1805     overflow = __builtin_add_overflow(x, y, &z);
1806     return z;
1807   #endif
1808 #endif
1809 
1810   // generic, this still optimizes correctly on MSVC.
1811   z = x + y;
1812   overflow = z < x;
1813   return z;
1814 }
1815 
1816 // multiply two small integers, getting both the high and low bits.
1817 fastfloat_really_inline
scalar_mul(limb x,limb y,limb & carry)1818 limb scalar_mul(limb x, limb y, limb& carry) noexcept {
1819 #ifdef FASTFLOAT_64BIT_LIMB
1820   #if defined(__SIZEOF_INT128__)
1821   // GCC and clang both define it as an extension.
1822   __uint128_t z = __uint128_t(x) * __uint128_t(y) + __uint128_t(carry);
1823   carry = limb(z >> limb_bits);
1824   return limb(z);
1825   #else
1826   // fallback, no native 128-bit integer multiplication with carry.
1827   // on msvc, this optimizes identically, somehow.
1828   value128 z = full_multiplication(x, y);
1829   bool overflow;
1830   z.low = scalar_add(z.low, carry, overflow);
1831   z.high += uint64_t(overflow);  // cannot overflow
1832   carry = z.high;
1833   return z.low;
1834   #endif
1835 #else
1836   uint64_t z = uint64_t(x) * uint64_t(y) + uint64_t(carry);
1837   carry = limb(z >> limb_bits);
1838   return limb(z);
1839 #endif
1840 }
1841 
1842 // add scalar value to bigint starting from offset.
1843 // used in grade school multiplication
1844 template <uint16_t size>
small_add_from(stackvec<size> & vec,limb y,size_t start)1845 inline bool small_add_from(stackvec<size>& vec, limb y, size_t start) noexcept {
1846   size_t index = start;
1847   limb carry = y;
1848   bool overflow;
1849   while (carry != 0 && index < vec.len()) {
1850     vec[index] = scalar_add(vec[index], carry, overflow);
1851     carry = limb(overflow);
1852     index += 1;
1853   }
1854   if (carry != 0) {
1855     FASTFLOAT_TRY(vec.try_push(carry));
1856   }
1857   return true;
1858 }
1859 
1860 // add scalar value to bigint.
1861 template <uint16_t size>
small_add(stackvec<size> & vec,limb y)1862 fastfloat_really_inline bool small_add(stackvec<size>& vec, limb y) noexcept {
1863   return small_add_from(vec, y, 0);
1864 }
1865 
1866 // multiply bigint by scalar value.
1867 template <uint16_t size>
small_mul(stackvec<size> & vec,limb y)1868 inline bool small_mul(stackvec<size>& vec, limb y) noexcept {
1869   limb carry = 0;
1870   for (size_t index = 0; index < vec.len(); index++) {
1871     vec[index] = scalar_mul(vec[index], y, carry);
1872   }
1873   if (carry != 0) {
1874     FASTFLOAT_TRY(vec.try_push(carry));
1875   }
1876   return true;
1877 }
1878 
1879 // add bigint to bigint starting from index.
1880 // used in grade school multiplication
1881 template <uint16_t size>
large_add_from(stackvec<size> & x,limb_span y,size_t start)1882 bool large_add_from(stackvec<size>& x, limb_span y, size_t start) noexcept {
1883   // the effective x buffer is from `xstart..x.len()`, so exit early
1884   // if we can't get that current range.
1885   if (x.len() < start || y.len() > x.len() - start) {
1886       FASTFLOAT_TRY(x.try_resize(y.len() + start, 0));
1887   }
1888 
1889   bool carry = false;
1890   for (size_t index = 0; index < y.len(); index++) {
1891     limb xi = x[index + start];
1892     limb yi = y[index];
1893     bool c1 = false;
1894     bool c2 = false;
1895     xi = scalar_add(xi, yi, c1);
1896     if (carry) {
1897       xi = scalar_add(xi, 1, c2);
1898     }
1899     x[index + start] = xi;
1900     carry = c1 | c2;
1901   }
1902 
1903   // handle overflow
1904   if (carry) {
1905     FASTFLOAT_TRY(small_add_from(x, 1, y.len() + start));
1906   }
1907   return true;
1908 }
1909 
1910 // add bigint to bigint.
1911 template <uint16_t size>
large_add_from(stackvec<size> & x,limb_span y)1912 fastfloat_really_inline bool large_add_from(stackvec<size>& x, limb_span y) noexcept {
1913   return large_add_from(x, y, 0);
1914 }
1915 
1916 // grade-school multiplication algorithm
1917 template <uint16_t size>
long_mul(stackvec<size> & x,limb_span y)1918 bool long_mul(stackvec<size>& x, limb_span y) noexcept {
1919   limb_span xs = limb_span(x.data, x.len());
1920   stackvec<size> z(xs);
1921   limb_span zs = limb_span(z.data, z.len());
1922 
1923   if (y.len() != 0) {
1924     limb y0 = y[0];
1925     FASTFLOAT_TRY(small_mul(x, y0));
1926     for (size_t index = 1; index < y.len(); index++) {
1927       limb yi = y[index];
1928       stackvec<size> zi;
1929       if (yi != 0) {
1930         // re-use the same buffer throughout
1931         zi.set_len(0);
1932         FASTFLOAT_TRY(zi.try_extend(zs));
1933         FASTFLOAT_TRY(small_mul(zi, yi));
1934         limb_span zis = limb_span(zi.data, zi.len());
1935         FASTFLOAT_TRY(large_add_from(x, zis, index));
1936       }
1937     }
1938   }
1939 
1940   x.normalize();
1941   return true;
1942 }
1943 
1944 // grade-school multiplication algorithm
1945 template <uint16_t size>
large_mul(stackvec<size> & x,limb_span y)1946 bool large_mul(stackvec<size>& x, limb_span y) noexcept {
1947   if (y.len() == 1) {
1948     FASTFLOAT_TRY(small_mul(x, y[0]));
1949   } else {
1950     FASTFLOAT_TRY(long_mul(x, y));
1951   }
1952   return true;
1953 }
1954 
1955 // big integer type. implements a small subset of big integer
1956 // arithmetic, using simple algorithms since asymptotically
1957 // faster algorithms are slower for a small number of limbs.
1958 // all operations assume the big-integer is normalized.
1959 struct bigint {
1960   // storage of the limbs, in little-endian order.
1961   stackvec<bigint_limbs> vec;
1962 
bigintbigint1963   bigint(): vec() {}
1964   bigint(const bigint &) = delete;
1965   bigint &operator=(const bigint &) = delete;
1966   bigint(bigint &&) = delete;
1967   bigint &operator=(bigint &&other) = delete;
1968 
bigintbigint1969   bigint(uint64_t value): vec() {
1970 #ifdef FASTFLOAT_64BIT_LIMB
1971     vec.push_unchecked(value);
1972 #else
1973     vec.push_unchecked(uint32_t(value));
1974     vec.push_unchecked(uint32_t(value >> 32));
1975 #endif
1976     vec.normalize();
1977   }
1978 
1979   // get the high 64 bits from the vector, and if bits were truncated.
1980   // this is to get the significant digits for the float.
hi64bigint1981   uint64_t hi64(bool& truncated) const noexcept {
1982 #ifdef FASTFLOAT_64BIT_LIMB
1983     if (vec.len() == 0) {
1984       return empty_hi64(truncated);
1985     } else if (vec.len() == 1) {
1986       return uint64_hi64(vec.rindex(0), truncated);
1987     } else {
1988       uint64_t result = uint64_hi64(vec.rindex(0), vec.rindex(1), truncated);
1989       truncated |= vec.nonzero(2);
1990       return result;
1991     }
1992 #else
1993     if (vec.len() == 0) {
1994       return empty_hi64(truncated);
1995     } else if (vec.len() == 1) {
1996       return uint32_hi64(vec.rindex(0), truncated);
1997     } else if (vec.len() == 2) {
1998       return uint32_hi64(vec.rindex(0), vec.rindex(1), truncated);
1999     } else {
2000       uint64_t result = uint32_hi64(vec.rindex(0), vec.rindex(1), vec.rindex(2), truncated);
2001       truncated |= vec.nonzero(3);
2002       return result;
2003     }
2004 #endif
2005   }
2006 
2007   // compare two big integers, returning the large value.
2008   // assumes both are normalized. if the return value is
2009   // negative, other is larger, if the return value is
2010   // positive, this is larger, otherwise they are equal.
2011   // the limbs are stored in little-endian order, so we
2012   // must compare the limbs in ever order.
comparebigint2013   int compare(const bigint& other) const noexcept {
2014     if (vec.len() > other.vec.len()) {
2015       return 1;
2016     } else if (vec.len() < other.vec.len()) {
2017       return -1;
2018     } else {
2019       for (size_t index = vec.len(); index > 0; index--) {
2020         limb xi = vec[index - 1];
2021         limb yi = other.vec[index - 1];
2022         if (xi > yi) {
2023           return 1;
2024         } else if (xi < yi) {
2025           return -1;
2026         }
2027       }
2028       return 0;
2029     }
2030   }
2031 
2032   // shift left each limb n bits, carrying over to the new limb
2033   // returns true if we were able to shift all the digits.
shl_bitsbigint2034   bool shl_bits(size_t n) noexcept {
2035     // Internally, for each item, we shift left by n, and add the previous
2036     // right shifted limb-bits.
2037     // For example, we transform (for u8) shifted left 2, to:
2038     //      b10100100 b01000010
2039     //      b10 b10010001 b00001000
2040     FASTFLOAT_DEBUG_ASSERT(n != 0);
2041     FASTFLOAT_DEBUG_ASSERT(n < sizeof(limb) * 8);
2042 
2043     size_t shl = n;
2044     size_t shr = limb_bits - shl;
2045     limb prev = 0;
2046     for (size_t index = 0; index < vec.len(); index++) {
2047       limb xi = vec[index];
2048       vec[index] = (xi << shl) | (prev >> shr);
2049       prev = xi;
2050     }
2051 
2052     limb carry = prev >> shr;
2053     if (carry != 0) {
2054       return vec.try_push(carry);
2055     }
2056     return true;
2057   }
2058 
2059   // move the limbs left by `n` limbs.
shl_limbsbigint2060   bool shl_limbs(size_t n) noexcept {
2061     FASTFLOAT_DEBUG_ASSERT(n != 0);
2062     if (n + vec.len() > vec.capacity()) {
2063       return false;
2064     } else if (!vec.is_empty()) {
2065       // move limbs
2066       limb* dst = vec.data + n;
2067       const limb* src = vec.data;
2068       ::memmove(dst, src, sizeof(limb) * vec.len());
2069       // fill in empty limbs
2070       limb* first = vec.data;
2071       limb* last = first + n;
2072       ::std::fill(first, last, 0);
2073       vec.set_len(n + vec.len());
2074       return true;
2075     } else {
2076       return true;
2077     }
2078   }
2079 
2080   // move the limbs left by `n` bits.
shlbigint2081   bool shl(size_t n) noexcept {
2082     size_t rem = n % limb_bits;
2083     size_t div = n / limb_bits;
2084     if (rem != 0) {
2085       FASTFLOAT_TRY(shl_bits(rem));
2086     }
2087     if (div != 0) {
2088       FASTFLOAT_TRY(shl_limbs(div));
2089     }
2090     return true;
2091   }
2092 
2093   // get the number of leading zeros in the bigint.
ctlzbigint2094   int ctlz() const noexcept {
2095     if (vec.is_empty()) {
2096       return 0;
2097     } else {
2098 #ifdef FASTFLOAT_64BIT_LIMB
2099       return leading_zeroes(vec.rindex(0));
2100 #else
2101       // no use defining a specialized leading_zeroes for a 32-bit type.
2102       uint64_t r0 = vec.rindex(0);
2103       return leading_zeroes(r0 << 32);
2104 #endif
2105     }
2106   }
2107 
2108   // get the number of bits in the bigint.
bit_lengthbigint2109   int bit_length() const noexcept {
2110     int lz = ctlz();
2111     return int(limb_bits * vec.len()) - lz;
2112   }
2113 
mulbigint2114   bool mul(limb y) noexcept {
2115     return small_mul(vec, y);
2116   }
2117 
addbigint2118   bool add(limb y) noexcept {
2119     return small_add(vec, y);
2120   }
2121 
2122   // multiply as if by 2 raised to a power.
pow2bigint2123   bool pow2(uint32_t exp) noexcept {
2124     return shl(exp);
2125   }
2126 
2127   // multiply as if by 5 raised to a power.
pow5bigint2128   bool pow5(uint32_t exp) noexcept {
2129     // multiply by a power of 5
2130     static constexpr uint32_t large_step = 135;
2131     static constexpr uint64_t small_power_of_5[] = {
2132       1UL, 5UL, 25UL, 125UL, 625UL, 3125UL, 15625UL, 78125UL, 390625UL,
2133       1953125UL, 9765625UL, 48828125UL, 244140625UL, 1220703125UL,
2134       6103515625UL, 30517578125UL, 152587890625UL, 762939453125UL,
2135       3814697265625UL, 19073486328125UL, 95367431640625UL, 476837158203125UL,
2136       2384185791015625UL, 11920928955078125UL, 59604644775390625UL,
2137       298023223876953125UL, 1490116119384765625UL, 7450580596923828125UL,
2138     };
2139 #ifdef FASTFLOAT_64BIT_LIMB
2140     constexpr static limb large_power_of_5[] = {
2141       1414648277510068013UL, 9180637584431281687UL, 4539964771860779200UL,
2142       10482974169319127550UL, 198276706040285095UL};
2143 #else
2144     constexpr static limb large_power_of_5[] = {
2145       4279965485U, 329373468U, 4020270615U, 2137533757U, 4287402176U,
2146       1057042919U, 1071430142U, 2440757623U, 381945767U, 46164893U};
2147 #endif
2148     size_t large_length = sizeof(large_power_of_5) / sizeof(limb);
2149     limb_span large = limb_span(large_power_of_5, large_length);
2150     while (exp >= large_step) {
2151       FASTFLOAT_TRY(large_mul(vec, large));
2152       exp -= large_step;
2153     }
2154 #ifdef FASTFLOAT_64BIT_LIMB
2155     uint32_t small_step = 27;
2156     limb max_native = 7450580596923828125UL;
2157 #else
2158     uint32_t small_step = 13;
2159     limb max_native = 1220703125U;
2160 #endif
2161     while (exp >= small_step) {
2162       FASTFLOAT_TRY(small_mul(vec, max_native));
2163       exp -= small_step;
2164     }
2165     if (exp != 0) {
2166       FASTFLOAT_TRY(small_mul(vec, limb(small_power_of_5[exp])));
2167     }
2168 
2169     return true;
2170   }
2171 
2172   // multiply as if by 10 raised to a power.
pow10bigint2173   bool pow10(uint32_t exp) noexcept {
2174     FASTFLOAT_TRY(pow5(exp));
2175     return pow2(exp);
2176   }
2177 };
2178 
2179 } // namespace fast_float
2180 
2181 #endif
2182 
2183 
2184 #ifndef FASTFLOAT_ASCII_NUMBER_H
2185 #define FASTFLOAT_ASCII_NUMBER_H
2186 
2187 #include <cctype>
2188 #include <cstdint>
2189 #include <cstring>
2190 #include <iterator>
2191 
2192 
2193 namespace fast_float {
2194 
2195 // Next function can be micro-optimized, but compilers are entirely
2196 // able to optimize it well.
is_integer(char c)2197 fastfloat_really_inline bool is_integer(char c)  noexcept  { return c >= '0' && c <= '9'; }
2198 
byteswap(uint64_t val)2199 fastfloat_really_inline uint64_t byteswap(uint64_t val) {
2200   return (val & 0xFF00000000000000) >> 56
2201     | (val & 0x00FF000000000000) >> 40
2202     | (val & 0x0000FF0000000000) >> 24
2203     | (val & 0x000000FF00000000) >> 8
2204     | (val & 0x00000000FF000000) << 8
2205     | (val & 0x0000000000FF0000) << 24
2206     | (val & 0x000000000000FF00) << 40
2207     | (val & 0x00000000000000FF) << 56;
2208 }
2209 
read_u64(const char * chars)2210 fastfloat_really_inline uint64_t read_u64(const char *chars) {
2211   uint64_t val;
2212   ::memcpy(&val, chars, sizeof(uint64_t));
2213 #if FASTFLOAT_IS_BIG_ENDIAN == 1
2214   // Need to read as-if the number was in little-endian order.
2215   val = byteswap(val);
2216 #endif
2217   return val;
2218 }
2219 
write_u64(uint8_t * chars,uint64_t val)2220 fastfloat_really_inline void write_u64(uint8_t *chars, uint64_t val) {
2221 #if FASTFLOAT_IS_BIG_ENDIAN == 1
2222   // Need to read as-if the number was in little-endian order.
2223   val = byteswap(val);
2224 #endif
2225   ::memcpy(chars, &val, sizeof(uint64_t));
2226 }
2227 
2228 // credit  @aqrit
parse_eight_digits_unrolled(uint64_t val)2229 fastfloat_really_inline uint32_t  parse_eight_digits_unrolled(uint64_t val) {
2230   const uint64_t mask = 0x000000FF000000FF;
2231   const uint64_t mul1 = 0x000F424000000064; // 100 + (1000000ULL << 32)
2232   const uint64_t mul2 = 0x0000271000000001; // 1 + (10000ULL << 32)
2233   val -= 0x3030303030303030;
2234   val = (val * 10) + (val >> 8); // val = (val * 2561) >> 8;
2235   val = (((val & mask) * mul1) + (((val >> 16) & mask) * mul2)) >> 32;
2236   return uint32_t(val);
2237 }
2238 
parse_eight_digits_unrolled(const char * chars)2239 fastfloat_really_inline uint32_t parse_eight_digits_unrolled(const char *chars)  noexcept  {
2240   return parse_eight_digits_unrolled(read_u64(chars));
2241 }
2242 
2243 // credit @aqrit
is_made_of_eight_digits_fast(uint64_t val)2244 fastfloat_really_inline bool is_made_of_eight_digits_fast(uint64_t val)  noexcept  {
2245   return !((((val + 0x4646464646464646) | (val - 0x3030303030303030)) &
2246      0x8080808080808080));
2247 }
2248 
is_made_of_eight_digits_fast(const char * chars)2249 fastfloat_really_inline bool is_made_of_eight_digits_fast(const char *chars)  noexcept  {
2250   return is_made_of_eight_digits_fast(read_u64(chars));
2251 }
2252 
2253 typedef span<const char> byte_span;
2254 
2255 struct parsed_number_string {
2256   int64_t exponent{0};
2257   uint64_t mantissa{0};
2258   const char *lastmatch{nullptr};
2259   bool negative{false};
2260   bool valid{false};
2261   bool too_many_digits{false};
2262   // contains the range of the significant digits
2263   byte_span integer{};  // non-nullable
2264   byte_span fraction{}; // nullable
2265 };
2266 
2267 // Assuming that you use no more than 19 digits, this will
2268 // parse an ASCII string.
2269 fastfloat_really_inline
parse_number_string(const char * p,const char * pend,parse_options options)2270 parsed_number_string parse_number_string(const char *p, const char *pend, parse_options options) noexcept {
2271   const chars_format fmt = options.format;
2272   const char decimal_point = options.decimal_point;
2273 
2274   parsed_number_string answer;
2275   answer.valid = false;
2276   answer.too_many_digits = false;
2277   answer.negative = (*p == '-');
2278   if (*p == '-') { // C++17 20.19.3.(7.1) explicitly forbids '+' sign here
2279     ++p;
2280     if (p == pend) {
2281       return answer;
2282     }
2283     if (!is_integer(*p) && (*p != decimal_point)) { // a sign must be followed by an integer or the dot
2284       return answer;
2285     }
2286   }
2287   const char *const start_digits = p;
2288 
2289   uint64_t i = 0; // an unsigned int avoids signed overflows (which are bad)
2290 
2291   while ((std::distance(p, pend) >= 8) && is_made_of_eight_digits_fast(p)) {
2292     i = i * 100000000 + parse_eight_digits_unrolled(p); // in rare cases, this will overflow, but that's ok
2293     p += 8;
2294   }
2295   while ((p != pend) && is_integer(*p)) {
2296     // a multiplication by 10 is cheaper than an arbitrary integer
2297     // multiplication
2298     i = 10 * i +
2299         uint64_t(*p - '0'); // might overflow, we will handle the overflow later
2300     ++p;
2301   }
2302   const char *const end_of_integer_part = p;
2303   int64_t digit_count = int64_t(end_of_integer_part - start_digits);
2304   answer.integer = byte_span(start_digits, size_t(digit_count));
2305   int64_t exponent = 0;
2306   if ((p != pend) && (*p == decimal_point)) {
2307     ++p;
2308     const char* before = p;
2309     // can occur at most twice without overflowing, but let it occur more, since
2310     // for integers with many digits, digit parsing is the primary bottleneck.
2311     while ((std::distance(p, pend) >= 8) && is_made_of_eight_digits_fast(p)) {
2312       i = i * 100000000 + parse_eight_digits_unrolled(p); // in rare cases, this will overflow, but that's ok
2313       p += 8;
2314     }
2315     while ((p != pend) && is_integer(*p)) {
2316       uint8_t digit = uint8_t(*p - '0');
2317       ++p;
2318       i = i * 10 + digit; // in rare cases, this will overflow, but that's ok
2319     }
2320     exponent = before - p;
2321     answer.fraction = byte_span(before, size_t(p - before));
2322     digit_count -= exponent;
2323   }
2324   // we must have encountered at least one integer!
2325   if (digit_count == 0) {
2326     return answer;
2327   }
2328   int64_t exp_number = 0;            // explicit exponential part
2329   if ((fmt & chars_format::scientific) && (p != pend) && (('e' == *p) || ('E' == *p))) {
2330     const char * location_of_e = p;
2331     ++p;
2332     bool neg_exp = false;
2333     if ((p != pend) && ('-' == *p)) {
2334       neg_exp = true;
2335       ++p;
2336     } else if ((p != pend) && ('+' == *p)) { // '+' on exponent is allowed by C++17 20.19.3.(7.1)
2337       ++p;
2338     }
2339     if ((p == pend) || !is_integer(*p)) {
2340       if(!(fmt & chars_format::fixed)) {
2341         // We are in error.
2342         return answer;
2343       }
2344       // Otherwise, we will be ignoring the 'e'.
2345       p = location_of_e;
2346     } else {
2347       while ((p != pend) && is_integer(*p)) {
2348         uint8_t digit = uint8_t(*p - '0');
2349         if (exp_number < 0x10000000) {
2350           exp_number = 10 * exp_number + digit;
2351         }
2352         ++p;
2353       }
2354       if(neg_exp) { exp_number = - exp_number; }
2355       exponent += exp_number;
2356     }
2357   } else {
2358     // If it scientific and not fixed, we have to bail out.
2359     if((fmt & chars_format::scientific) && !(fmt & chars_format::fixed)) { return answer; }
2360   }
2361   answer.lastmatch = p;
2362   answer.valid = true;
2363 
2364   // If we frequently had to deal with long strings of digits,
2365   // we could extend our code by using a 128-bit integer instead
2366   // of a 64-bit integer. However, this is uncommon.
2367   //
2368   // We can deal with up to 19 digits.
2369   if (digit_count > 19) { // this is uncommon
2370     // It is possible that the integer had an overflow.
2371     // We have to handle the case where we have 0.0000somenumber.
2372     // We need to be mindful of the case where we only have zeroes...
2373     // E.g., 0.000000000...000.
2374     const char *start = start_digits;
2375     while ((start != pend) && (*start == '0' || *start == decimal_point)) {
2376       if(*start == '0') { digit_count --; }
2377       start++;
2378     }
2379     if (digit_count > 19) {
2380       answer.too_many_digits = true;
2381       // Let us start again, this time, avoiding overflows.
2382       // We don't need to check if is_integer, since we use the
2383       // pre-tokenized spans from above.
2384       i = 0;
2385       p = answer.integer.ptr;
2386       const char* int_end = p + answer.integer.len();
2387       const uint64_t minimal_nineteen_digit_integer{1000000000000000000};
2388       while((i < minimal_nineteen_digit_integer) && (p != int_end)) {
2389         i = i * 10 + uint64_t(*p - '0');
2390         ++p;
2391       }
2392       if (i >= minimal_nineteen_digit_integer) { // We have a big integers
2393         exponent = end_of_integer_part - p + exp_number;
2394       } else { // We have a value with a fractional component.
2395           p = answer.fraction.ptr;
2396           const char* frac_end = p + answer.fraction.len();
2397           while((i < minimal_nineteen_digit_integer) && (p != frac_end)) {
2398             i = i * 10 + uint64_t(*p - '0');
2399             ++p;
2400           }
2401           exponent = answer.fraction.ptr - p + exp_number;
2402       }
2403       // We have now corrected both exponent and i, to a truncated value
2404     }
2405   }
2406   answer.exponent = exponent;
2407   answer.mantissa = i;
2408   return answer;
2409 }
2410 
2411 } // namespace fast_float
2412 
2413 #endif
2414 
2415 
2416 #ifndef FASTFLOAT_DIGIT_COMPARISON_H
2417 #define FASTFLOAT_DIGIT_COMPARISON_H
2418 
2419 #include <algorithm>
2420 #include <cstdint>
2421 #include <cstring>
2422 #include <iterator>
2423 
2424 
2425 namespace fast_float {
2426 
2427 // 1e0 to 1e19
2428 constexpr static uint64_t powers_of_ten_uint64[] = {
2429     1UL, 10UL, 100UL, 1000UL, 10000UL, 100000UL, 1000000UL, 10000000UL, 100000000UL,
2430     1000000000UL, 10000000000UL, 100000000000UL, 1000000000000UL, 10000000000000UL,
2431     100000000000000UL, 1000000000000000UL, 10000000000000000UL, 100000000000000000UL,
2432     1000000000000000000UL, 10000000000000000000UL};
2433 
2434 // calculate the exponent, in scientific notation, of the number.
2435 // this algorithm is not even close to optimized, but it has no practical
2436 // effect on performance: in order to have a faster algorithm, we'd need
2437 // to slow down performance for faster algorithms, and this is still fast.
scientific_exponent(parsed_number_string & num)2438 fastfloat_really_inline int32_t scientific_exponent(parsed_number_string& num) noexcept {
2439   uint64_t mantissa = num.mantissa;
2440   int32_t exponent = int32_t(num.exponent);
2441   while (mantissa >= 10000) {
2442     mantissa /= 10000;
2443     exponent += 4;
2444   }
2445   while (mantissa >= 100) {
2446     mantissa /= 100;
2447     exponent += 2;
2448   }
2449   while (mantissa >= 10) {
2450     mantissa /= 10;
2451     exponent += 1;
2452   }
2453   return exponent;
2454 }
2455 
2456 // this converts a native floating-point number to an extended-precision float.
2457 template <typename T>
to_extended(T value)2458 fastfloat_really_inline adjusted_mantissa to_extended(T value) noexcept {
2459   adjusted_mantissa am;
2460   int32_t bias = binary_format<T>::mantissa_explicit_bits() - binary_format<T>::minimum_exponent();
2461   if (std::is_same<T, float>::value) {
2462     constexpr uint32_t exponent_mask = 0x7F800000;
2463     constexpr uint32_t mantissa_mask = 0x007FFFFF;
2464     constexpr uint64_t hidden_bit_mask = 0x00800000;
2465     uint32_t bits;
2466     ::memcpy(&bits, &value, sizeof(T));
2467     if ((bits & exponent_mask) == 0) {
2468       // denormal
2469       am.power2 = 1 - bias;
2470       am.mantissa = bits & mantissa_mask;
2471     } else {
2472       // normal
2473       am.power2 = int32_t((bits & exponent_mask) >> binary_format<T>::mantissa_explicit_bits());
2474       am.power2 -= bias;
2475       am.mantissa = (bits & mantissa_mask) | hidden_bit_mask;
2476     }
2477   } else {
2478     constexpr uint64_t exponent_mask = 0x7FF0000000000000;
2479     constexpr uint64_t mantissa_mask = 0x000FFFFFFFFFFFFF;
2480     constexpr uint64_t hidden_bit_mask = 0x0010000000000000;
2481     uint64_t bits;
2482     ::memcpy(&bits, &value, sizeof(T));
2483     if ((bits & exponent_mask) == 0) {
2484       // denormal
2485       am.power2 = 1 - bias;
2486       am.mantissa = bits & mantissa_mask;
2487     } else {
2488       // normal
2489       am.power2 = int32_t((bits & exponent_mask) >> binary_format<T>::mantissa_explicit_bits());
2490       am.power2 -= bias;
2491       am.mantissa = (bits & mantissa_mask) | hidden_bit_mask;
2492     }
2493   }
2494 
2495   return am;
2496 }
2497 
2498 // get the extended precision value of the halfway point between b and b+u.
2499 // we are given a native float that represents b, so we need to adjust it
2500 // halfway between b and b+u.
2501 template <typename T>
to_extended_halfway(T value)2502 fastfloat_really_inline adjusted_mantissa to_extended_halfway(T value) noexcept {
2503   adjusted_mantissa am = to_extended(value);
2504   am.mantissa <<= 1;
2505   am.mantissa += 1;
2506   am.power2 -= 1;
2507   return am;
2508 }
2509 
2510 // round an extended-precision float to the nearest machine float.
2511 template <typename T, typename callback>
round(adjusted_mantissa & am,callback cb)2512 fastfloat_really_inline void round(adjusted_mantissa& am, callback cb) noexcept {
2513   int32_t mantissa_shift = 64 - binary_format<T>::mantissa_explicit_bits() - 1;
2514   if (-am.power2 >= mantissa_shift) {
2515     // have a denormal float
2516     int32_t shift = -am.power2 + 1;
2517     cb(am, std::min(shift, 64));
2518     // check for round-up: if rounding-nearest carried us to the hidden bit.
2519     am.power2 = (am.mantissa < (uint64_t(1) << binary_format<T>::mantissa_explicit_bits())) ? 0 : 1;
2520     return;
2521   }
2522 
2523   // have a normal float, use the default shift.
2524   cb(am, mantissa_shift);
2525 
2526   // check for carry
2527   if (am.mantissa >= (uint64_t(2) << binary_format<T>::mantissa_explicit_bits())) {
2528     am.mantissa = (uint64_t(1) << binary_format<T>::mantissa_explicit_bits());
2529     am.power2++;
2530   }
2531 
2532   // check for infinite: we could have carried to an infinite power
2533   am.mantissa &= ~(uint64_t(1) << binary_format<T>::mantissa_explicit_bits());
2534   if (am.power2 >= binary_format<T>::infinite_power()) {
2535     am.power2 = binary_format<T>::infinite_power();
2536     am.mantissa = 0;
2537   }
2538 }
2539 
2540 template <typename callback>
2541 fastfloat_really_inline
round_nearest_tie_even(adjusted_mantissa & am,int32_t shift,callback cb)2542 void round_nearest_tie_even(adjusted_mantissa& am, int32_t shift, callback cb) noexcept {
2543   uint64_t mask;
2544   uint64_t halfway;
2545   if (shift == 64) {
2546     mask = UINT64_MAX;
2547   } else {
2548     mask = (uint64_t(1) << shift) - 1;
2549   }
2550   if (shift == 0) {
2551     halfway = 0;
2552   } else {
2553     halfway = uint64_t(1) << (shift - 1);
2554   }
2555   uint64_t truncated_bits = am.mantissa & mask;
2556   uint64_t is_above = truncated_bits > halfway;
2557   uint64_t is_halfway = truncated_bits == halfway;
2558 
2559   // shift digits into position
2560   if (shift == 64) {
2561     am.mantissa = 0;
2562   } else {
2563     am.mantissa >>= shift;
2564   }
2565   am.power2 += shift;
2566 
2567   bool is_odd = (am.mantissa & 1) == 1;
2568   am.mantissa += uint64_t(cb(is_odd, is_halfway, is_above));
2569 }
2570 
round_down(adjusted_mantissa & am,int32_t shift)2571 fastfloat_really_inline void round_down(adjusted_mantissa& am, int32_t shift) noexcept {
2572   if (shift == 64) {
2573     am.mantissa = 0;
2574   } else {
2575     am.mantissa >>= shift;
2576   }
2577   am.power2 += shift;
2578 }
2579 
skip_zeros(const char * & first,const char * last)2580 fastfloat_really_inline void skip_zeros(const char*& first, const char* last) noexcept {
2581   uint64_t val;
2582   while (std::distance(first, last) >= 8) {
2583     ::memcpy(&val, first, sizeof(uint64_t));
2584     if (val != 0x3030303030303030) {
2585       break;
2586     }
2587     first += 8;
2588   }
2589   while (first != last) {
2590     if (*first != '0') {
2591       break;
2592     }
2593     first++;
2594   }
2595 }
2596 
2597 // determine if any non-zero digits were truncated.
2598 // all characters must be valid digits.
is_truncated(const char * first,const char * last)2599 fastfloat_really_inline bool is_truncated(const char* first, const char* last) noexcept {
2600   // do 8-bit optimizations, can just compare to 8 literal 0s.
2601   uint64_t val;
2602   while (std::distance(first, last) >= 8) {
2603     ::memcpy(&val, first, sizeof(uint64_t));
2604     if (val != 0x3030303030303030) {
2605       return true;
2606     }
2607     first += 8;
2608   }
2609   while (first != last) {
2610     if (*first != '0') {
2611       return true;
2612     }
2613     first++;
2614   }
2615   return false;
2616 }
2617 
is_truncated(byte_span s)2618 fastfloat_really_inline bool is_truncated(byte_span s) noexcept {
2619   return is_truncated(s.ptr, s.ptr + s.len());
2620 }
2621 
2622 fastfloat_really_inline
parse_eight_digits(const char * & p,limb & value,size_t & counter,size_t & count)2623 void parse_eight_digits(const char*& p, limb& value, size_t& counter, size_t& count) noexcept {
2624   value = value * 100000000 + parse_eight_digits_unrolled(p);
2625   p += 8;
2626   counter += 8;
2627   count += 8;
2628 }
2629 
2630 fastfloat_really_inline
parse_one_digit(const char * & p,limb & value,size_t & counter,size_t & count)2631 void parse_one_digit(const char*& p, limb& value, size_t& counter, size_t& count) noexcept {
2632   value = value * 10 + limb(*p - '0');
2633   p++;
2634   counter++;
2635   count++;
2636 }
2637 
2638 fastfloat_really_inline
add_native(bigint & big,limb power,limb value)2639 void add_native(bigint& big, limb power, limb value) noexcept {
2640   big.mul(power);
2641   big.add(value);
2642 }
2643 
round_up_bigint(bigint & big,size_t & count)2644 fastfloat_really_inline void round_up_bigint(bigint& big, size_t& count) noexcept {
2645   // need to round-up the digits, but need to avoid rounding
2646   // ....9999 to ...10000, which could cause a false halfway point.
2647   add_native(big, 10, 1);
2648   count++;
2649 }
2650 
2651 // parse the significant digits into a big integer
parse_mantissa(bigint & result,parsed_number_string & num,size_t max_digits,size_t & digits)2652 inline void parse_mantissa(bigint& result, parsed_number_string& num, size_t max_digits, size_t& digits) noexcept {
2653   // try to minimize the number of big integer and scalar multiplication.
2654   // therefore, try to parse 8 digits at a time, and multiply by the largest
2655   // scalar value (9 or 19 digits) for each step.
2656   size_t counter = 0;
2657   digits = 0;
2658   limb value = 0;
2659 #ifdef FASTFLOAT_64BIT_LIMB
2660   size_t step = 19;
2661 #else
2662   size_t step = 9;
2663 #endif
2664 
2665   // process all integer digits.
2666   const char* p = num.integer.ptr;
2667   const char* pend = p + num.integer.len();
2668   skip_zeros(p, pend);
2669   // process all digits, in increments of step per loop
2670   while (p != pend) {
2671     while ((std::distance(p, pend) >= 8) && (step - counter >= 8) && (max_digits - digits >= 8)) {
2672       parse_eight_digits(p, value, counter, digits);
2673     }
2674     while (counter < step && p != pend && digits < max_digits) {
2675       parse_one_digit(p, value, counter, digits);
2676     }
2677     if (digits == max_digits) {
2678       // add the temporary value, then check if we've truncated any digits
2679       add_native(result, limb(powers_of_ten_uint64[counter]), value);
2680       bool truncated = is_truncated(p, pend);
2681       if (num.fraction.ptr != nullptr) {
2682         truncated |= is_truncated(num.fraction);
2683       }
2684       if (truncated) {
2685         round_up_bigint(result, digits);
2686       }
2687       return;
2688     } else {
2689       add_native(result, limb(powers_of_ten_uint64[counter]), value);
2690       counter = 0;
2691       value = 0;
2692     }
2693   }
2694 
2695   // add our fraction digits, if they're available.
2696   if (num.fraction.ptr != nullptr) {
2697     p = num.fraction.ptr;
2698     pend = p + num.fraction.len();
2699     if (digits == 0) {
2700       skip_zeros(p, pend);
2701     }
2702     // process all digits, in increments of step per loop
2703     while (p != pend) {
2704       while ((std::distance(p, pend) >= 8) && (step - counter >= 8) && (max_digits - digits >= 8)) {
2705         parse_eight_digits(p, value, counter, digits);
2706       }
2707       while (counter < step && p != pend && digits < max_digits) {
2708         parse_one_digit(p, value, counter, digits);
2709       }
2710       if (digits == max_digits) {
2711         // add the temporary value, then check if we've truncated any digits
2712         add_native(result, limb(powers_of_ten_uint64[counter]), value);
2713         bool truncated = is_truncated(p, pend);
2714         if (truncated) {
2715           round_up_bigint(result, digits);
2716         }
2717         return;
2718       } else {
2719         add_native(result, limb(powers_of_ten_uint64[counter]), value);
2720         counter = 0;
2721         value = 0;
2722       }
2723     }
2724   }
2725 
2726   if (counter != 0) {
2727     add_native(result, limb(powers_of_ten_uint64[counter]), value);
2728   }
2729 }
2730 
2731 template <typename T>
positive_digit_comp(bigint & bigmant,int32_t exponent)2732 inline adjusted_mantissa positive_digit_comp(bigint& bigmant, int32_t exponent) noexcept {
2733   FASTFLOAT_ASSERT(bigmant.pow10(uint32_t(exponent)));
2734   adjusted_mantissa answer;
2735   bool truncated;
2736   answer.mantissa = bigmant.hi64(truncated);
2737   int bias = binary_format<T>::mantissa_explicit_bits() - binary_format<T>::minimum_exponent();
2738   answer.power2 = bigmant.bit_length() - 64 + bias;
2739 
2740   round<T>(answer, [truncated](adjusted_mantissa& a, int32_t shift) {
2741     round_nearest_tie_even(a, shift, [truncated](bool is_odd, bool is_halfway, bool is_above) -> bool {
2742       return is_above || (is_halfway && truncated) || (is_odd && is_halfway);
2743     });
2744   });
2745 
2746   return answer;
2747 }
2748 
2749 // the scaling here is quite simple: we have, for the real digits `m * 10^e`,
2750 // and for the theoretical digits `n * 2^f`. Since `e` is always negative,
2751 // to scale them identically, we do `n * 2^f * 5^-f`, so we now have `m * 2^e`.
2752 // we then need to scale by `2^(f- e)`, and then the two significant digits
2753 // are of the same magnitude.
2754 template <typename T>
negative_digit_comp(bigint & bigmant,adjusted_mantissa am,int32_t exponent)2755 inline adjusted_mantissa negative_digit_comp(bigint& bigmant, adjusted_mantissa am, int32_t exponent) noexcept {
2756   bigint& real_digits = bigmant;
2757   int32_t real_exp = exponent;
2758 
2759   // get the value of `b`, rounded down, and get a bigint representation of b+h
2760   adjusted_mantissa am_b = am;
2761   // gcc7 buf: use a lambda to remove the noexcept qualifier bug with -Wnoexcept-type.
2762   round<T>(am_b, [](adjusted_mantissa&a, int32_t shift) { round_down(a, shift); });
2763   T b;
2764   to_float(false, am_b, b);
2765   adjusted_mantissa theor = to_extended_halfway(b);
2766   bigint theor_digits(theor.mantissa);
2767   int32_t theor_exp = theor.power2;
2768 
2769   // scale real digits and theor digits to be same power.
2770   int32_t pow2_exp = theor_exp - real_exp;
2771   uint32_t pow5_exp = uint32_t(-real_exp);
2772   if (pow5_exp != 0) {
2773     FASTFLOAT_ASSERT(theor_digits.pow5(pow5_exp));
2774   }
2775   if (pow2_exp > 0) {
2776     FASTFLOAT_ASSERT(theor_digits.pow2(uint32_t(pow2_exp)));
2777   } else if (pow2_exp < 0) {
2778     FASTFLOAT_ASSERT(real_digits.pow2(uint32_t(-pow2_exp)));
2779   }
2780 
2781   // compare digits, and use it to director rounding
2782   int ord = real_digits.compare(theor_digits);
2783   adjusted_mantissa answer = am;
2784   round<T>(answer, [ord](adjusted_mantissa& a, int32_t shift) {
2785     round_nearest_tie_even(a, shift, [ord](bool is_odd, bool _, bool __) -> bool {
2786       (void)_;  // not needed, since we've done our comparison
2787       (void)__; // not needed, since we've done our comparison
2788       if (ord > 0) {
2789         return true;
2790       } else if (ord < 0) {
2791         return false;
2792       } else {
2793         return is_odd;
2794       }
2795     });
2796   });
2797 
2798   return answer;
2799 }
2800 
2801 // parse the significant digits as a big integer to unambiguously round the
2802 // the significant digits. here, we are trying to determine how to round
2803 // an extended float representation close to `b+h`, halfway between `b`
2804 // (the float rounded-down) and `b+u`, the next positive float. this
2805 // algorithm is always correct, and uses one of two approaches. when
2806 // the exponent is positive relative to the significant digits (such as
2807 // 1234), we create a big-integer representation, get the high 64-bits,
2808 // determine if any lower bits are truncated, and use that to direct
2809 // rounding. in case of a negative exponent relative to the significant
2810 // digits (such as 1.2345), we create a theoretical representation of
2811 // `b` as a big-integer type, scaled to the same binary exponent as
2812 // the actual digits. we then compare the big integer representations
2813 // of both, and use that to direct rounding.
2814 template <typename T>
digit_comp(parsed_number_string & num,adjusted_mantissa am)2815 inline adjusted_mantissa digit_comp(parsed_number_string& num, adjusted_mantissa am) noexcept {
2816   // remove the invalid exponent bias
2817   am.power2 -= invalid_am_bias;
2818 
2819   int32_t sci_exp = scientific_exponent(num);
2820   size_t max_digits = binary_format<T>::max_digits();
2821   size_t digits = 0;
2822   bigint bigmant;
2823   parse_mantissa(bigmant, num, max_digits, digits);
2824   // can't underflow, since digits is at most max_digits.
2825   int32_t exponent = sci_exp + 1 - int32_t(digits);
2826   if (exponent >= 0) {
2827     return positive_digit_comp<T>(bigmant, exponent);
2828   } else {
2829     return negative_digit_comp<T>(bigmant, am, exponent);
2830   }
2831 }
2832 
2833 } // namespace fast_float
2834 
2835 #endif
2836 
2837 
2838 #ifndef FASTFLOAT_PARSE_NUMBER_H
2839 #define FASTFLOAT_PARSE_NUMBER_H
2840 
2841 
2842 #include <cmath>
2843 #include <cstring>
2844 #include <limits>
2845 #include <system_error>
2846 
2847 namespace fast_float {
2848 
2849 
2850 namespace detail {
2851 /**
2852  * Special case +inf, -inf, nan, infinity, -infinity.
2853  * The case comparisons could be made much faster given that we know that the
2854  * strings a null-free and fixed.
2855  **/
2856 template <typename T>
parse_infnan(const char * first,const char * last,T & value)2857 from_chars_result parse_infnan(const char *first, const char *last, T &value)  noexcept  {
2858   from_chars_result answer;
2859   answer.ptr = first;
2860   answer.ec = std::errc(); // be optimistic
2861   bool minusSign = false;
2862   if (*first == '-') { // assume first < last, so dereference without checks; C++17 20.19.3.(7.1) explicitly forbids '+' here
2863       minusSign = true;
2864       ++first;
2865   }
2866   if (last - first >= 3) {
2867     if (fastfloat_strncasecmp(first, "nan", 3)) {
2868       answer.ptr = (first += 3);
2869       value = minusSign ? -std::numeric_limits<T>::quiet_NaN() : std::numeric_limits<T>::quiet_NaN();
2870       // Check for possible nan(n-char-seq-opt), C++17 20.19.3.7, C11 7.20.1.3.3. At least MSVC produces nan(ind) and nan(snan).
2871       if(first != last && *first == '(') {
2872         for(const char* ptr = first + 1; ptr != last; ++ptr) {
2873           if (*ptr == ')') {
2874             answer.ptr = ptr + 1; // valid nan(n-char-seq-opt)
2875             break;
2876           }
2877           else if(!(('a' <= *ptr && *ptr <= 'z') || ('A' <= *ptr && *ptr <= 'Z') || ('0' <= *ptr && *ptr <= '9') || *ptr == '_'))
2878             break; // forbidden char, not nan(n-char-seq-opt)
2879         }
2880       }
2881       return answer;
2882     }
2883     if (fastfloat_strncasecmp(first, "inf", 3)) {
2884       if ((last - first >= 8) && fastfloat_strncasecmp(first + 3, "inity", 5)) {
2885         answer.ptr = first + 8;
2886       } else {
2887         answer.ptr = first + 3;
2888       }
2889       value = minusSign ? -std::numeric_limits<T>::infinity() : std::numeric_limits<T>::infinity();
2890       return answer;
2891     }
2892   }
2893   answer.ec = std::errc::invalid_argument;
2894   return answer;
2895 }
2896 
2897 } // namespace detail
2898 
2899 template<typename T>
from_chars(const char * first,const char * last,T & value,chars_format fmt)2900 from_chars_result from_chars(const char *first, const char *last,
2901                              T &value, chars_format fmt /*= chars_format::general*/)  noexcept  {
2902   return from_chars_advanced(first, last, value, parse_options{fmt});
2903 }
2904 
2905 template<typename T>
from_chars_advanced(const char * first,const char * last,T & value,parse_options options)2906 from_chars_result from_chars_advanced(const char *first, const char *last,
2907                                       T &value, parse_options options)  noexcept  {
2908 
2909   static_assert (std::is_same<T, double>::value || std::is_same<T, float>::value, "only float and double are supported");
2910 
2911 
2912   from_chars_result answer;
2913   if (first == last) {
2914     answer.ec = std::errc::invalid_argument;
2915     answer.ptr = first;
2916     return answer;
2917   }
2918   parsed_number_string pns = parse_number_string(first, last, options);
2919   if (!pns.valid) {
2920     return detail::parse_infnan(first, last, value);
2921   }
2922   answer.ec = std::errc(); // be optimistic
2923   answer.ptr = pns.lastmatch;
2924   // Next is Clinger's fast path.
2925   if (binary_format<T>::min_exponent_fast_path() <= pns.exponent && pns.exponent <= binary_format<T>::max_exponent_fast_path() && pns.mantissa <=binary_format<T>::max_mantissa_fast_path() && !pns.too_many_digits) {
2926     value = T(pns.mantissa);
2927     if (pns.exponent < 0) { value = value / binary_format<T>::exact_power_of_ten(-pns.exponent); }
2928     else { value = value * binary_format<T>::exact_power_of_ten(pns.exponent); }
2929     if (pns.negative) { value = -value; }
2930     return answer;
2931   }
2932   adjusted_mantissa am = compute_float<binary_format<T>>(pns.exponent, pns.mantissa);
2933   if(pns.too_many_digits && am.power2 >= 0) {
2934     if(am != compute_float<binary_format<T>>(pns.exponent, pns.mantissa + 1)) {
2935       am = compute_error<binary_format<T>>(pns.exponent, pns.mantissa);
2936     }
2937   }
2938   // If we called compute_float<binary_format<T>>(pns.exponent, pns.mantissa) and we have an invalid power (am.power2 < 0),
2939   // then we need to go the long way around again. This is very uncommon.
2940   if(am.power2 < 0) { am = digit_comp<T>(pns, am); }
2941   to_float(pns.negative, am, value);
2942   return answer;
2943 }
2944 
2945 } // namespace fast_float
2946 
2947 #endif
2948