1#ifndef FASTFLOAT_GENERIC_DECIMAL_TO_BINARY_H
2#define FASTFLOAT_GENERIC_DECIMAL_TO_BINARY_H
25inline void trim(decimal &h) {
26 while ((h.num_digits > 0) && (h.digits[h.num_digits - 1] == 0)) {
35 constexpr uint16_t number_of_digits_decimal_left_shift_table[65] = {
36 0x0000, 0x0800, 0x0801, 0x0803, 0x1006, 0x1009, 0x100D, 0x1812, 0x1817,
37 0x181D, 0x2024, 0x202B, 0x2033, 0x203C, 0x2846, 0x2850, 0x285B, 0x3067,
38 0x3073, 0x3080, 0x388E, 0x389C, 0x38AB, 0x38BB, 0x40CC, 0x40DD, 0x40EF,
39 0x4902, 0x4915, 0x4929, 0x513E, 0x5153, 0x5169, 0x5180, 0x5998, 0x59B0,
40 0x59C9, 0x61E3, 0x61FD, 0x6218, 0x6A34, 0x6A50, 0x6A6D, 0x6A8B, 0x72AA,
41 0x72C9, 0x72E9, 0x7B0A, 0x7B2B, 0x7B4D, 0x8370, 0x8393, 0x83B7, 0x83DC,
42 0x8C02, 0x8C28, 0x8C4F, 0x9477, 0x949F, 0x94C8, 0x9CF2, 0x051C, 0x051C,
45 uint32_t x_a = number_of_digits_decimal_left_shift_table[shift];
46 uint32_t x_b = number_of_digits_decimal_left_shift_table[shift + 1];
47 uint32_t num_new_digits = x_a >> 11;
48 uint32_t pow5_a = 0x7FF & x_a;
49 uint32_t pow5_b = 0x7FF & x_b;
51 number_of_digits_decimal_left_shift_table_powers_of_5[0x051C] = {
52 5, 2, 5, 1, 2, 5, 6, 2, 5, 3, 1, 2, 5, 1, 5, 6, 2, 5, 7, 8, 1, 2, 5, 3,
53 9, 0, 6, 2, 5, 1, 9, 5, 3, 1, 2, 5, 9, 7, 6, 5, 6, 2, 5, 4, 8, 8, 2, 8,
54 1, 2, 5, 2, 4, 4, 1, 4, 0, 6, 2, 5, 1, 2, 2, 0, 7, 0, 3, 1, 2, 5, 6, 1,
55 0, 3, 5, 1, 5, 6, 2, 5, 3, 0, 5, 1, 7, 5, 7, 8, 1, 2, 5, 1, 5, 2, 5, 8,
56 7, 8, 9, 0, 6, 2, 5, 7, 6, 2, 9, 3, 9, 4, 5, 3, 1, 2, 5, 3, 8, 1, 4, 6,
57 9, 7, 2, 6, 5, 6, 2, 5, 1, 9, 0, 7, 3, 4, 8, 6, 3, 2, 8, 1, 2, 5, 9, 5,
58 3, 6, 7, 4, 3, 1, 6, 4, 0, 6, 2, 5, 4, 7, 6, 8, 3, 7, 1, 5, 8, 2, 0, 3,
59 1, 2, 5, 2, 3, 8, 4, 1, 8, 5, 7, 9, 1, 0, 1, 5, 6, 2, 5, 1, 1, 9, 2, 0,
60 9, 2, 8, 9, 5, 5, 0, 7, 8, 1, 2, 5, 5, 9, 6, 0, 4, 6, 4, 4, 7, 7, 5, 3,
61 9, 0, 6, 2, 5, 2, 9, 8, 0, 2, 3, 2, 2, 3, 8, 7, 6, 9, 5, 3, 1, 2, 5, 1,
62 4, 9, 0, 1, 1, 6, 1, 1, 9, 3, 8, 4, 7, 6, 5, 6, 2, 5, 7, 4, 5, 0, 5, 8,
63 0, 5, 9, 6, 9, 2, 3, 8, 2, 8, 1, 2, 5, 3, 7, 2, 5, 2, 9, 0, 2, 9, 8, 4,
64 6, 1, 9, 1, 4, 0, 6, 2, 5, 1, 8, 6, 2, 6, 4, 5, 1, 4, 9, 2, 3, 0, 9, 5,
65 7, 0, 3, 1, 2, 5, 9, 3, 1, 3, 2, 2, 5, 7, 4, 6, 1, 5, 4, 7, 8, 5, 1, 5,
66 6, 2, 5, 4, 6, 5, 6, 6, 1, 2, 8, 7, 3, 0, 7, 7, 3, 9, 2, 5, 7, 8, 1, 2,
67 5, 2, 3, 2, 8, 3, 0, 6, 4, 3, 6, 5, 3, 8, 6, 9, 6, 2, 8, 9, 0, 6, 2, 5,
68 1, 1, 6, 4, 1, 5, 3, 2, 1, 8, 2, 6, 9, 3, 4, 8, 1, 4, 4, 5, 3, 1, 2, 5,
69 5, 8, 2, 0, 7, 6, 6, 0, 9, 1, 3, 4, 6, 7, 4, 0, 7, 2, 2, 6, 5, 6, 2, 5,
70 2, 9, 1, 0, 3, 8, 3, 0, 4, 5, 6, 7, 3, 3, 7, 0, 3, 6, 1, 3, 2, 8, 1, 2,
71 5, 1, 4, 5, 5, 1, 9, 1, 5, 2, 2, 8, 3, 6, 6, 8, 5, 1, 8, 0, 6, 6, 4, 0,
72 6, 2, 5, 7, 2, 7, 5, 9, 5, 7, 6, 1, 4, 1, 8, 3, 4, 2, 5, 9, 0, 3, 3, 2,
73 0, 3, 1, 2, 5, 3, 6, 3, 7, 9, 7, 8, 8, 0, 7, 0, 9, 1, 7, 1, 2, 9, 5, 1,
74 6, 6, 0, 1, 5, 6, 2, 5, 1, 8, 1, 8, 9, 8, 9, 4, 0, 3, 5, 4, 5, 8, 5, 6,
75 4, 7, 5, 8, 3, 0, 0, 7, 8, 1, 2, 5, 9, 0, 9, 4, 9, 4, 7, 0, 1, 7, 7, 2,
76 9, 2, 8, 2, 3, 7, 9, 1, 5, 0, 3, 9, 0, 6, 2, 5, 4, 5, 4, 7, 4, 7, 3, 5,
77 0, 8, 8, 6, 4, 6, 4, 1, 1, 8, 9, 5, 7, 5, 1, 9, 5, 3, 1, 2, 5, 2, 2, 7,
78 3, 7, 3, 6, 7, 5, 4, 4, 3, 2, 3, 2, 0, 5, 9, 4, 7, 8, 7, 5, 9, 7, 6, 5,
79 6, 2, 5, 1, 1, 3, 6, 8, 6, 8, 3, 7, 7, 2, 1, 6, 1, 6, 0, 2, 9, 7, 3, 9,
80 3, 7, 9, 8, 8, 2, 8, 1, 2, 5, 5, 6, 8, 4, 3, 4, 1, 8, 8, 6, 0, 8, 0, 8,
81 0, 1, 4, 8, 6, 9, 6, 8, 9, 9, 4, 1, 4, 0, 6, 2, 5, 2, 8, 4, 2, 1, 7, 0,
82 9, 4, 3, 0, 4, 0, 4, 0, 0, 7, 4, 3, 4, 8, 4, 4, 9, 7, 0, 7, 0, 3, 1, 2,
83 5, 1, 4, 2, 1, 0, 8, 5, 4, 7, 1, 5, 2, 0, 2, 0, 0, 3, 7, 1, 7, 4, 2, 2,
84 4, 8, 5, 3, 5, 1, 5, 6, 2, 5, 7, 1, 0, 5, 4, 2, 7, 3, 5, 7, 6, 0, 1, 0,
85 0, 1, 8, 5, 8, 7, 1, 1, 2, 4, 2, 6, 7, 5, 7, 8, 1, 2, 5, 3, 5, 5, 2, 7,
86 1, 3, 6, 7, 8, 8, 0, 0, 5, 0, 0, 9, 2, 9, 3, 5, 5, 6, 2, 1, 3, 3, 7, 8,
87 9, 0, 6, 2, 5, 1, 7, 7, 6, 3, 5, 6, 8, 3, 9, 4, 0, 0, 2, 5, 0, 4, 6, 4,
88 6, 7, 7, 8, 1, 0, 6, 6, 8, 9, 4, 5, 3, 1, 2, 5, 8, 8, 8, 1, 7, 8, 4, 1,
89 9, 7, 0, 0, 1, 2, 5, 2, 3, 2, 3, 3, 8, 9, 0, 5, 3, 3, 4, 4, 7, 2, 6, 5,
90 6, 2, 5, 4, 4, 4, 0, 8, 9, 2, 0, 9, 8, 5, 0, 0, 6, 2, 6, 1, 6, 1, 6, 9,
91 4, 5, 2, 6, 6, 7, 2, 3, 6, 3, 2, 8, 1, 2, 5, 2, 2, 2, 0, 4, 4, 6, 0, 4,
92 9, 2, 5, 0, 3, 1, 3, 0, 8, 0, 8, 4, 7, 2, 6, 3, 3, 3, 6, 1, 8, 1, 6, 4,
93 0, 6, 2, 5, 1, 1, 1, 0, 2, 2, 3, 0, 2, 4, 6, 2, 5, 1, 5, 6, 5, 4, 0, 4,
94 2, 3, 6, 3, 1, 6, 6, 8, 0, 9, 0, 8, 2, 0, 3, 1, 2, 5, 5, 5, 5, 1, 1, 1,
95 5, 1, 2, 3, 1, 2, 5, 7, 8, 2, 7, 0, 2, 1, 1, 8, 1, 5, 8, 3, 4, 0, 4, 5,
96 4, 1, 0, 1, 5, 6, 2, 5, 2, 7, 7, 5, 5, 5, 7, 5, 6, 1, 5, 6, 2, 8, 9, 1,
97 3, 5, 1, 0, 5, 9, 0, 7, 9, 1, 7, 0, 2, 2, 7, 0, 5, 0, 7, 8, 1, 2, 5, 1,
98 3, 8, 7, 7, 7, 8, 7, 8, 0, 7, 8, 1, 4, 4, 5, 6, 7, 5, 5, 2, 9, 5, 3, 9,
99 5, 8, 5, 1, 1, 3, 5, 2, 5, 3, 9, 0, 6, 2, 5, 6, 9, 3, 8, 8, 9, 3, 9, 0,
100 3, 9, 0, 7, 2, 2, 8, 3, 7, 7, 6, 4, 7, 6, 9, 7, 9, 2, 5, 5, 6, 7, 6, 2,
101 6, 9, 5, 3, 1, 2, 5, 3, 4, 6, 9, 4, 4, 6, 9, 5, 1, 9, 5, 3, 6, 1, 4, 1,
102 8, 8, 8, 2, 3, 8, 4, 8, 9, 6, 2, 7, 8, 3, 8, 1, 3, 4, 7, 6, 5, 6, 2, 5,
103 1, 7, 3, 4, 7, 2, 3, 4, 7, 5, 9, 7, 6, 8, 0, 7, 0, 9, 4, 4, 1, 1, 9, 2,
104 4, 4, 8, 1, 3, 9, 1, 9, 0, 6, 7, 3, 8, 2, 8, 1, 2, 5, 8, 6, 7, 3, 6, 1,
105 7, 3, 7, 9, 8, 8, 4, 0, 3, 5, 4, 7, 2, 0, 5, 9, 6, 2, 2, 4, 0, 6, 9, 5,
106 9, 5, 3, 3, 6, 9, 1, 4, 0, 6, 2, 5,
108 const uint8_t *pow5 =
109 &number_of_digits_decimal_left_shift_table_powers_of_5[pow5_a];
111 uint32_t n = pow5_b - pow5_a;
113 if (i >= h.num_digits) {
114 return num_new_digits - 1;
115 }
else if (h.digits[i] == pow5[i]) {
117 }
else if (h.digits[i] < pow5[i]) {
118 return num_new_digits - 1;
120 return num_new_digits;
123 return num_new_digits;
127 if ((h.num_digits == 0) || (h.decimal_point < 0)) {
129 }
else if (h.decimal_point > 18) {
133 uint32_t dp = uint32_t(h.decimal_point);
135 for (uint32_t i = 0; i < dp; i++) {
136 n = (10 * n) + ((i < h.num_digits) ? h.digits[i] : 0);
138 bool round_up =
false;
139 if (dp < h.num_digits) {
140 round_up = h.digits[dp] >= 5;
142 if ((h.digits[dp] == 5) && (dp + 1 == h.num_digits)) {
143 round_up = h.truncated || ((dp > 0) && (1 & h.digits[dp - 1]));
154 if (h.num_digits == 0) {
158 int32_t read_index = int32_t(h.num_digits - 1);
159 uint32_t write_index = h.num_digits - 1 + num_new_digits;
162 while (read_index >= 0) {
163 n += uint64_t(h.digits[read_index]) << shift;
164 uint64_t quotient = n / 10;
165 uint64_t remainder = n - (10 * quotient);
166 if (write_index < max_digits) {
167 h.digits[write_index] = uint8_t(remainder);
168 }
else if (remainder > 0) {
176 uint64_t quotient = n / 10;
177 uint64_t remainder = n - (10 * quotient);
178 if (write_index < max_digits) {
179 h.digits[write_index] = uint8_t(remainder);
180 }
else if (remainder > 0) {
186 h.num_digits += num_new_digits;
187 if (h.num_digits > max_digits) {
188 h.num_digits = max_digits;
190 h.decimal_point += int32_t(num_new_digits);
196 uint32_t read_index = 0;
197 uint32_t write_index = 0;
201 while ((n >> shift) == 0) {
202 if (read_index < h.num_digits) {
203 n = (10 * n) + h.digits[read_index++];
207 while ((n >> shift) == 0) {
214 h.decimal_point -= int32_t(read_index - 1);
215 if (h.decimal_point < -decimal_point_range) {
222 uint64_t mask = (uint64_t(1) << shift) - 1;
223 while (read_index < h.num_digits) {
224 uint8_t new_digit = uint8_t(n >> shift);
225 n = (10 * (n & mask)) + h.digits[read_index++];
226 h.digits[write_index++] = new_digit;
229 uint8_t new_digit = uint8_t(n >> shift);
231 if (write_index < max_digits) {
232 h.digits[write_index++] = new_digit;
233 }
else if (new_digit > 0) {
237 h.num_digits = write_index;
243template <
typename binary>
246 if (d.num_digits == 0) {
260 if(d.decimal_point < -324) {
267 }
else if(d.decimal_point >= 310) {
270 answer.
power2 = binary::infinite_power();
274 constexpr uint32_t max_shift = 60;
275 constexpr uint32_t num_powers = 19;
276 constexpr uint8_t decimal_powers[19] = {
277 0, 3, 6, 9, 13, 16, 19, 23, 26, 29,
278 33, 36, 39, 43, 46, 49, 53, 56, 59,
281 while (d.decimal_point > 0) {
282 uint32_t n = uint32_t(d.decimal_point);
283 uint32_t shift = (n < num_powers) ? decimal_powers[n] : max_shift;
285 if (d.decimal_point < -decimal_point_range) {
291 exp2 += int32_t(shift);
294 while (d.decimal_point <= 0) {
296 if (d.decimal_point == 0) {
297 if (d.digits[0] >= 5) {
300 shift = (d.digits[0] < 2) ? 2 : 1;
302 uint32_t n = uint32_t(-d.decimal_point);
303 shift = (n < num_powers) ? decimal_powers[n] : max_shift;
306 if (d.decimal_point > decimal_point_range) {
308 answer.
power2 = binary::infinite_power();
312 exp2 -= int32_t(shift);
316 constexpr int32_t minimum_exponent = binary::minimum_exponent();
317 while ((minimum_exponent + 1) > exp2) {
318 uint32_t n = uint32_t((minimum_exponent + 1) - exp2);
325 if ((exp2 - minimum_exponent) >= binary::infinite_power()) {
326 answer.
power2 = binary::infinite_power();
331 const int mantissa_size_in_bits = binary::mantissa_explicit_bits() + 1;
337 if(mantissa >= (uint64_t(1) << mantissa_size_in_bits)) {
341 if ((exp2 - minimum_exponent) >= binary::infinite_power()) {
342 answer.
power2 = binary::infinite_power();
347 answer.
power2 = exp2 - binary::minimum_exponent();
348 if(mantissa < (uint64_t(1) << binary::mantissa_explicit_bits())) { answer.
power2--; }
349 answer.
mantissa = mantissa & ((uint64_t(1) << binary::mantissa_explicit_bits()) - 1);
353template <
typename binary>
355 decimal d = parse_decimal(first,
last, options);
356 return compute_float<binary>(d);
CONSTDATA date::last_spec last
uint32_t number_of_digits_decimal_left_shift(const decimal &h, uint32_t shift)
void decimal_left_shift(decimal &h, uint32_t shift)
uint64_t round(decimal &h)
void decimal_right_shift(decimal &h, uint32_t shift)
adjusted_mantissa parse_long_mantissa(const char *first, const char *last, parse_options options)
fastfloat_really_inline adjusted_mantissa compute_float(int64_t q, uint64_t w) noexcept