Audacity 3.2.0
fast_float.h
Go to the documentation of this file.
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
43namespace fast_float {
45 scientific = 1<<0,
46 fixed = 1<<2,
47 hex = 1<<3,
49};
50
51
53 const char *ptr;
54 std::errc ec;
55};
56
59 char dot = '.')
60 : format(fmt), decimal_point(dot) {}
61
66};
67
87template<typename T>
88from_chars_result from_chars(const char *first, const char *last,
89 T &value, chars_format fmt = chars_format::general) noexcept;
90
94template<typename T>
95from_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
190namespace fast_float {
191
192// Compares two ASCII strings in a case insensitive manner.
193inline 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
207template <typename T>
208struct span {
209 const T* ptr;
210 size_t length;
211 span(const T* _ptr, size_t _length) : ptr(_ptr), length(_length) {}
212 span() : ptr(nullptr), length(0) {}
213
214 constexpr size_t len() const noexcept {
215 return length;
216 }
217
218 const T& operator[](size_t index) const noexcept {
220 return ptr[index];
221 }
222};
223
224struct value128 {
225 uint64_t low;
226 uint64_t high;
227 value128(uint64_t _low, uint64_t _high) : low(_low), high(_high) {}
228 value128() : low(0), high(0) {}
229};
230
231/* result might be undefined when input_num is zero */
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
259fastfloat_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__)
265fastfloat_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
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
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.
314constexpr static int32_t invalid_am_bias = -0x8000;
315
316constexpr 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};
319constexpr static float powers_of_ten_float[] = {1e0, 1e1, 1e2, 1e3, 1e4, 1e5,
320 1e6, 1e7, 1e8, 1e9, 1e10};
321
322template <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
338template <> inline constexpr int binary_format<double>::mantissa_explicit_bits() {
339 return 52;
340}
341template <> inline constexpr int binary_format<float>::mantissa_explicit_bits() {
342 return 23;
343}
344
345template <> inline constexpr int binary_format<double>::max_exponent_round_to_even() {
346 return 23;
347}
348
349template <> inline constexpr int binary_format<float>::max_exponent_round_to_even() {
350 return 10;
351}
352
353template <> inline constexpr int binary_format<double>::min_exponent_round_to_even() {
354 return -4;
355}
356
357template <> inline constexpr int binary_format<float>::min_exponent_round_to_even() {
358 return -17;
359}
360
361template <> inline constexpr int binary_format<double>::minimum_exponent() {
362 return -1023;
363}
364template <> inline constexpr int binary_format<float>::minimum_exponent() {
365 return -127;
366}
367
368template <> inline constexpr int binary_format<double>::infinite_power() {
369 return 0x7FF;
370}
371template <> inline constexpr int binary_format<float>::infinite_power() {
372 return 0xFF;
373}
374
375template <> inline constexpr int binary_format<double>::sign_index() { return 63; }
376template <> inline constexpr int binary_format<float>::sign_index() { return 31; }
377
378template <> 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}
385template <> 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
393template <> inline constexpr int binary_format<double>::max_exponent_fast_path() {
394 return 22;
395}
396template <> inline constexpr int binary_format<float>::max_exponent_fast_path() {
397 return 10;
398}
399
400template <> inline constexpr uint64_t binary_format<double>::max_mantissa_fast_path() {
401 return uint64_t(2) << mantissa_explicit_bits();
402}
403template <> inline constexpr uint64_t binary_format<float>::max_mantissa_fast_path() {
404 return uint64_t(2) << mantissa_explicit_bits();
405}
406
407template <>
408inline constexpr double binary_format<double>::exact_power_of_ten(int64_t power) {
410}
411template <>
412inline constexpr float binary_format<float>::exact_power_of_ten(int64_t power) {
413
415}
416
417
418template <>
420 return 308;
421}
422template <>
424 return 38;
425}
426
427template <>
429 return -342;
430}
431template <>
433 return -65;
434}
435
436template <> inline constexpr size_t binary_format<double>::max_digits() {
437 return 769;
438}
439template <> inline constexpr size_t binary_format<float>::max_digits() {
440 return 114;
441}
442
443template<typename T>
444fastfloat_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
475namespace fast_float {
476
477// Next function can be micro-optimized, but compilers are entirely
478// able to optimize it well.
479fastfloat_really_inline bool is_integer(char c) noexcept { return c >= '0' && c <= '9'; }
480
481fastfloat_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
492fastfloat_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
502fastfloat_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
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
521fastfloat_really_inline uint32_t parse_eight_digits_unrolled(const char *chars) noexcept {
523}
524
525// credit @aqrit
527 return !((((val + 0x4646464646464646) | (val - 0x3030303030303030)) &
528 0x8080808080808080));
529}
530
533}
534
536
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.
552parsed_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
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
703namespace fast_float {
704
729template <class unused = void>
731
735// Powers of five from 5^-342 all the way to 5^308 rounded toward one.
737};
738
739template <class unused>
740const 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,};
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
1409namespace 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//
1415template <int bit_precision>
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
1438namespace detail {
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.
1461template <typename binary>
1463adjusted_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.
1474template <typename binary>
1476adjusted_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.
1488template <typename binary>
1490adjusted_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
1602namespace 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
1612typedef uint64_t limb;
1613constexpr size_t limb_bits = 64;
1614#else
1615#define FASTFLOAT_32BIT_LIMB
1616typedef uint32_t limb;
1617constexpr size_t limb_bits = 32;
1618#endif
1619
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.
1626constexpr size_t bigint_bits = 4000;
1628
1629// vector-like type that is allocated on the stack. the entire
1630// buffer is pre-allocated, and only the length changes.
1631template <uint16_t size>
1632struct stackvec {
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.
1646 }
1647
1648 limb& operator[](size_t index) noexcept {
1650 return data[index];
1651 }
1652 const limb& operator[](size_t index) const noexcept {
1654 return data[index];
1655 }
1656 // index from the end of the container
1657 const limb& rindex(size_t index) const noexcept {
1659 size_t rindex = length - index - 1;
1660 return data[rindex];
1661 }
1662
1663 // set the length, without bounds checking.
1664 void set_len(size_t len) noexcept {
1665 length = uint16_t(len);
1666 }
1667 constexpr size_t len() const noexcept {
1668 return length;
1669 }
1670 constexpr bool is_empty() const noexcept {
1671 return length == 0;
1672 }
1673 constexpr size_t capacity() const noexcept {
1674 return size;
1675 }
1676 // append item to vector, without bounds checking
1677 void push_unchecked(limb value) noexcept {
1678 data[length] = value;
1679 length++;
1680 }
1681 // append item to vector, returning if item was added
1682 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
1691 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
1697 bool try_extend(limb_span s) noexcept {
1698 if (len() + s.len() <= capacity()) {
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.
1708 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.
1720 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.
1731 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.
1741 void normalize() noexcept {
1742 while (len() > 0 && rindex(0) == 0) {
1743 length--;
1744 }
1745 }
1746};
1747
1749uint64_t empty_hi64(bool& truncated) noexcept {
1750 truncated = false;
1751 return 0;
1752}
1753
1755uint64_t uint64_hi64(uint64_t r0, bool& truncated) noexcept {
1756 truncated = false;
1757 int shl = leading_zeroes(r0);
1758 return r0 << shl;
1759}
1760
1762uint64_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
1775uint64_t uint32_hi64(uint32_t r0, bool& truncated) noexcept {
1776 return uint64_hi64(r0, truncated);
1777}
1778
1780uint64_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
1787uint64_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.
1799limb 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.
1818limb 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
1844template <uint16_t size>
1845inline 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.
1861template <uint16_t size>
1863 return small_add_from(vec, y, 0);
1864}
1865
1866// multiply bigint by scalar value.
1867template <uint16_t size>
1868inline 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
1881template <uint16_t size>
1882bool 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.
1911template <uint16_t size>
1913 return large_add_from(x, y, 0);
1914}
1915
1916// grade-school multiplication algorithm
1917template <uint16_t size>
1918bool 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
1945template <uint16_t size>
1946bool 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.
1959struct bigint {
1960 // storage of the limbs, in little-endian order.
1962
1963 bigint(): vec() {}
1964 bigint(const bigint &) = delete;
1965 bigint &operator=(const bigint &) = delete;
1966 bigint(bigint &&) = delete;
1967 bigint &operator=(bigint &&other) = delete;
1968
1969 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.
1981 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.
2013 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.
2034 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.
2060 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.
2081 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) {
2089 }
2090 return true;
2091 }
2092
2093 // get the number of leading zeros in the bigint.
2094 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.
2109 int bit_length() const noexcept {
2110 int lz = ctlz();
2111 return int(limb_bits * vec.len()) - lz;
2112 }
2113
2114 bool mul(limb y) noexcept {
2115 return small_mul(vec, y);
2116 }
2117
2118 bool add(limb y) noexcept {
2119 return small_add(vec, y);
2120 }
2121
2122 // multiply as if by 2 raised to a power.
2123 bool pow2(uint32_t exp) noexcept {
2124 return shl(exp);
2125 }
2126
2127 // multiply as if by 5 raised to a power.
2128 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.
2173 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
2193namespace fast_float {
2194
2195// Next function can be micro-optimized, but compilers are entirely
2196// able to optimize it well.
2197fastfloat_really_inline bool is_integer(char c) noexcept { return c >= '0' && c <= '9'; }
2198
2199fastfloat_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
2210fastfloat_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
2220fastfloat_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
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
2239fastfloat_really_inline uint32_t parse_eight_digits_unrolled(const char *chars) noexcept {
2241}
2242
2243// credit @aqrit
2244fastfloat_really_inline bool is_made_of_eight_digits_fast(uint64_t val) noexcept {
2245 return !((((val + 0x4646464646464646) | (val - 0x3030303030303030)) &
2246 0x8080808080808080));
2247}
2248
2249fastfloat_really_inline bool is_made_of_eight_digits_fast(const char *chars) noexcept {
2251}
2252
2253typedef span<const char> byte_span;
2254
2255struct 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.
2270parsed_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
2425namespace fast_float {
2426
2427// 1e0 to 1e19
2428constexpr 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.
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.
2457template <typename T>
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.
2501template <typename T>
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.
2511template <typename T, typename callback>
2512fastfloat_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()) {
2536 am.mantissa = 0;
2537 }
2538}
2539
2540template <typename callback>
2542void 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
2571fastfloat_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
2580fastfloat_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.
2599fastfloat_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
2619 return is_truncated(s.ptr, s.ptr + s.len());
2620}
2621
2623void 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
2631void 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
2639void add_native(bigint& big, limb power, limb value) noexcept {
2640 big.mul(power);
2641 big.add(value);
2642}
2643
2644fastfloat_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
2652inline 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
2731template <typename T>
2732inline 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);
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.
2754template <typename T>
2755inline 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);
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.
2814template <typename T>
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
2847namespace fast_float {
2848
2849
2850namespace detail {
2856template <typename T>
2857from_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
2899template<typename T>
2900from_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
2905template<typename T>
2906from_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
int min(int a, int b)
#define _(s)
Definition: Internat.h:73
#define FASTFLOAT_ASSERT(x)
Definition: fast_float.h:179
#define FASTFLOAT_DEBUG_ASSERT(x)
Definition: fast_float.h:184
#define FASTFLOAT_TRY(x)
Definition: fast_float.h:188
#define fastfloat_really_inline
Definition: fast_float.h:175
from_chars_result parse_infnan(const char *first, const char *last, T &value) noexcept
Definition: fast_float.h:2857
constexpr fastfloat_really_inline int32_t power(int32_t q) noexcept
Definition: fast_float.h:1454
from_chars_result from_chars(const char *first, const char *last, T &value, chars_format fmt=chars_format::general) noexcept
Definition: fast_float.h:2900
fastfloat_really_inline adjusted_mantissa to_extended_halfway(T value) noexcept
Definition: fast_float.h:2502
fastfloat_really_inline limb scalar_add(limb x, limb y, bool &overflow) noexcept
Definition: fast_float.h:1799
fastfloat_really_inline void round_down(adjusted_mantissa &am, int32_t shift) noexcept
Definition: fast_float.h:2571
fastfloat_really_inline uint64_t uint32_hi64(uint32_t r0, bool &truncated) noexcept
Definition: fast_float.h:1775
fastfloat_really_inline void parse_one_digit(const char *&p, limb &value, size_t &counter, size_t &count) noexcept
Definition: fast_float.h:2631
fastfloat_really_inline void to_float(bool negative, adjusted_mantissa am, T &value)
Definition: fast_float.h:444
fastfloat_really_inline limb scalar_mul(limb x, limb y, limb &carry) noexcept
Definition: fast_float.h:1818
fastfloat_really_inline uint64_t empty_hi64(bool &truncated) noexcept
Definition: fast_float.h:1749
fastfloat_really_inline uint32_t parse_eight_digits_unrolled(uint64_t val)
Definition: fast_float.h:511
fastfloat_really_inline int leading_zeroes(uint64_t input_num)
Definition: fast_float.h:232
fastfloat_really_inline uint64_t byteswap(uint64_t val)
Definition: fast_float.h:481
constexpr size_t bigint_bits
Definition: fast_float.h:1626
bool long_mul(stackvec< size > &x, limb_span y) noexcept
Definition: fast_float.h:1918
constexpr size_t limb_bits
Definition: fast_float.h:1617
fastfloat_really_inline int32_t scientific_exponent(parsed_number_string &num) noexcept
Definition: fast_float.h:2438
bool large_add_from(stackvec< size > &x, limb_span y, size_t start) noexcept
Definition: fast_float.h:1882
static constexpr int32_t invalid_am_bias
Definition: fast_float.h:314
bool small_add_from(stackvec< size > &vec, limb y, size_t start) noexcept
Definition: fast_float.h:1845
fastfloat_really_inline void parse_eight_digits(const char *&p, limb &value, size_t &counter, size_t &count) noexcept
Definition: fast_float.h:2623
fastfloat_really_inline value128 compute_product_approximation(int64_t q, uint64_t w)
Definition: fast_float.h:1417
adjusted_mantissa digit_comp(parsed_number_string &num, adjusted_mantissa am) noexcept
Definition: fast_float.h:2815
fastfloat_really_inline void skip_zeros(const char *&first, const char *last) noexcept
Definition: fast_float.h:2580
bool large_mul(stackvec< size > &x, limb_span y) noexcept
Definition: fast_float.h:1946
span< const char > byte_span
Definition: fast_float.h:535
bool small_mul(stackvec< size > &vec, limb y) noexcept
Definition: fast_float.h:1868
constexpr size_t bigint_limbs
Definition: fast_float.h:1627
fastfloat_really_inline void write_u64(uint8_t *chars, uint64_t val)
Definition: fast_float.h:502
fastfloat_really_inline adjusted_mantissa compute_error(int64_t q, uint64_t w) noexcept
Definition: fast_float.h:1476
fastfloat_really_inline parsed_number_string parse_number_string(const char *p, const char *pend, parse_options options) noexcept
Definition: fast_float.h:552
from_chars_result from_chars_advanced(const char *first, const char *last, T &value, parse_options options) noexcept
Definition: fast_float.h:2906
fastfloat_really_inline uint64_t read_u64(const char *chars)
Definition: fast_float.h:492
fastfloat_really_inline void round_nearest_tie_even(adjusted_mantissa &am, int32_t shift, callback cb) noexcept
Definition: fast_float.h:2542
fastfloat_really_inline adjusted_mantissa compute_float(int64_t q, uint64_t w) noexcept
Definition: fast_float.h:1490
fastfloat_really_inline bool is_truncated(const char *first, const char *last) noexcept
Definition: fast_float.h:2599
bool fastfloat_strncasecmp(const char *input1, const char *input2, size_t length)
Definition: fast_float.h:193
span< limb > limb_span
Definition: fast_float.h:1620
static constexpr float powers_of_ten_float[]
Definition: fast_float.h:319
adjusted_mantissa negative_digit_comp(bigint &bigmant, adjusted_mantissa am, int32_t exponent) noexcept
Definition: fast_float.h:2755
fastfloat_really_inline adjusted_mantissa to_extended(T value) noexcept
Definition: fast_float.h:2458
fastfloat_really_inline value128 full_multiplication(uint64_t a, uint64_t b)
Definition: fast_float.h:282
fastfloat_really_inline uint64_t uint64_hi64(uint64_t r0, bool &truncated) noexcept
Definition: fast_float.h:1755
fastfloat_really_inline bool is_integer(char c) noexcept
Definition: fast_float.h:479
void parse_mantissa(bigint &result, parsed_number_string &num, size_t max_digits, size_t &digits) noexcept
Definition: fast_float.h:2652
fastfloat_really_inline bool small_add(stackvec< size > &vec, limb y) noexcept
Definition: fast_float.h:1862
fastfloat_really_inline void round(adjusted_mantissa &am, callback cb) noexcept
Definition: fast_float.h:2512
fastfloat_really_inline void round_up_bigint(bigint &big, size_t &count) noexcept
Definition: fast_float.h:2644
static constexpr double powers_of_ten_double[]
Definition: fast_float.h:316
fastfloat_really_inline bool is_made_of_eight_digits_fast(uint64_t val) noexcept
Definition: fast_float.h:526
fastfloat_really_inline adjusted_mantissa compute_error_scaled(int64_t q, uint64_t w, int lz) noexcept
Definition: fast_float.h:1463
static constexpr uint64_t powers_of_ten_uint64[]
Definition: fast_float.h:2428
uint32_t limb
Definition: fast_float.h:1616
fastfloat_really_inline void add_native(bigint &big, limb power, limb value) noexcept
Definition: fast_float.h:2639
adjusted_mantissa positive_digit_comp(bigint &bigmant, int32_t exponent) noexcept
Definition: fast_float.h:2732
bool operator==(const adjusted_mantissa &o) const
Definition: fast_float.h:305
bool operator!=(const adjusted_mantissa &o) const
Definition: fast_float.h:308
stackvec< bigint_limbs > vec
Definition: fast_float.h:1961
uint64_t hi64(bool &truncated) const noexcept
Definition: fast_float.h:1981
bool shl_limbs(size_t n) noexcept
Definition: fast_float.h:2060
int ctlz() const noexcept
Definition: fast_float.h:2094
bool add(limb y) noexcept
Definition: fast_float.h:2118
bool shl_bits(size_t n) noexcept
Definition: fast_float.h:2034
bigint & operator=(const bigint &)=delete
bool pow2(uint32_t exp) noexcept
Definition: fast_float.h:2123
bool pow10(uint32_t exp) noexcept
Definition: fast_float.h:2173
bool pow5(uint32_t exp) noexcept
Definition: fast_float.h:2128
bool mul(limb y) noexcept
Definition: fast_float.h:2114
bigint(uint64_t value)
Definition: fast_float.h:1969
bigint(bigint &&)=delete
bool shl(size_t n) noexcept
Definition: fast_float.h:2081
bigint(const bigint &)=delete
bigint & operator=(bigint &&other)=delete
int bit_length() const noexcept
Definition: fast_float.h:2109
int compare(const bigint &other) const noexcept
Definition: fast_float.h:2013
static constexpr int mantissa_explicit_bits()
static constexpr int min_exponent_round_to_even()
static constexpr int max_exponent_round_to_even()
static constexpr uint64_t max_mantissa_fast_path()
static constexpr int largest_power_of_ten()
static constexpr int max_exponent_fast_path()
static constexpr int sign_index()
static constexpr size_t max_digits()
static constexpr T exact_power_of_ten(int64_t power)
static constexpr int smallest_power_of_ten()
static constexpr int infinite_power()
static constexpr int min_exponent_fast_path()
static constexpr int minimum_exponent()
constexpr parse_options(chars_format fmt=chars_format::general, char dot='.')
Definition: fast_float.h:58
static constexpr int smallest_power_of_five
Definition: fast_float.h:732
static constexpr int largest_power_of_five
Definition: fast_float.h:733
static const uint64_t power_of_five_128[number_of_entries]
Definition: fast_float.h:736
static constexpr int number_of_entries
Definition: fast_float.h:734
const T * ptr
Definition: fast_float.h:209
const T & operator[](size_t index) const noexcept
Definition: fast_float.h:218
constexpr size_t len() const noexcept
Definition: fast_float.h:214
span(const T *_ptr, size_t _length)
Definition: fast_float.h:211
void resize_unchecked(size_t new_len, limb value) noexcept
Definition: fast_float.h:1708
bool nonzero(size_t index) const noexcept
Definition: fast_float.h:1731
limb & operator[](size_t index) noexcept
Definition: fast_float.h:1648
constexpr size_t capacity() const noexcept
Definition: fast_float.h:1673
bool try_push(limb value) noexcept
Definition: fast_float.h:1682
constexpr size_t len() const noexcept
Definition: fast_float.h:1667
constexpr bool is_empty() const noexcept
Definition: fast_float.h:1670
stackvec(stackvec &&)=delete
void set_len(size_t len) noexcept
Definition: fast_float.h:1664
const limb & operator[](size_t index) const noexcept
Definition: fast_float.h:1652
bool try_extend(limb_span s) noexcept
Definition: fast_float.h:1697
void extend_unchecked(limb_span s) noexcept
Definition: fast_float.h:1691
stackvec & operator=(const stackvec &)=delete
stackvec(const stackvec &)=delete
void push_unchecked(limb value) noexcept
Definition: fast_float.h:1677
bool try_resize(size_t new_len, limb value) noexcept
Definition: fast_float.h:1720
stackvec & operator=(stackvec &&other)=delete
stackvec(limb_span s)
Definition: fast_float.h:1644
const limb & rindex(size_t index) const noexcept
Definition: fast_float.h:1657
void normalize() noexcept
Definition: fast_float.h:1741
value128(uint64_t _low, uint64_t _high)
Definition: fast_float.h:227