1 //===-- String to float conversion utils ------------------------*- C++ -*-===//
2 //
3 // Part of the LLVM Project, under the Apache License v2.0 with LLVM Exceptions.
4 // See https://llvm.org/LICENSE.txt for license information.
5 // SPDX-License-Identifier: Apache-2.0 WITH LLVM-exception
6 //
7 //===----------------------------------------------------------------------===//
8
9 #ifndef LIBC_SRC_SUPPORT_STR_TO_FLOAT_H
10 #define LIBC_SRC_SUPPORT_STR_TO_FLOAT_H
11
12 #include "src/__support/CPP/Limits.h"
13 #include "src/__support/CPP/UInt128.h"
14 #include "src/__support/FPUtil/FPBits.h"
15 #include "src/__support/FPUtil/builtin_wrappers.h"
16 #include "src/__support/ctype_utils.h"
17 #include "src/__support/detailed_powers_of_ten.h"
18 #include "src/__support/high_precision_decimal.h"
19 #include "src/__support/str_to_integer.h"
20 #include <errno.h>
21
22 namespace __llvm_libc {
23 namespace internal {
24
leading_zeroes(T inputNumber)25 template <class T> uint32_t inline leading_zeroes(T inputNumber) {
26 constexpr uint32_t BITS_IN_T = sizeof(T) * 8;
27 if (inputNumber == 0) {
28 return BITS_IN_T;
29 }
30 uint32_t cur_guess = BITS_IN_T / 2;
31 uint32_t range_size = BITS_IN_T / 2;
32 // while either shifting by curGuess does not get rid of all of the bits or
33 // shifting by one less also gets rid of all of the bits then we have not
34 // found the first bit.
35 while (((inputNumber >> cur_guess) > 0) ||
36 ((inputNumber >> (cur_guess - 1)) == 0)) {
37 // Binary search for the first set bit
38 range_size /= 2;
39 if (range_size == 0) {
40 break;
41 }
42 if ((inputNumber >> cur_guess) > 0) {
43 cur_guess += range_size;
44 } else {
45 cur_guess -= range_size;
46 }
47 }
48 if (inputNumber >> cur_guess > 0) {
49 cur_guess++;
50 }
51 return BITS_IN_T - cur_guess;
52 }
53
54 template <> uint32_t inline leading_zeroes<uint32_t>(uint32_t inputNumber) {
55 return fputil::safe_clz(inputNumber);
56 }
57
58 template <> uint32_t inline leading_zeroes<uint64_t>(uint64_t inputNumber) {
59 return fputil::safe_clz(inputNumber);
60 }
61
low64(const UInt128 & num)62 static inline uint64_t low64(const UInt128 &num) {
63 return static_cast<uint64_t>(num & 0xffffffffffffffff);
64 }
65
high64(const UInt128 & num)66 static inline uint64_t high64(const UInt128 &num) {
67 return static_cast<uint64_t>(num >> 64);
68 }
69
set_implicit_bit(fputil::FPBits<T> & result)70 template <class T> inline void set_implicit_bit(fputil::FPBits<T> &result) {
71 return;
72 }
73
74 #if defined(SPECIAL_X86_LONG_DOUBLE)
75 template <>
76 inline void set_implicit_bit<long double>(fputil::FPBits<long double> &result) {
77 result.set_implicit_bit(result.get_unbiased_exponent() != 0);
78 }
79 #endif
80
81 // This Eisel-Lemire implementation is based on the algorithm described in the
82 // paper Number Parsing at a Gigabyte per Second, Software: Practice and
83 // Experience 51 (8), 2021 (https://arxiv.org/abs/2101.11408), as well as the
84 // description by Nigel Tao
85 // (https://nigeltao.github.io/blog/2020/eisel-lemire.html) and the golang
86 // implementation, also by Nigel Tao
87 // (https://github.com/golang/go/blob/release-branch.go1.16/src/strconv/eisel_lemire.go#L25)
88 // for some optimizations as well as handling 32 bit floats.
89 template <class T>
90 static inline bool
eisel_lemire(typename fputil::FPBits<T>::UIntType mantissa,int32_t exp10,typename fputil::FPBits<T>::UIntType * outputMantissa,uint32_t * outputExp2)91 eisel_lemire(typename fputil::FPBits<T>::UIntType mantissa, int32_t exp10,
92 typename fputil::FPBits<T>::UIntType *outputMantissa,
93 uint32_t *outputExp2) {
94
95 using BitsType = typename fputil::FPBits<T>::UIntType;
96 constexpr uint32_t BITS_IN_MANTISSA = sizeof(mantissa) * 8;
97
98 if (sizeof(T) > 8) { // This algorithm cannot handle anything longer than a
99 // double, so we skip straight to the fallback.
100 return false;
101 }
102
103 // Exp10 Range
104 if (exp10 < DETAILED_POWERS_OF_TEN_MIN_EXP_10 ||
105 exp10 > DETAILED_POWERS_OF_TEN_MAX_EXP_10) {
106 return false;
107 }
108
109 // Normalization
110 uint32_t clz = leading_zeroes<BitsType>(mantissa);
111 mantissa <<= clz;
112
113 uint32_t exp2 = static_cast<uint32_t>(exp10_to_exp2(exp10)) + BITS_IN_MANTISSA +
114 fputil::FloatProperties<T>::EXPONENT_BIAS - clz;
115
116 // Multiplication
117 const uint64_t *power_of_ten =
118 DETAILED_POWERS_OF_TEN[exp10 - DETAILED_POWERS_OF_TEN_MIN_EXP_10];
119
120 UInt128 first_approx =
121 static_cast<UInt128>(mantissa) * static_cast<UInt128>(power_of_ten[1]);
122
123 // Wider Approximation
124 UInt128 final_approx;
125 // The halfway constant is used to check if the bits that will be shifted away
126 // intially are all 1. For doubles this is 64 (bitstype size) - 52 (final
127 // mantissa size) - 3 (we shift away the last two bits separately for
128 // accuracy, and the most significant bit is ignored.) = 9 bits. Similarly,
129 // it's 6 bits for floats in this case.
130 const uint64_t halfway_constant =
131 (uint64_t(1) << (BITS_IN_MANTISSA -
132 fputil::FloatProperties<T>::MANTISSA_WIDTH - 3)) -
133 1;
134 if ((high64(first_approx) & halfway_constant) == halfway_constant &&
135 low64(first_approx) + mantissa < mantissa) {
136 UInt128 low_bits =
137 static_cast<UInt128>(mantissa) * static_cast<UInt128>(power_of_ten[0]);
138 UInt128 second_approx =
139 first_approx + static_cast<UInt128>(high64(low_bits));
140
141 if ((high64(second_approx) & halfway_constant) == halfway_constant &&
142 low64(second_approx) + 1 == 0 &&
143 low64(low_bits) + mantissa < mantissa) {
144 return false;
145 }
146 final_approx = second_approx;
147 } else {
148 final_approx = first_approx;
149 }
150
151 // Shifting to 54 bits for doubles and 25 bits for floats
152 BitsType msb = static_cast<BitsType>(high64(final_approx) >> (BITS_IN_MANTISSA - 1));
153 BitsType final_mantissa = static_cast<BitsType>(high64(final_approx) >>
154 (msb + BITS_IN_MANTISSA -
155 (fputil::FloatProperties<T>::MANTISSA_WIDTH + 3)));
156 exp2 -= static_cast<uint32_t>(1 ^ msb); // same as !msb
157
158 // Half-way ambiguity
159 if (low64(final_approx) == 0 &&
160 (high64(final_approx) & halfway_constant) == 0 &&
161 (final_mantissa & 3) == 1) {
162 return false;
163 }
164
165 // From 54 to 53 bits for doubles and 25 to 24 bits for floats
166 final_mantissa += final_mantissa & 1;
167 final_mantissa >>= 1;
168 if ((final_mantissa >> (fputil::FloatProperties<T>::MANTISSA_WIDTH + 1)) >
169 0) {
170 final_mantissa >>= 1;
171 ++exp2;
172 }
173
174 // The if block is equivalent to (but has fewer branches than):
175 // if exp2 <= 0 || exp2 >= 0x7FF { etc }
176 if (exp2 - 1 >= (1 << fputil::FloatProperties<T>::EXPONENT_WIDTH) - 2) {
177 return false;
178 }
179
180 *outputMantissa = final_mantissa;
181 *outputExp2 = exp2;
182 return true;
183 }
184
185 #if !defined(LONG_DOUBLE_IS_DOUBLE)
186 template <>
187 inline bool eisel_lemire<long double>(
188 typename fputil::FPBits<long double>::UIntType mantissa, int32_t exp10,
189 typename fputil::FPBits<long double>::UIntType *outputMantissa,
190 uint32_t *outputExp2) {
191 using BitsType = typename fputil::FPBits<long double>::UIntType;
192 constexpr uint32_t BITS_IN_MANTISSA = sizeof(mantissa) * 8;
193
194 // Exp10 Range
195 // This doesn't reach very far into the range for long doubles, since it's
196 // sized for doubles and their 11 exponent bits, and not for long doubles and
197 // their 15 exponent bits (max exponent of ~300 for double vs ~5000 for long
198 // double). This is a known tradeoff, and was made because a proper long
199 // double table would be approximately 16 times larger. This would have
200 // significant memory and storage costs all the time to speed up a relatively
201 // uncommon path. In addition the exp10_to_exp2 function only approximates
202 // multiplying by log(10)/log(2), and that approximation may not be accurate
203 // out to the full long double range.
204 if (exp10 < DETAILED_POWERS_OF_TEN_MIN_EXP_10 ||
205 exp10 > DETAILED_POWERS_OF_TEN_MAX_EXP_10) {
206 return false;
207 }
208
209 // Normalization
210 uint32_t clz = leading_zeroes<BitsType>(mantissa);
211 mantissa <<= clz;
212
213 uint32_t exp2 = static_cast<uint32_t>(exp10_to_exp2(exp10)) + BITS_IN_MANTISSA +
214 fputil::FloatProperties<long double>::EXPONENT_BIAS - clz;
215
216 // Multiplication
217 const uint64_t *power_of_ten =
218 DETAILED_POWERS_OF_TEN[exp10 - DETAILED_POWERS_OF_TEN_MIN_EXP_10];
219
220 // Since the input mantissa is more than 64 bits, we have to multiply with the
221 // full 128 bits of the power of ten to get an approximation with the same
222 // number of significant bits. This means that we only get the one
223 // approximation, and that approximation is 256 bits long.
224 UInt128 approx_upper = static_cast<UInt128>(high64(mantissa)) *
225 static_cast<UInt128>(power_of_ten[1]);
226
227 UInt128 approx_middle = static_cast<UInt128>(high64(mantissa)) *
228 static_cast<UInt128>(power_of_ten[0]) +
229 static_cast<UInt128>(low64(mantissa)) *
230 static_cast<UInt128>(power_of_ten[1]);
231
232 UInt128 approx_lower = static_cast<UInt128>(low64(mantissa)) *
233 static_cast<UInt128>(power_of_ten[0]);
234
235 UInt128 final_approx_lower =
236 approx_lower + (static_cast<UInt128>(low64(approx_middle)) << 64);
237 UInt128 final_approx_upper = approx_upper + high64(approx_middle) +
238 (final_approx_lower < approx_lower ? 1 : 0);
239
240 // The halfway constant is used to check if the bits that will be shifted away
241 // intially are all 1. For 80 bit floats this is 128 (bitstype size) - 64
242 // (final mantissa size) - 3 (we shift away the last two bits separately for
243 // accuracy, and the most significant bit is ignored.) = 61 bits. Similarly,
244 // it's 12 bits for 128 bit floats in this case.
245 constexpr UInt128 HALFWAY_CONSTANT =
246 (UInt128(1) << (BITS_IN_MANTISSA -
247 fputil::FloatProperties<long double>::MANTISSA_WIDTH -
248 3)) -
249 1;
250
251 if ((final_approx_upper & HALFWAY_CONSTANT) == HALFWAY_CONSTANT &&
252 final_approx_lower + mantissa < mantissa) {
253 return false;
254 }
255
256 // Shifting to 65 bits for 80 bit floats and 113 bits for 128 bit floats
257 BitsType msb = final_approx_upper >> (BITS_IN_MANTISSA - 1);
258 BitsType final_mantissa =
259 final_approx_upper >>
260 (msb + BITS_IN_MANTISSA -
261 (fputil::FloatProperties<long double>::MANTISSA_WIDTH + 3));
262 exp2 -= static_cast<uint32_t>(1 ^ msb); // same as !msb
263
264 // Half-way ambiguity
265 if (final_approx_lower == 0 && (final_approx_upper & HALFWAY_CONSTANT) == 0 &&
266 (final_mantissa & 3) == 1) {
267 return false;
268 }
269
270 // From 65 to 64 bits for 80 bit floats and 113 to 112 bits for 128 bit
271 // floats
272 final_mantissa += final_mantissa & 1;
273 final_mantissa >>= 1;
274 if ((final_mantissa >>
275 (fputil::FloatProperties<long double>::MANTISSA_WIDTH + 1)) > 0) {
276 final_mantissa >>= 1;
277 ++exp2;
278 }
279
280 // The if block is equivalent to (but has fewer branches than):
281 // if exp2 <= 0 || exp2 >= MANTISSA_MAX { etc }
282 if (exp2 - 1 >=
283 (1 << fputil::FloatProperties<long double>::EXPONENT_WIDTH) - 2) {
284 return false;
285 }
286
287 *outputMantissa = final_mantissa;
288 *outputExp2 = exp2;
289 return true;
290 }
291 #endif
292
293 // The nth item in POWERS_OF_TWO represents the greatest power of two less than
294 // 10^n. This tells us how much we can safely shift without overshooting.
295 constexpr uint8_t POWERS_OF_TWO[19] = {
296 0, 3, 6, 9, 13, 16, 19, 23, 26, 29, 33, 36, 39, 43, 46, 49, 53, 56, 59,
297 };
298 constexpr int32_t NUM_POWERS_OF_TWO =
299 sizeof(POWERS_OF_TWO) / sizeof(POWERS_OF_TWO[0]);
300
301 // Takes a mantissa and base 10 exponent and converts it into its closest
302 // floating point type T equivalent. This is the fallback algorithm used when
303 // the Eisel-Lemire algorithm fails, it's slower but more accurate. It's based
304 // on the Simple Decimal Conversion algorithm by Nigel Tao, described at this
305 // link: https://nigeltao.github.io/blog/2020/parse-number-f64-simple.html
306 template <class T>
307 static inline void
simple_decimal_conversion(const char * __restrict numStart,typename fputil::FPBits<T>::UIntType * outputMantissa,uint32_t * outputExp2)308 simple_decimal_conversion(const char *__restrict numStart,
309 typename fputil::FPBits<T>::UIntType *outputMantissa,
310 uint32_t *outputExp2) {
311
312 int32_t exp2 = 0;
313 HighPrecisionDecimal hpd = HighPrecisionDecimal(numStart);
314
315 if (hpd.get_num_digits() == 0) {
316 *outputMantissa = 0;
317 *outputExp2 = 0;
318 return;
319 }
320
321 // If the exponent is too large and can't be represented in this size of
322 // float, return inf.
323 if (hpd.get_decimal_point() > 0 &&
324 exp10_to_exp2(hpd.get_decimal_point() - 1) >
325 static_cast<int64_t>(fputil::FloatProperties<T>::EXPONENT_BIAS)) {
326 *outputMantissa = 0;
327 *outputExp2 = fputil::FPBits<T>::MAX_EXPONENT;
328 errno = ERANGE;
329 return;
330 }
331 // If the exponent is too small even for a subnormal, return 0.
332 if (hpd.get_decimal_point() < 0 &&
333 exp10_to_exp2(-hpd.get_decimal_point()) >
334 static_cast<int64_t>(fputil::FloatProperties<T>::EXPONENT_BIAS +
335 fputil::FloatProperties<T>::MANTISSA_WIDTH)) {
336 *outputMantissa = 0;
337 *outputExp2 = 0;
338 errno = ERANGE;
339 return;
340 }
341
342 // Right shift until the number is smaller than 1.
343 while (hpd.get_decimal_point() > 0) {
344 int32_t shift_amount = 0;
345 if (hpd.get_decimal_point() >= NUM_POWERS_OF_TWO) {
346 shift_amount = 60;
347 } else {
348 shift_amount = POWERS_OF_TWO[hpd.get_decimal_point()];
349 }
350 exp2 += shift_amount;
351 hpd.shift(-shift_amount);
352 }
353
354 // Left shift until the number is between 1/2 and 1
355 while (hpd.get_decimal_point() < 0 ||
356 (hpd.get_decimal_point() == 0 && hpd.get_digits()[0] < 5)) {
357 int32_t shift_amount = 0;
358
359 if (-hpd.get_decimal_point() >= NUM_POWERS_OF_TWO) {
360 shift_amount = 60;
361 } else if (hpd.get_decimal_point() != 0) {
362 shift_amount = POWERS_OF_TWO[-hpd.get_decimal_point()];
363 } else { // This handles the case of the number being between .1 and .5
364 shift_amount = 1;
365 }
366 exp2 -= shift_amount;
367 hpd.shift(shift_amount);
368 }
369
370 // Left shift once so that the number is between 1 and 2
371 --exp2;
372 hpd.shift(1);
373
374 // Get the biased exponent
375 exp2 += fputil::FloatProperties<T>::EXPONENT_BIAS;
376
377 // Handle the exponent being too large (and return inf).
378 if (exp2 >= fputil::FPBits<T>::MAX_EXPONENT) {
379 *outputMantissa = 0;
380 *outputExp2 = fputil::FPBits<T>::MAX_EXPONENT;
381 errno = ERANGE;
382 return;
383 }
384
385 // Shift left to fill the mantissa
386 hpd.shift(fputil::FloatProperties<T>::MANTISSA_WIDTH);
387 typename fputil::FPBits<T>::UIntType final_mantissa =
388 hpd.round_to_integer_type<typename fputil::FPBits<T>::UIntType>();
389
390 // Handle subnormals
391 if (exp2 <= 0) {
392 // Shift right until there is a valid exponent
393 while (exp2 < 0) {
394 hpd.shift(-1);
395 ++exp2;
396 }
397 // Shift right one more time to compensate for the left shift to get it
398 // between 1 and 2.
399 hpd.shift(-1);
400 final_mantissa =
401 hpd.round_to_integer_type<typename fputil::FPBits<T>::UIntType>();
402
403 // Check if by shifting right we've caused this to round to a normal number.
404 if ((final_mantissa >> fputil::FloatProperties<T>::MANTISSA_WIDTH) != 0) {
405 ++exp2;
406 }
407 }
408
409 // Check if rounding added a bit, and shift down if that's the case.
410 if (final_mantissa == typename fputil::FPBits<T>::UIntType(2)
411 << fputil::FloatProperties<T>::MANTISSA_WIDTH) {
412 final_mantissa >>= 1;
413 ++exp2;
414
415 // Check if this rounding causes exp2 to go out of range and make the result
416 // INF. If this is the case, then finalMantissa and exp2 are already the
417 // correct values for an INF result.
418 if (exp2 >= fputil::FPBits<T>::MAX_EXPONENT) {
419 errno = ERANGE; // NOLINT
420 }
421 }
422
423 if (exp2 == 0) {
424 errno = ERANGE;
425 }
426
427 *outputMantissa = final_mantissa;
428 *outputExp2 = exp2;
429 }
430
431 // This class is used for templating the constants for Clinger's Fast Path,
432 // described as a method of approximation in
433 // Clinger WD. How to Read Floating Point Numbers Accurately. SIGPLAN Not 1990
434 // Jun;25(6):92–101. https://doi.org/10.1145/93548.93557.
435 // As well as the additions by Gay that extend the useful range by the number of
436 // exact digits stored by the float type, described in
437 // Gay DM, Correctly rounded binary-decimal and decimal-binary conversions;
438 // 1990. AT&T Bell Laboratories Numerical Analysis Manuscript 90-10.
439 template <class T> class ClingerConsts;
440
441 template <> class ClingerConsts<float> {
442 public:
443 static constexpr float POWERS_OF_TEN_ARRAY[] = {1e0, 1e1, 1e2, 1e3, 1e4, 1e5,
444 1e6, 1e7, 1e8, 1e9, 1e10};
445 static constexpr int32_t EXACT_POWERS_OF_TEN = 10;
446 static constexpr int32_t DIGITS_IN_MANTISSA = 7;
447 static constexpr float MAX_EXACT_INT = 16777215.0;
448 };
449
450 template <> class ClingerConsts<double> {
451 public:
452 static constexpr double POWERS_OF_TEN_ARRAY[] = {
453 1e0, 1e1, 1e2, 1e3, 1e4, 1e5, 1e6, 1e7, 1e8, 1e9, 1e10, 1e11,
454 1e12, 1e13, 1e14, 1e15, 1e16, 1e17, 1e18, 1e19, 1e20, 1e21, 1e22};
455 static constexpr int32_t EXACT_POWERS_OF_TEN = 22;
456 static constexpr int32_t DIGITS_IN_MANTISSA = 15;
457 static constexpr double MAX_EXACT_INT = 9007199254740991.0;
458 };
459
460 #if defined(LONG_DOUBLE_IS_DOUBLE)
461 template <> class ClingerConsts<long double> {
462 public:
463 static constexpr long double POWERS_OF_TEN_ARRAY[] = {
464 1e0, 1e1, 1e2, 1e3, 1e4, 1e5, 1e6, 1e7, 1e8, 1e9, 1e10, 1e11,
465 1e12, 1e13, 1e14, 1e15, 1e16, 1e17, 1e18, 1e19, 1e20, 1e21, 1e22};
466 static constexpr int32_t EXACT_POWERS_OF_TEN =
467 ClingerConsts<double>::EXACT_POWERS_OF_TEN;
468 static constexpr int32_t DIGITS_IN_MANTISSA =
469 ClingerConsts<double>::DIGITS_IN_MANTISSA;
470 static constexpr long double MAX_EXACT_INT =
471 ClingerConsts<double>::MAX_EXACT_INT;
472 };
473 #elif defined(SPECIAL_X86_LONG_DOUBLE)
474 template <> class ClingerConsts<long double> {
475 public:
476 static constexpr long double POWERS_OF_TEN_ARRAY[] = {
477 1e0L, 1e1L, 1e2L, 1e3L, 1e4L, 1e5L, 1e6L, 1e7L, 1e8L, 1e9L,
478 1e10L, 1e11L, 1e12L, 1e13L, 1e14L, 1e15L, 1e16L, 1e17L, 1e18L, 1e19L,
479 1e20L, 1e21L, 1e22L, 1e23L, 1e24L, 1e25L, 1e26L, 1e27L};
480 static constexpr int32_t EXACT_POWERS_OF_TEN = 27;
481 static constexpr int32_t DIGITS_IN_MANTISSA = 21;
482 static constexpr long double MAX_EXACT_INT = 18446744073709551615.0L;
483 };
484 #else
485 template <> class ClingerConsts<long double> {
486 public:
487 static constexpr long double POWERS_OF_TEN_ARRAY[] = {
488 1e0L, 1e1L, 1e2L, 1e3L, 1e4L, 1e5L, 1e6L, 1e7L, 1e8L, 1e9L,
489 1e10L, 1e11L, 1e12L, 1e13L, 1e14L, 1e15L, 1e16L, 1e17L, 1e18L, 1e19L,
490 1e20L, 1e21L, 1e22L, 1e23L, 1e24L, 1e25L, 1e26L, 1e27L, 1e28L, 1e29L,
491 1e30L, 1e31L, 1e32L, 1e33L, 1e34L, 1e35L, 1e36L, 1e37L, 1e38L, 1e39L,
492 1e40L, 1e41L, 1e42L, 1e43L, 1e44L, 1e45L, 1e46L, 1e47L, 1e48L};
493 static constexpr int32_t EXACT_POWERS_OF_TEN = 48;
494 static constexpr int32_t DIGITS_IN_MANTISSA = 33;
495 static constexpr long double MAX_EXACT_INT =
496 10384593717069655257060992658440191.0L;
497 };
498 #endif
499
500 // Take an exact mantissa and exponent and attempt to convert it using only
501 // exact floating point arithmetic. This only handles numbers with low
502 // exponents, but handles them quickly. This is an implementation of Clinger's
503 // Fast Path, as described above.
504 template <class T>
505 static inline bool
clinger_fast_path(typename fputil::FPBits<T>::UIntType mantissa,int32_t exp10,typename fputil::FPBits<T>::UIntType * outputMantissa,uint32_t * outputExp2)506 clinger_fast_path(typename fputil::FPBits<T>::UIntType mantissa, int32_t exp10,
507 typename fputil::FPBits<T>::UIntType *outputMantissa,
508 uint32_t *outputExp2) {
509 if (mantissa >> fputil::FloatProperties<T>::MANTISSA_WIDTH > 0) {
510 return false;
511 }
512
513 fputil::FPBits<T> result;
514 T float_mantissa = static_cast<T>(mantissa);
515
516 if (exp10 == 0) {
517 result = fputil::FPBits<T>(float_mantissa);
518 }
519 if (exp10 > 0) {
520 if (exp10 > ClingerConsts<T>::EXACT_POWERS_OF_TEN +
521 ClingerConsts<T>::DIGITS_IN_MANTISSA) {
522 return false;
523 }
524 if (exp10 > ClingerConsts<T>::EXACT_POWERS_OF_TEN) {
525 float_mantissa = float_mantissa *
526 ClingerConsts<T>::POWERS_OF_TEN_ARRAY
527 [exp10 - ClingerConsts<T>::EXACT_POWERS_OF_TEN];
528 exp10 = ClingerConsts<T>::EXACT_POWERS_OF_TEN;
529 }
530 if (float_mantissa > ClingerConsts<T>::MAX_EXACT_INT) {
531 return false;
532 }
533 result = fputil::FPBits<T>(float_mantissa *
534 ClingerConsts<T>::POWERS_OF_TEN_ARRAY[exp10]);
535 } else if (exp10 < 0) {
536 if (-exp10 > ClingerConsts<T>::EXACT_POWERS_OF_TEN) {
537 return false;
538 }
539 result = fputil::FPBits<T>(float_mantissa /
540 ClingerConsts<T>::POWERS_OF_TEN_ARRAY[-exp10]);
541 }
542 *outputMantissa = result.get_mantissa();
543 *outputExp2 = result.get_unbiased_exponent();
544 return true;
545 }
546
547 // Takes a mantissa and base 10 exponent and converts it into its closest
548 // floating point type T equivalient. First we try the Eisel-Lemire algorithm,
549 // then if that fails then we fall back to a more accurate algorithm for
550 // accuracy. The resulting mantissa and exponent are placed in outputMantissa
551 // and outputExp2.
552 template <class T>
553 static inline void
decimal_exp_to_float(typename fputil::FPBits<T>::UIntType mantissa,int32_t exp10,const char * __restrict numStart,bool truncated,typename fputil::FPBits<T>::UIntType * outputMantissa,uint32_t * outputExp2)554 decimal_exp_to_float(typename fputil::FPBits<T>::UIntType mantissa,
555 int32_t exp10, const char *__restrict numStart,
556 bool truncated,
557 typename fputil::FPBits<T>::UIntType *outputMantissa,
558 uint32_t *outputExp2) {
559 // If the exponent is too large and can't be represented in this size of
560 // float, return inf. These bounds are very loose, but are mostly serving as a
561 // first pass. Some close numbers getting through is okay.
562 if (exp10 >
563 static_cast<int64_t>(fputil::FloatProperties<T>::EXPONENT_BIAS) / 3) {
564 *outputMantissa = 0;
565 *outputExp2 = fputil::FPBits<T>::MAX_EXPONENT;
566 errno = ERANGE;
567 return;
568 }
569 // If the exponent is too small even for a subnormal, return 0.
570 if (exp10 < 0 &&
571 -static_cast<int64_t>(exp10) >
572 static_cast<int64_t>(fputil::FloatProperties<T>::EXPONENT_BIAS +
573 fputil::FloatProperties<T>::MANTISSA_WIDTH) /
574 2) {
575 *outputMantissa = 0;
576 *outputExp2 = 0;
577 errno = ERANGE;
578 return;
579 }
580
581 if (!truncated) {
582 if (clinger_fast_path<T>(mantissa, exp10, outputMantissa, outputExp2)) {
583 return;
584 }
585 }
586
587 // Try Eisel-Lemire
588 if (eisel_lemire<T>(mantissa, exp10, outputMantissa, outputExp2)) {
589 if (!truncated) {
590 return;
591 }
592 // If the mantissa is truncated, then the result may be off by the LSB, so
593 // check if rounding the mantissa up changes the result. If not, then it's
594 // safe, else use the fallback.
595 typename fputil::FPBits<T>::UIntType first_mantissa = *outputMantissa;
596 uint32_t first_exp2 = *outputExp2;
597 if (eisel_lemire<T>(mantissa + 1, exp10, outputMantissa, outputExp2)) {
598 if (*outputMantissa == first_mantissa && *outputExp2 == first_exp2) {
599 return;
600 }
601 }
602 }
603
604 simple_decimal_conversion<T>(numStart, outputMantissa, outputExp2);
605
606 return;
607 }
608
609 // Takes a mantissa and base 2 exponent and converts it into its closest
610 // floating point type T equivalient. Since the exponent is already in the right
611 // form, this is mostly just shifting and rounding. This is used for hexadecimal
612 // numbers since a base 16 exponent multiplied by 4 is the base 2 exponent.
613 template <class T>
614 static inline void
binary_exp_to_float(typename fputil::FPBits<T>::UIntType mantissa,int32_t exp2,bool truncated,typename fputil::FPBits<T>::UIntType * outputMantissa,uint32_t * outputExp2)615 binary_exp_to_float(typename fputil::FPBits<T>::UIntType mantissa, int32_t exp2,
616 bool truncated,
617 typename fputil::FPBits<T>::UIntType *outputMantissa,
618 uint32_t *outputExp2) {
619 using BitsType = typename fputil::FPBits<T>::UIntType;
620
621 // This is the number of leading zeroes a properly normalized float of type T
622 // should have.
623 constexpr int32_t NUMBITS = sizeof(BitsType) * 8;
624 constexpr int32_t INF_EXP =
625 (1 << fputil::FloatProperties<T>::EXPONENT_WIDTH) - 1;
626
627 // Normalization step 1: Bring the leading bit to the highest bit of BitsType.
628 uint32_t amount_to_shift_left = leading_zeroes<BitsType>(mantissa);
629 mantissa <<= amount_to_shift_left;
630
631 // Keep exp2 representing the exponent of the lowest bit of BitsType.
632 exp2 -= amount_to_shift_left;
633
634 // biasedExponent represents the biased exponent of the most significant bit.
635 int32_t biased_exponent =
636 exp2 + NUMBITS + fputil::FPBits<T>::EXPONENT_BIAS - 1;
637
638 // Handle numbers that're too large and get squashed to inf
639 if (biased_exponent >= INF_EXP) {
640 // This indicates an overflow, so we make the result INF and set errno.
641 *outputExp2 = (1 << fputil::FloatProperties<T>::EXPONENT_WIDTH) - 1;
642 *outputMantissa = 0;
643 errno = ERANGE;
644 return;
645 }
646
647 uint32_t amount_to_shift_right =
648 NUMBITS - fputil::FloatProperties<T>::MANTISSA_WIDTH - 1;
649
650 // Handle subnormals.
651 if (biased_exponent <= 0) {
652 amount_to_shift_right += 1 - biased_exponent;
653 biased_exponent = 0;
654
655 if (amount_to_shift_right > NUMBITS) {
656 // Return 0 if the exponent is too small.
657 *outputMantissa = 0;
658 *outputExp2 = 0;
659 errno = ERANGE;
660 return;
661 }
662 }
663
664 BitsType round_bit_mask = BitsType(1) << (amount_to_shift_right - 1);
665 BitsType sticky_mask = round_bit_mask - 1;
666 bool round_bit = mantissa & round_bit_mask;
667 bool sticky_bit = static_cast<bool>(mantissa & sticky_mask) || truncated;
668
669 if (amount_to_shift_right < NUMBITS) {
670 // Shift the mantissa and clear the implicit bit.
671 mantissa >>= amount_to_shift_right;
672 mantissa &= fputil::FloatProperties<T>::MANTISSA_MASK;
673 } else {
674 mantissa = 0;
675 }
676 bool least_significant_bit = mantissa & BitsType(1);
677 // Perform rounding-to-nearest, tie-to-even.
678 if (round_bit && (least_significant_bit || sticky_bit)) {
679 ++mantissa;
680 }
681
682 if (mantissa > fputil::FloatProperties<T>::MANTISSA_MASK) {
683 // Rounding causes the exponent to increase.
684 ++biased_exponent;
685
686 if (biased_exponent == INF_EXP) {
687 errno = ERANGE;
688 }
689 }
690
691 if (biased_exponent == 0) {
692 errno = ERANGE;
693 }
694
695 *outputMantissa = mantissa & fputil::FloatProperties<T>::MANTISSA_MASK;
696 *outputExp2 = biased_exponent;
697 }
698
699 // checks if the next 4 characters of the string pointer are the start of a
700 // hexadecimal floating point number. Does not advance the string pointer.
is_float_hex_start(const char * __restrict src,const char decimalPoint)701 static inline bool is_float_hex_start(const char *__restrict src,
702 const char decimalPoint) {
703 if (!(*src == '0' && (*(src + 1) | 32) == 'x')) {
704 return false;
705 }
706 if (*(src + 2) == decimalPoint) {
707 return isalnum(*(src + 3)) && b36_char_to_int(*(src + 3)) < 16;
708 } else {
709 return isalnum(*(src + 2)) && b36_char_to_int(*(src + 2)) < 16;
710 }
711 }
712
713 // Takes the start of a string representing a decimal float, as well as the
714 // local decimalPoint. It returns if it suceeded in parsing any digits, and if
715 // the return value is true then the outputs are pointer to the end of the
716 // number, and the mantissa and exponent for the closest float T representation.
717 // If the return value is false, then it is assumed that there is no number
718 // here.
719 template <class T>
720 static inline bool
decimal_string_to_float(const char * __restrict src,const char DECIMAL_POINT,char ** __restrict strEnd,typename fputil::FPBits<T>::UIntType * outputMantissa,uint32_t * outputExponent)721 decimal_string_to_float(const char *__restrict src, const char DECIMAL_POINT,
722 char **__restrict strEnd,
723 typename fputil::FPBits<T>::UIntType *outputMantissa,
724 uint32_t *outputExponent) {
725 using BitsType = typename fputil::FPBits<T>::UIntType;
726 constexpr uint32_t BASE = 10;
727 constexpr char EXPONENT_MARKER = 'e';
728
729 const char *__restrict num_start = src;
730 bool truncated = false;
731 bool seen_digit = false;
732 bool after_decimal = false;
733 BitsType mantissa = 0;
734 int32_t exponent = 0;
735
736 // The goal for the first step of parsing is to convert the number in src to
737 // the format mantissa * (base ^ exponent)
738
739 // The loop fills the mantissa with as many digits as it can hold
740 const BitsType bitstype_max_div_by_base =
741 __llvm_libc::cpp::NumericLimits<BitsType>::max() / BASE;
742 while (true) {
743 if (isdigit(*src)) {
744 uint32_t digit = *src - '0';
745 seen_digit = true;
746
747 if (mantissa < bitstype_max_div_by_base) {
748 mantissa = (mantissa * BASE) + digit;
749 if (after_decimal) {
750 --exponent;
751 }
752 } else {
753 if (digit > 0)
754 truncated = true;
755 if (!after_decimal)
756 ++exponent;
757 }
758
759 ++src;
760 continue;
761 }
762 if (*src == DECIMAL_POINT) {
763 if (after_decimal) {
764 break; // this means that *src points to a second decimal point, ending
765 // the number.
766 }
767 after_decimal = true;
768 ++src;
769 continue;
770 }
771 // The character is neither a digit nor a decimal point.
772 break;
773 }
774
775 if (!seen_digit)
776 return false;
777
778 if ((*src | 32) == EXPONENT_MARKER) {
779 if (*(src + 1) == '+' || *(src + 1) == '-' || isdigit(*(src + 1))) {
780 ++src;
781 char *temp_str_end;
782 int32_t add_to_exponent = strtointeger<int32_t>(src, &temp_str_end, 10);
783 if (add_to_exponent > 100000)
784 add_to_exponent = 100000;
785 else if (add_to_exponent < -100000)
786 add_to_exponent = -100000;
787
788 src = temp_str_end;
789 exponent += add_to_exponent;
790 }
791 }
792
793 *strEnd = const_cast<char *>(src);
794 if (mantissa == 0) { // if we have a 0, then also 0 the exponent.
795 *outputMantissa = 0;
796 *outputExponent = 0;
797 } else {
798 decimal_exp_to_float<T>(mantissa, exponent, num_start, truncated,
799 outputMantissa, outputExponent);
800 }
801 return true;
802 }
803
804 // Takes the start of a string representing a hexadecimal float, as well as the
805 // local decimal point. It returns if it suceeded in parsing any digits, and if
806 // the return value is true then the outputs are pointer to the end of the
807 // number, and the mantissa and exponent for the closest float T representation.
808 // If the return value is false, then it is assumed that there is no number
809 // here.
810 template <class T>
hexadecimal_string_to_float(const char * __restrict src,const char DECIMAL_POINT,char ** __restrict strEnd,typename fputil::FPBits<T>::UIntType * outputMantissa,uint32_t * outputExponent)811 static inline bool hexadecimal_string_to_float(
812 const char *__restrict src, const char DECIMAL_POINT,
813 char **__restrict strEnd,
814 typename fputil::FPBits<T>::UIntType *outputMantissa,
815 uint32_t *outputExponent) {
816 using BitsType = typename fputil::FPBits<T>::UIntType;
817 constexpr uint32_t BASE = 16;
818 constexpr char EXPONENT_MARKER = 'p';
819
820 bool truncated = false;
821 bool seen_digit = false;
822 bool after_decimal = false;
823 BitsType mantissa = 0;
824 int32_t exponent = 0;
825
826 // The goal for the first step of parsing is to convert the number in src to
827 // the format mantissa * (base ^ exponent)
828
829 // The loop fills the mantissa with as many digits as it can hold
830 const BitsType bitstype_max_div_by_base =
831 __llvm_libc::cpp::NumericLimits<BitsType>::max() / BASE;
832 while (true) {
833 if (isalnum(*src)) {
834 uint32_t digit = b36_char_to_int(*src);
835 if (digit < BASE)
836 seen_digit = true;
837 else
838 break;
839
840 if (mantissa < bitstype_max_div_by_base) {
841 mantissa = (mantissa * BASE) + digit;
842 if (after_decimal)
843 --exponent;
844 } else {
845 if (digit > 0)
846 truncated = true;
847 if (!after_decimal)
848 ++exponent;
849 }
850 ++src;
851 continue;
852 }
853 if (*src == DECIMAL_POINT) {
854 if (after_decimal) {
855 break; // this means that *src points to a second decimal point, ending
856 // the number.
857 }
858 after_decimal = true;
859 ++src;
860 continue;
861 }
862 // The character is neither a hexadecimal digit nor a decimal point.
863 break;
864 }
865
866 if (!seen_digit)
867 return false;
868
869 // Convert the exponent from having a base of 16 to having a base of 2.
870 exponent *= 4;
871
872 if ((*src | 32) == EXPONENT_MARKER) {
873 if (*(src + 1) == '+' || *(src + 1) == '-' || isdigit(*(src + 1))) {
874 ++src;
875 char *temp_str_end;
876 int32_t add_to_exponent = strtointeger<int32_t>(src, &temp_str_end, 10);
877 if (add_to_exponent > 100000)
878 add_to_exponent = 100000;
879 else if (add_to_exponent < -100000)
880 add_to_exponent = -100000;
881 src = temp_str_end;
882 exponent += add_to_exponent;
883 }
884 }
885 *strEnd = const_cast<char *>(src);
886 if (mantissa == 0) { // if we have a 0, then also 0 the exponent.
887 *outputMantissa = 0;
888 *outputExponent = 0;
889 } else {
890 binary_exp_to_float<T>(mantissa, exponent, truncated, outputMantissa,
891 outputExponent);
892 }
893 return true;
894 }
895
896 // Takes a pointer to a string and a pointer to a string pointer. This function
897 // is used as the backend for all of the string to float functions.
898 template <class T>
strtofloatingpoint(const char * __restrict src,char ** __restrict strEnd)899 static inline T strtofloatingpoint(const char *__restrict src,
900 char **__restrict strEnd) {
901 using BitsType = typename fputil::FPBits<T>::UIntType;
902 fputil::FPBits<T> result = fputil::FPBits<T>();
903 const char *original_src = src;
904 bool seen_digit = false;
905 src = first_non_whitespace(src);
906
907 if (*src == '+' || *src == '-') {
908 if (*src == '-') {
909 result.set_sign(true);
910 }
911 ++src;
912 }
913
914 static constexpr char DECIMAL_POINT = '.';
915 static const char *inf_string = "infinity";
916 static const char *nan_string = "nan";
917
918 // bool truncated = false;
919
920 if (isdigit(*src) || *src == DECIMAL_POINT) { // regular number
921 int base = 10;
922 if (is_float_hex_start(src, DECIMAL_POINT)) {
923 base = 16;
924 src += 2;
925 seen_digit = true;
926 }
927 char *new_str_end = nullptr;
928
929 BitsType output_mantissa = 0;
930 uint32_t output_exponent = 0;
931 if (base == 16) {
932 seen_digit = hexadecimal_string_to_float<T>(
933 src, DECIMAL_POINT, &new_str_end, &output_mantissa, &output_exponent);
934 } else { // base is 10
935 seen_digit = decimal_string_to_float<T>(
936 src, DECIMAL_POINT, &new_str_end, &output_mantissa, &output_exponent);
937 }
938
939 if (seen_digit) {
940 src += new_str_end - src;
941 result.set_mantissa(output_mantissa);
942 result.set_unbiased_exponent(output_exponent);
943 }
944 } else if ((*src | 32) == 'n') { // NaN
945 if ((src[1] | 32) == nan_string[1] && (src[2] | 32) == nan_string[2]) {
946 seen_digit = true;
947 src += 3;
948 BitsType nan_mantissa = 0;
949 // this handles the case of `NaN(n-character-sequence)`, where the
950 // n-character-sequence is made of 0 or more letters and numbers in any
951 // order.
952 if (*src == '(') {
953 const char *left_paren = src;
954 ++src;
955 while (isalnum(*src))
956 ++src;
957 if (*src == ')') {
958 ++src;
959 char *temp_src = 0;
960 if (isdigit(*(left_paren + 1))) {
961 // This is to prevent errors when BitsType is larger than 64 bits,
962 // since strtointeger only supports up to 64 bits. This is actually
963 // more than is required by the specification, which says for the
964 // input type "NAN(n-char-sequence)" that "the meaning of
965 // the n-char sequence is implementation-defined."
966 nan_mantissa = static_cast<BitsType>(
967 strtointeger<uint64_t>(left_paren + 1, &temp_src, 0));
968 if (*temp_src != ')')
969 nan_mantissa = 0;
970 }
971 } else
972 src = left_paren;
973 }
974 nan_mantissa |= fputil::FloatProperties<T>::QUIET_NAN_MASK;
975 if (result.get_sign()) {
976 result = fputil::FPBits<T>(result.build_nan(nan_mantissa));
977 result.set_sign(true);
978 } else {
979 result.set_sign(false);
980 result = fputil::FPBits<T>(result.build_nan(nan_mantissa));
981 }
982 }
983 } else if ((*src | 32) == 'i') { // INF
984 if ((src[1] | 32) == inf_string[1] && (src[2] | 32) == inf_string[2]) {
985 seen_digit = true;
986 if (result.get_sign())
987 result = result.neg_inf();
988 else
989 result = result.inf();
990 if ((src[3] | 32) == inf_string[3] && (src[4] | 32) == inf_string[4] &&
991 (src[5] | 32) == inf_string[5] && (src[6] | 32) == inf_string[6] &&
992 (src[7] | 32) == inf_string[7]) {
993 // if the string is "INFINITY" then strEnd needs to be set to src + 8.
994 src += 8;
995 } else {
996 src += 3;
997 }
998 }
999 }
1000 if (!seen_digit) { // If there is nothing to actually parse, then return 0.
1001 if (strEnd != nullptr)
1002 *strEnd = const_cast<char *>(original_src);
1003 return T(0);
1004 }
1005
1006 if (strEnd != nullptr)
1007 *strEnd = const_cast<char *>(src);
1008
1009 // This function only does something if T is long double and the platform uses
1010 // special 80 bit long doubles. Otherwise it should be inlined out.
1011 set_implicit_bit<T>(result);
1012
1013 return T(result);
1014 }
1015
1016 } // namespace internal
1017 } // namespace __llvm_libc
1018
1019 #endif // LIBC_SRC_SUPPORT_STR_TO_FLOAT_H
1020