| 1 | #ifndef SIMDJSON_INTERNAL_NUMBERPARSING_TABLES_H |
| 2 | #define SIMDJSON_INTERNAL_NUMBERPARSING_TABLES_H |
| 3 | |
| 4 | #include "simdjson/base.h" |
| 5 | |
| 6 | namespace simdjson { |
| 7 | namespace internal { |
| 8 | /** |
| 9 | * The smallest non-zero float (binary64) is 2^-1074. |
| 10 | * We take as input numbers of the form w x 10^q where w < 2^64. |
| 11 | * We have that w * 10^-343 < 2^(64-344) 5^-343 < 2^-1076. |
| 12 | * However, we have that |
| 13 | * (2^64-1) * 10^-342 = (2^64-1) * 2^-342 * 5^-342 > 2^-1074. |
| 14 | * Thus it is possible for a number of the form w * 10^-342 where |
| 15 | * w is a 64-bit value to be a non-zero floating-point number. |
| 16 | ********* |
| 17 | * Any number of form w * 10^309 where w>= 1 is going to be |
| 18 | * infinite in binary64 so we never need to worry about powers |
| 19 | * of 5 greater than 308. |
| 20 | */ |
| 21 | constexpr int smallest_power = -342; |
| 22 | constexpr int largest_power = 308; |
| 23 | |
| 24 | /** |
| 25 | * Represents a 128-bit value. |
| 26 | * low: least significant 64 bits. |
| 27 | * high: most significant 64 bits. |
| 28 | */ |
| 29 | struct value128 { |
| 30 | uint64_t low; |
| 31 | uint64_t high; |
| 32 | }; |
| 33 | |
| 34 | |
| 35 | // Precomputed powers of ten from 10^0 to 10^22. These |
| 36 | // can be represented exactly using the double type. |
| 37 | extern SIMDJSON_DLLIMPORTEXPORT const double power_of_ten[]; |
| 38 | |
| 39 | |
| 40 | /** |
| 41 | * When mapping numbers from decimal to binary, |
| 42 | * we go from w * 10^q to m * 2^p but we have |
| 43 | * 10^q = 5^q * 2^q, so effectively |
| 44 | * we are trying to match |
| 45 | * w * 2^q * 5^q to m * 2^p. Thus the powers of two |
| 46 | * are not a concern since they can be represented |
| 47 | * exactly using the binary notation, only the powers of five |
| 48 | * affect the binary significand. |
| 49 | */ |
| 50 | |
| 51 | |
| 52 | // The truncated powers of five from 5^-342 all the way to 5^308 |
| 53 | // The mantissa is truncated to 128 bits, and |
| 54 | // never rounded up. Uses about 10KB. |
| 55 | extern SIMDJSON_DLLIMPORTEXPORT const uint64_t power_of_five_128[]; |
| 56 | } // namespace internal |
| 57 | } // namespace simdjson |
| 58 | |
| 59 | #endif // SIMDJSON_INTERNAL_NUMBERPARSING_TABLES_H |
| 60 | |