/src/abseil-cpp/absl/strings/charconv.cc
Line | Count | Source (jump to first uncovered line) |
1 | | // Copyright 2018 The Abseil Authors. |
2 | | // |
3 | | // Licensed under the Apache License, Version 2.0 (the "License"); |
4 | | // you may not use this file except in compliance with the License. |
5 | | // You may obtain a copy of the License at |
6 | | // |
7 | | // https://www.apache.org/licenses/LICENSE-2.0 |
8 | | // |
9 | | // Unless required by applicable law or agreed to in writing, software |
10 | | // distributed under the License is distributed on an "AS IS" BASIS, |
11 | | // WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. |
12 | | // See the License for the specific language governing permissions and |
13 | | // limitations under the License. |
14 | | |
15 | | #include "absl/strings/charconv.h" |
16 | | |
17 | | #include <algorithm> |
18 | | #include <cassert> |
19 | | #include <cstddef> |
20 | | #include <cstdint> |
21 | | #include <limits> |
22 | | #include <system_error> // NOLINT(build/c++11) |
23 | | |
24 | | #include "absl/base/casts.h" |
25 | | #include "absl/base/config.h" |
26 | | #include "absl/base/nullability.h" |
27 | | #include "absl/numeric/bits.h" |
28 | | #include "absl/numeric/int128.h" |
29 | | #include "absl/strings/internal/charconv_bigint.h" |
30 | | #include "absl/strings/internal/charconv_parse.h" |
31 | | |
32 | | // The macro ABSL_BIT_PACK_FLOATS is defined on x86-64, where IEEE floating |
33 | | // point numbers have the same endianness in memory as a bitfield struct |
34 | | // containing the corresponding parts. |
35 | | // |
36 | | // When set, we replace calls to ldexp() with manual bit packing, which is |
37 | | // faster and is unaffected by floating point environment. |
38 | | #ifdef ABSL_BIT_PACK_FLOATS |
39 | | #error ABSL_BIT_PACK_FLOATS cannot be directly set |
40 | | #elif defined(__x86_64__) || defined(_M_X64) |
41 | | #define ABSL_BIT_PACK_FLOATS 1 |
42 | | #endif |
43 | | |
44 | | // A note about subnormals: |
45 | | // |
46 | | // The code below talks about "normals" and "subnormals". A normal IEEE float |
47 | | // has a fixed-width mantissa and power of two exponent. For example, a normal |
48 | | // `double` has a 53-bit mantissa. Because the high bit is always 1, it is not |
49 | | // stored in the representation. The implicit bit buys an extra bit of |
50 | | // resolution in the datatype. |
51 | | // |
52 | | // The downside of this scheme is that there is a large gap between DBL_MIN and |
53 | | // zero. (Large, at least, relative to the different between DBL_MIN and the |
54 | | // next representable number). This gap is softened by the "subnormal" numbers, |
55 | | // which have the same power-of-two exponent as DBL_MIN, but no implicit 53rd |
56 | | // bit. An all-bits-zero exponent in the encoding represents subnormals. (Zero |
57 | | // is represented as a subnormal with an all-bits-zero mantissa.) |
58 | | // |
59 | | // The code below, in calculations, represents the mantissa as a uint64_t. The |
60 | | // end result normally has the 53rd bit set. It represents subnormals by using |
61 | | // narrower mantissas. |
62 | | |
63 | | namespace absl { |
64 | | ABSL_NAMESPACE_BEGIN |
65 | | namespace { |
66 | | |
67 | | template <typename FloatType> |
68 | | struct FloatTraits; |
69 | | |
70 | | template <> |
71 | | struct FloatTraits<double> { |
72 | | using mantissa_t = uint64_t; |
73 | | |
74 | | // The number of bits in the given float type. |
75 | | static constexpr int kTargetBits = 64; |
76 | | |
77 | | // The number of exponent bits in the given float type. |
78 | | static constexpr int kTargetExponentBits = 11; |
79 | | |
80 | | // The number of mantissa bits in the given float type. This includes the |
81 | | // implied high bit. |
82 | | static constexpr int kTargetMantissaBits = 53; |
83 | | |
84 | | // The largest supported IEEE exponent, in our integral mantissa |
85 | | // representation. |
86 | | // |
87 | | // If `m` is the largest possible int kTargetMantissaBits bits wide, then |
88 | | // m * 2**kMaxExponent is exactly equal to DBL_MAX. |
89 | | static constexpr int kMaxExponent = 971; |
90 | | |
91 | | // The smallest supported IEEE normal exponent, in our integral mantissa |
92 | | // representation. |
93 | | // |
94 | | // If `m` is the smallest possible int kTargetMantissaBits bits wide, then |
95 | | // m * 2**kMinNormalExponent is exactly equal to DBL_MIN. |
96 | | static constexpr int kMinNormalExponent = -1074; |
97 | | |
98 | | // The IEEE exponent bias. It equals ((1 << (kTargetExponentBits - 1)) - 1). |
99 | | static constexpr int kExponentBias = 1023; |
100 | | |
101 | | // The Eisel-Lemire "Shifting to 54/25 Bits" adjustment. It equals (63 - 1 - |
102 | | // kTargetMantissaBits). |
103 | | static constexpr int kEiselLemireShift = 9; |
104 | | |
105 | | // The Eisel-Lemire high64_mask. It equals ((1 << kEiselLemireShift) - 1). |
106 | | static constexpr uint64_t kEiselLemireMask = uint64_t{0x1FF}; |
107 | | |
108 | | // The smallest negative integer N (smallest negative means furthest from |
109 | | // zero) such that parsing 9999999999999999999eN, with 19 nines, is still |
110 | | // positive. Parsing a smaller (more negative) N will produce zero. |
111 | | // |
112 | | // Adjusting the decimal point and exponent, without adjusting the value, |
113 | | // 9999999999999999999eN equals 9.999999999999999999eM where M = N + 18. |
114 | | // |
115 | | // 9999999999999999999, with 19 nines but no decimal point, is the largest |
116 | | // "repeated nines" integer that fits in a uint64_t. |
117 | | static constexpr int kEiselLemireMinInclusiveExp10 = -324 - 18; |
118 | | |
119 | | // The smallest positive integer N such that parsing 1eN produces infinity. |
120 | | // Parsing a smaller N will produce something finite. |
121 | | static constexpr int kEiselLemireMaxExclusiveExp10 = 309; |
122 | | |
123 | 1.35k | static double MakeNan(absl::Nonnull<const char*> tagp) { |
124 | 1.35k | #if ABSL_HAVE_BUILTIN(__builtin_nan) |
125 | | // Use __builtin_nan() if available since it has a fix for |
126 | | // https://bugs.llvm.org/show_bug.cgi?id=37778 |
127 | | // std::nan may use the glibc implementation. |
128 | 1.35k | return __builtin_nan(tagp); |
129 | | #else |
130 | | // Support nan no matter which namespace it's in. Some platforms |
131 | | // incorrectly don't put it in namespace std. |
132 | | using namespace std; // NOLINT |
133 | | return nan(tagp); |
134 | | #endif |
135 | 1.35k | } |
136 | | |
137 | | // Builds a nonzero floating point number out of the provided parts. |
138 | | // |
139 | | // This is intended to do the same operation as ldexp(mantissa, exponent), |
140 | | // but using purely integer math, to avoid -ffastmath and floating |
141 | | // point environment issues. Using type punning is also faster. We fall back |
142 | | // to ldexp on a per-platform basis for portability. |
143 | | // |
144 | | // `exponent` must be between kMinNormalExponent and kMaxExponent. |
145 | | // |
146 | | // `mantissa` must either be exactly kTargetMantissaBits wide, in which case |
147 | | // a normal value is made, or it must be less narrow than that, in which case |
148 | | // `exponent` must be exactly kMinNormalExponent, and a subnormal value is |
149 | | // made. |
150 | 1.47M | static double Make(mantissa_t mantissa, int exponent, bool sign) { |
151 | | #ifndef ABSL_BIT_PACK_FLOATS |
152 | | // Support ldexp no matter which namespace it's in. Some platforms |
153 | | // incorrectly don't put it in namespace std. |
154 | | using namespace std; // NOLINT |
155 | | return sign ? -ldexp(mantissa, exponent) : ldexp(mantissa, exponent); |
156 | | #else |
157 | 1.47M | constexpr uint64_t kMantissaMask = |
158 | 1.47M | (uint64_t{1} << (kTargetMantissaBits - 1)) - 1; |
159 | 1.47M | uint64_t dbl = static_cast<uint64_t>(sign) << 63; |
160 | 1.47M | if (mantissa > kMantissaMask) { |
161 | | // Normal value. |
162 | | // Adjust by 1023 for the exponent representation bias, and an additional |
163 | | // 52 due to the implied decimal point in the IEEE mantissa |
164 | | // representation. |
165 | 1.47M | dbl += static_cast<uint64_t>(exponent + 1023 + kTargetMantissaBits - 1) |
166 | 1.47M | << 52; |
167 | 1.47M | mantissa &= kMantissaMask; |
168 | 1.47M | } else { |
169 | | // subnormal value |
170 | 2.62k | assert(exponent == kMinNormalExponent); |
171 | 2.62k | } |
172 | 1.47M | dbl += mantissa; |
173 | 1.47M | return absl::bit_cast<double>(dbl); |
174 | 1.47M | #endif // ABSL_BIT_PACK_FLOATS |
175 | 1.47M | } |
176 | | }; |
177 | | |
178 | | // Specialization of floating point traits for the `float` type. See the |
179 | | // FloatTraits<double> specialization above for meaning of each of the following |
180 | | // members and methods. |
181 | | template <> |
182 | | struct FloatTraits<float> { |
183 | | using mantissa_t = uint32_t; |
184 | | |
185 | | static constexpr int kTargetBits = 32; |
186 | | static constexpr int kTargetExponentBits = 8; |
187 | | static constexpr int kTargetMantissaBits = 24; |
188 | | static constexpr int kMaxExponent = 104; |
189 | | static constexpr int kMinNormalExponent = -149; |
190 | | static constexpr int kExponentBias = 127; |
191 | | static constexpr int kEiselLemireShift = 38; |
192 | | static constexpr uint64_t kEiselLemireMask = uint64_t{0x3FFFFFFFFF}; |
193 | | static constexpr int kEiselLemireMinInclusiveExp10 = -46 - 18; |
194 | | static constexpr int kEiselLemireMaxExclusiveExp10 = 39; |
195 | | |
196 | 0 | static float MakeNan(absl::Nonnull<const char*> tagp) { |
197 | 0 | #if ABSL_HAVE_BUILTIN(__builtin_nanf) |
198 | | // Use __builtin_nanf() if available since it has a fix for |
199 | | // https://bugs.llvm.org/show_bug.cgi?id=37778 |
200 | | // std::nanf may use the glibc implementation. |
201 | 0 | return __builtin_nanf(tagp); |
202 | | #else |
203 | | // Support nanf no matter which namespace it's in. Some platforms |
204 | | // incorrectly don't put it in namespace std. |
205 | | using namespace std; // NOLINT |
206 | | return std::nanf(tagp); |
207 | | #endif |
208 | 0 | } |
209 | | |
210 | 0 | static float Make(mantissa_t mantissa, int exponent, bool sign) { |
211 | | #ifndef ABSL_BIT_PACK_FLOATS |
212 | | // Support ldexpf no matter which namespace it's in. Some platforms |
213 | | // incorrectly don't put it in namespace std. |
214 | | using namespace std; // NOLINT |
215 | | return sign ? -ldexpf(mantissa, exponent) : ldexpf(mantissa, exponent); |
216 | | #else |
217 | 0 | constexpr uint32_t kMantissaMask = |
218 | 0 | (uint32_t{1} << (kTargetMantissaBits - 1)) - 1; |
219 | 0 | uint32_t flt = static_cast<uint32_t>(sign) << 31; |
220 | 0 | if (mantissa > kMantissaMask) { |
221 | | // Normal value. |
222 | | // Adjust by 127 for the exponent representation bias, and an additional |
223 | | // 23 due to the implied decimal point in the IEEE mantissa |
224 | | // representation. |
225 | 0 | flt += static_cast<uint32_t>(exponent + 127 + kTargetMantissaBits - 1) |
226 | 0 | << 23; |
227 | 0 | mantissa &= kMantissaMask; |
228 | 0 | } else { |
229 | | // subnormal value |
230 | 0 | assert(exponent == kMinNormalExponent); |
231 | 0 | } |
232 | 0 | flt += mantissa; |
233 | 0 | return absl::bit_cast<float>(flt); |
234 | 0 | #endif // ABSL_BIT_PACK_FLOATS |
235 | 0 | } |
236 | | }; |
237 | | |
238 | | // Decimal-to-binary conversions require coercing powers of 10 into a mantissa |
239 | | // and a power of 2. The two helper functions Power10Mantissa(n) and |
240 | | // Power10Exponent(n) perform this task. Together, these represent a hand- |
241 | | // rolled floating point value which is equal to or just less than 10**n. |
242 | | // |
243 | | // The return values satisfy two range guarantees: |
244 | | // |
245 | | // Power10Mantissa(n) * 2**Power10Exponent(n) <= 10**n |
246 | | // < (Power10Mantissa(n) + 1) * 2**Power10Exponent(n) |
247 | | // |
248 | | // 2**63 <= Power10Mantissa(n) < 2**64. |
249 | | // |
250 | | // See the "Table of powers of 10" comment below for a "1e60" example. |
251 | | // |
252 | | // Lookups into the power-of-10 table must first check the Power10Overflow() and |
253 | | // Power10Underflow() functions, to avoid out-of-bounds table access. |
254 | | // |
255 | | // Indexes into these tables are biased by -kPower10TableMinInclusive. Valid |
256 | | // indexes range from kPower10TableMinInclusive to kPower10TableMaxExclusive. |
257 | | extern const uint64_t kPower10MantissaHighTable[]; // High 64 of 128 bits. |
258 | | extern const uint64_t kPower10MantissaLowTable[]; // Low 64 of 128 bits. |
259 | | |
260 | | // The smallest (inclusive) allowed value for use with the Power10Mantissa() |
261 | | // and Power10Exponent() functions below. (If a smaller exponent is needed in |
262 | | // calculations, the end result is guaranteed to underflow.) |
263 | | constexpr int kPower10TableMinInclusive = -342; |
264 | | |
265 | | // The largest (exclusive) allowed value for use with the Power10Mantissa() and |
266 | | // Power10Exponent() functions below. (If a larger-or-equal exponent is needed |
267 | | // in calculations, the end result is guaranteed to overflow.) |
268 | | constexpr int kPower10TableMaxExclusive = 309; |
269 | | |
270 | 1.47M | uint64_t Power10Mantissa(int n) { |
271 | 1.47M | return kPower10MantissaHighTable[n - kPower10TableMinInclusive]; |
272 | 1.47M | } |
273 | | |
274 | 1.47M | int Power10Exponent(int n) { |
275 | | // The 217706 etc magic numbers encode the results as a formula instead of a |
276 | | // table. Their equivalence (over the kPower10TableMinInclusive .. |
277 | | // kPower10TableMaxExclusive range) is confirmed by |
278 | | // https://github.com/google/wuffs/blob/315b2e52625ebd7b02d8fac13e3cd85ea374fb80/script/print-mpb-powers-of-10.go |
279 | 1.47M | return (217706 * n >> 16) - 63; |
280 | 1.47M | } |
281 | | |
282 | | // Returns true if n is large enough that 10**n always results in an IEEE |
283 | | // overflow. |
284 | 1.47M | bool Power10Overflow(int n) { return n >= kPower10TableMaxExclusive; } |
285 | | |
286 | | // Returns true if n is small enough that 10**n times a ParsedFloat mantissa |
287 | | // always results in an IEEE underflow. |
288 | 1.47M | bool Power10Underflow(int n) { return n < kPower10TableMinInclusive; } |
289 | | |
290 | | // Returns true if Power10Mantissa(n) * 2**Power10Exponent(n) is exactly equal |
291 | | // to 10**n numerically. Put another way, this returns true if there is no |
292 | | // truncation error in Power10Mantissa(n). |
293 | 1.46M | bool Power10Exact(int n) { return n >= 0 && n <= 27; } |
294 | | |
295 | | // Sentinel exponent values for representing numbers too large or too close to |
296 | | // zero to represent in a double. |
297 | | constexpr int kOverflow = 99999; |
298 | | constexpr int kUnderflow = -99999; |
299 | | |
300 | | // Struct representing the calculated conversion result of a positive (nonzero) |
301 | | // floating point number. |
302 | | // |
303 | | // The calculated number is mantissa * 2**exponent (mantissa is treated as an |
304 | | // integer.) `mantissa` is chosen to be the correct width for the IEEE float |
305 | | // representation being calculated. (`mantissa` will always have the same bit |
306 | | // width for normal values, and narrower bit widths for subnormals.) |
307 | | // |
308 | | // If the result of conversion was an underflow or overflow, exponent is set |
309 | | // to kUnderflow or kOverflow. |
310 | | struct CalculatedFloat { |
311 | | uint64_t mantissa = 0; |
312 | | int exponent = 0; |
313 | | }; |
314 | | |
315 | | // Returns the bit width of the given uint128. (Equivalently, returns 128 |
316 | | // minus the number of leading zero bits.) |
317 | 1.47M | int BitWidth(uint128 value) { |
318 | 1.47M | if (Uint128High64(value) == 0) { |
319 | | // This static_cast is only needed when using a std::bit_width() |
320 | | // implementation that does not have the fix for LWG 3656 applied. |
321 | 839 | return static_cast<int>(bit_width(Uint128Low64(value))); |
322 | 839 | } |
323 | 1.47M | return 128 - countl_zero(Uint128High64(value)); |
324 | 1.47M | } |
325 | | |
326 | | // Calculates how far to the right a mantissa needs to be shifted to create a |
327 | | // properly adjusted mantissa for an IEEE floating point number. |
328 | | // |
329 | | // `mantissa_width` is the bit width of the mantissa to be shifted, and |
330 | | // `binary_exponent` is the exponent of the number before the shift. |
331 | | // |
332 | | // This accounts for subnormal values, and will return a larger-than-normal |
333 | | // shift if binary_exponent would otherwise be too low. |
334 | | template <typename FloatType> |
335 | 1.47M | int NormalizedShiftSize(int mantissa_width, int binary_exponent) { |
336 | 1.47M | const int normal_shift = |
337 | 1.47M | mantissa_width - FloatTraits<FloatType>::kTargetMantissaBits; |
338 | 1.47M | const int minimum_shift = |
339 | 1.47M | FloatTraits<FloatType>::kMinNormalExponent - binary_exponent; |
340 | 1.47M | return std::max(normal_shift, minimum_shift); |
341 | 1.47M | } charconv.cc:int absl::(anonymous namespace)::NormalizedShiftSize<double>(int, int) Line | Count | Source | 335 | 1.47M | int NormalizedShiftSize(int mantissa_width, int binary_exponent) { | 336 | 1.47M | const int normal_shift = | 337 | 1.47M | mantissa_width - FloatTraits<FloatType>::kTargetMantissaBits; | 338 | 1.47M | const int minimum_shift = | 339 | 1.47M | FloatTraits<FloatType>::kMinNormalExponent - binary_exponent; | 340 | 1.47M | return std::max(normal_shift, minimum_shift); | 341 | 1.47M | } |
Unexecuted instantiation: charconv.cc:int absl::(anonymous namespace)::NormalizedShiftSize<float>(int, int) |
342 | | |
343 | | // Right shifts a uint128 so that it has the requested bit width. (The |
344 | | // resulting value will have 128 - bit_width leading zeroes.) The initial |
345 | | // `value` must be wider than the requested bit width. |
346 | | // |
347 | | // Returns the number of bits shifted. |
348 | 16.0k | int TruncateToBitWidth(int bit_width, absl::Nonnull<uint128*> value) { |
349 | 16.0k | const int current_bit_width = BitWidth(*value); |
350 | 16.0k | const int shift = current_bit_width - bit_width; |
351 | 16.0k | *value >>= shift; |
352 | 16.0k | return shift; |
353 | 16.0k | } |
354 | | |
355 | | // Checks if the given ParsedFloat represents one of the edge cases that are |
356 | | // not dependent on number base: zero, infinity, or NaN. If so, sets *value |
357 | | // the appropriate double, and returns true. |
358 | | template <typename FloatType> |
359 | | bool HandleEdgeCase(const strings_internal::ParsedFloat& input, bool negative, |
360 | 12.4M | absl::Nonnull<FloatType*> value) { |
361 | 12.4M | if (input.type == strings_internal::FloatType::kNan) { |
362 | | // A bug in both clang < 7 and gcc would cause the compiler to optimize |
363 | | // away the buffer we are building below. Declaring the buffer volatile |
364 | | // avoids the issue, and has no measurable performance impact in |
365 | | // microbenchmarks. |
366 | | // |
367 | | // https://bugs.llvm.org/show_bug.cgi?id=37778 |
368 | | // https://gcc.gnu.org/bugzilla/show_bug.cgi?id=86113 |
369 | 1.35k | constexpr ptrdiff_t kNanBufferSize = 128; |
370 | | #if (defined(__GNUC__) && !defined(__clang__)) || \ |
371 | | (defined(__clang__) && __clang_major__ < 7) |
372 | | volatile char n_char_sequence[kNanBufferSize]; |
373 | | #else |
374 | 1.35k | char n_char_sequence[kNanBufferSize]; |
375 | 1.35k | #endif |
376 | 1.35k | if (input.subrange_begin == nullptr) { |
377 | 665 | n_char_sequence[0] = '\0'; |
378 | 693 | } else { |
379 | 693 | ptrdiff_t nan_size = input.subrange_end - input.subrange_begin; |
380 | 693 | nan_size = std::min(nan_size, kNanBufferSize - 1); |
381 | 693 | std::copy_n(input.subrange_begin, nan_size, n_char_sequence); |
382 | 693 | n_char_sequence[nan_size] = '\0'; |
383 | 693 | } |
384 | 1.35k | char* nan_argument = const_cast<char*>(n_char_sequence); |
385 | 1.35k | *value = negative ? -FloatTraits<FloatType>::MakeNan(nan_argument) |
386 | 1.35k | : FloatTraits<FloatType>::MakeNan(nan_argument); |
387 | 1.35k | return true; |
388 | 1.35k | } |
389 | 12.4M | if (input.type == strings_internal::FloatType::kInfinity) { |
390 | 768 | *value = negative ? -std::numeric_limits<FloatType>::infinity() |
391 | 768 | : std::numeric_limits<FloatType>::infinity(); |
392 | 768 | return true; |
393 | 768 | } |
394 | 12.4M | if (input.mantissa == 0) { |
395 | 644k | *value = negative ? -0.0 : 0.0; |
396 | 644k | return true; |
397 | 644k | } |
398 | 11.8M | return false; |
399 | 12.4M | } charconv.cc:bool absl::(anonymous namespace)::HandleEdgeCase<double>(absl::strings_internal::ParsedFloat const&, bool, double*) Line | Count | Source | 360 | 12.4M | absl::Nonnull<FloatType*> value) { | 361 | 12.4M | if (input.type == strings_internal::FloatType::kNan) { | 362 | | // A bug in both clang < 7 and gcc would cause the compiler to optimize | 363 | | // away the buffer we are building below. Declaring the buffer volatile | 364 | | // avoids the issue, and has no measurable performance impact in | 365 | | // microbenchmarks. | 366 | | // | 367 | | // https://bugs.llvm.org/show_bug.cgi?id=37778 | 368 | | // https://gcc.gnu.org/bugzilla/show_bug.cgi?id=86113 | 369 | 1.35k | constexpr ptrdiff_t kNanBufferSize = 128; | 370 | | #if (defined(__GNUC__) && !defined(__clang__)) || \ | 371 | | (defined(__clang__) && __clang_major__ < 7) | 372 | | volatile char n_char_sequence[kNanBufferSize]; | 373 | | #else | 374 | 1.35k | char n_char_sequence[kNanBufferSize]; | 375 | 1.35k | #endif | 376 | 1.35k | if (input.subrange_begin == nullptr) { | 377 | 665 | n_char_sequence[0] = '\0'; | 378 | 693 | } else { | 379 | 693 | ptrdiff_t nan_size = input.subrange_end - input.subrange_begin; | 380 | 693 | nan_size = std::min(nan_size, kNanBufferSize - 1); | 381 | 693 | std::copy_n(input.subrange_begin, nan_size, n_char_sequence); | 382 | 693 | n_char_sequence[nan_size] = '\0'; | 383 | 693 | } | 384 | 1.35k | char* nan_argument = const_cast<char*>(n_char_sequence); | 385 | 1.35k | *value = negative ? -FloatTraits<FloatType>::MakeNan(nan_argument) | 386 | 1.35k | : FloatTraits<FloatType>::MakeNan(nan_argument); | 387 | 1.35k | return true; | 388 | 1.35k | } | 389 | 12.4M | if (input.type == strings_internal::FloatType::kInfinity) { | 390 | 768 | *value = negative ? -std::numeric_limits<FloatType>::infinity() | 391 | 768 | : std::numeric_limits<FloatType>::infinity(); | 392 | 768 | return true; | 393 | 768 | } | 394 | 12.4M | if (input.mantissa == 0) { | 395 | 644k | *value = negative ? -0.0 : 0.0; | 396 | 644k | return true; | 397 | 644k | } | 398 | 11.8M | return false; | 399 | 12.4M | } |
Unexecuted instantiation: charconv.cc:bool absl::(anonymous namespace)::HandleEdgeCase<float>(absl::strings_internal::ParsedFloat const&, bool, float*) |
400 | | |
401 | | // Given a CalculatedFloat result of a from_chars conversion, generate the |
402 | | // correct output values. |
403 | | // |
404 | | // CalculatedFloat can represent an underflow or overflow, in which case the |
405 | | // error code in *result is set. Otherwise, the calculated floating point |
406 | | // number is stored in *value. |
407 | | template <typename FloatType> |
408 | | void EncodeResult(const CalculatedFloat& calculated, bool negative, |
409 | | absl::Nonnull<absl::from_chars_result*> result, |
410 | 1.47M | absl::Nonnull<FloatType*> value) { |
411 | 1.47M | if (calculated.exponent == kOverflow) { |
412 | 3.19k | result->ec = std::errc::result_out_of_range; |
413 | 3.19k | *value = negative ? -std::numeric_limits<FloatType>::max() |
414 | 3.19k | : std::numeric_limits<FloatType>::max(); |
415 | 3.19k | return; |
416 | 1.47M | } else if (calculated.mantissa == 0 || calculated.exponent == kUnderflow) { |
417 | 1.56k | result->ec = std::errc::result_out_of_range; |
418 | 1.56k | *value = negative ? -0.0 : 0.0; |
419 | 1.56k | return; |
420 | 1.56k | } |
421 | 1.47M | *value = FloatTraits<FloatType>::Make( |
422 | 1.47M | static_cast<typename FloatTraits<FloatType>::mantissa_t>( |
423 | 1.47M | calculated.mantissa), |
424 | 1.47M | calculated.exponent, negative); |
425 | 1.47M | } charconv.cc:void absl::(anonymous namespace)::EncodeResult<double>(absl::(anonymous namespace)::CalculatedFloat const&, bool, absl::from_chars_result*, double*) Line | Count | Source | 410 | 1.47M | absl::Nonnull<FloatType*> value) { | 411 | 1.47M | if (calculated.exponent == kOverflow) { | 412 | 3.19k | result->ec = std::errc::result_out_of_range; | 413 | 3.19k | *value = negative ? -std::numeric_limits<FloatType>::max() | 414 | 3.19k | : std::numeric_limits<FloatType>::max(); | 415 | 3.19k | return; | 416 | 1.47M | } else if (calculated.mantissa == 0 || calculated.exponent == kUnderflow) { | 417 | 1.56k | result->ec = std::errc::result_out_of_range; | 418 | 1.56k | *value = negative ? -0.0 : 0.0; | 419 | 1.56k | return; | 420 | 1.56k | } | 421 | 1.47M | *value = FloatTraits<FloatType>::Make( | 422 | 1.47M | static_cast<typename FloatTraits<FloatType>::mantissa_t>( | 423 | 1.47M | calculated.mantissa), | 424 | 1.47M | calculated.exponent, negative); | 425 | 1.47M | } |
Unexecuted instantiation: charconv.cc:void absl::(anonymous namespace)::EncodeResult<float>(absl::(anonymous namespace)::CalculatedFloat const&, bool, absl::from_chars_result*, float*) |
426 | | |
427 | | // Returns the given uint128 shifted to the right by `shift` bits, and rounds |
428 | | // the remaining bits using round_to_nearest logic. The value is returned as a |
429 | | // uint64_t, since this is the type used by this library for storing calculated |
430 | | // floating point mantissas. |
431 | | // |
432 | | // It is expected that the width of the input value shifted by `shift` will |
433 | | // be the correct bit-width for the target mantissa, which is strictly narrower |
434 | | // than a uint64_t. |
435 | | // |
436 | | // If `input_exact` is false, then a nonzero error epsilon is assumed. For |
437 | | // rounding purposes, the true value being rounded is strictly greater than the |
438 | | // input value. The error may represent a single lost carry bit. |
439 | | // |
440 | | // When input_exact, shifted bits of the form 1000000... represent a tie, which |
441 | | // is broken by rounding to even -- the rounding direction is chosen so the low |
442 | | // bit of the returned value is 0. |
443 | | // |
444 | | // When !input_exact, shifted bits of the form 10000000... represent a value |
445 | | // strictly greater than one half (due to the error epsilon), and so ties are |
446 | | // always broken by rounding up. |
447 | | // |
448 | | // When !input_exact, shifted bits of the form 01111111... are uncertain; |
449 | | // the true value may or may not be greater than 10000000..., due to the |
450 | | // possible lost carry bit. The correct rounding direction is unknown. In this |
451 | | // case, the result is rounded down, and `output_exact` is set to false. |
452 | | // |
453 | | // Zero and negative values of `shift` are accepted, in which case the word is |
454 | | // shifted left, as necessary. |
455 | | uint64_t ShiftRightAndRound(uint128 value, int shift, bool input_exact, |
456 | 1.47M | absl::Nonnull<bool*> output_exact) { |
457 | 1.47M | if (shift <= 0) { |
458 | 2.24k | *output_exact = input_exact; |
459 | 2.24k | return static_cast<uint64_t>(value << -shift); |
460 | 2.24k | } |
461 | 1.47M | if (shift >= 128) { |
462 | | // Exponent is so small that we are shifting away all significant bits. |
463 | | // Answer will not be representable, even as a subnormal, so return a zero |
464 | | // mantissa (which represents underflow). |
465 | 278 | *output_exact = true; |
466 | 278 | return 0; |
467 | 278 | } |
468 | | |
469 | 1.47M | *output_exact = true; |
470 | 1.47M | const uint128 shift_mask = (uint128(1) << shift) - 1; |
471 | 1.47M | const uint128 halfway_point = uint128(1) << (shift - 1); |
472 | | |
473 | 1.47M | const uint128 shifted_bits = value & shift_mask; |
474 | 1.47M | value >>= shift; |
475 | 1.47M | if (shifted_bits > halfway_point) { |
476 | | // Shifted bits greater than 10000... require rounding up. |
477 | 4.46k | return static_cast<uint64_t>(value + 1); |
478 | 4.46k | } |
479 | 1.47M | if (shifted_bits == halfway_point) { |
480 | | // In exact mode, shifted bits of 10000... mean we're exactly halfway |
481 | | // between two numbers, and we must round to even. So only round up if |
482 | | // the low bit of `value` is set. |
483 | | // |
484 | | // In inexact mode, the nonzero error means the actual value is greater |
485 | | // than the halfway point and we must always round up. |
486 | 1.45M | if ((value & 1) == 1 || !input_exact) { |
487 | 641 | ++value; |
488 | 641 | } |
489 | 1.45M | return static_cast<uint64_t>(value); |
490 | 1.45M | } |
491 | 12.4k | if (!input_exact && shifted_bits == halfway_point - 1) { |
492 | | // Rounding direction is unclear, due to error. |
493 | 10.7k | *output_exact = false; |
494 | 10.7k | } |
495 | | // Otherwise, round down. |
496 | 12.4k | return static_cast<uint64_t>(value); |
497 | 1.47M | } |
498 | | |
499 | | // Checks if a floating point guess needs to be rounded up, using high precision |
500 | | // math. |
501 | | // |
502 | | // `guess_mantissa` and `guess_exponent` represent a candidate guess for the |
503 | | // number represented by `parsed_decimal`. |
504 | | // |
505 | | // The exact number represented by `parsed_decimal` must lie between the two |
506 | | // numbers: |
507 | | // A = `guess_mantissa * 2**guess_exponent` |
508 | | // B = `(guess_mantissa + 1) * 2**guess_exponent` |
509 | | // |
510 | | // This function returns false if `A` is the better guess, and true if `B` is |
511 | | // the better guess, with rounding ties broken by rounding to even. |
512 | | bool MustRoundUp(uint64_t guess_mantissa, int guess_exponent, |
513 | 10.7k | const strings_internal::ParsedFloat& parsed_decimal) { |
514 | | // 768 is the number of digits needed in the worst case. We could determine a |
515 | | // better limit dynamically based on the value of parsed_decimal.exponent. |
516 | | // This would optimize pathological input cases only. (Sane inputs won't have |
517 | | // hundreds of digits of mantissa.) |
518 | 10.7k | absl::strings_internal::BigUnsigned<84> exact_mantissa; |
519 | 10.7k | int exact_exponent = exact_mantissa.ReadFloatMantissa(parsed_decimal, 768); |
520 | | |
521 | | // Adjust the `guess` arguments to be halfway between A and B. |
522 | 10.7k | guess_mantissa = guess_mantissa * 2 + 1; |
523 | 10.7k | guess_exponent -= 1; |
524 | | |
525 | | // In our comparison: |
526 | | // lhs = exact = exact_mantissa * 10**exact_exponent |
527 | | // = exact_mantissa * 5**exact_exponent * 2**exact_exponent |
528 | | // rhs = guess = guess_mantissa * 2**guess_exponent |
529 | | // |
530 | | // Because we are doing integer math, we can't directly deal with negative |
531 | | // exponents. We instead move these to the other side of the inequality. |
532 | 10.7k | absl::strings_internal::BigUnsigned<84>& lhs = exact_mantissa; |
533 | 10.7k | int comparison; |
534 | 10.7k | if (exact_exponent >= 0) { |
535 | 3.46k | lhs.MultiplyByFiveToTheNth(exact_exponent); |
536 | 3.46k | absl::strings_internal::BigUnsigned<84> rhs(guess_mantissa); |
537 | | // There are powers of 2 on both sides of the inequality; reduce this to |
538 | | // a single bit-shift. |
539 | 3.46k | if (exact_exponent > guess_exponent) { |
540 | 1.14k | lhs.ShiftLeft(exact_exponent - guess_exponent); |
541 | 2.32k | } else { |
542 | 2.32k | rhs.ShiftLeft(guess_exponent - exact_exponent); |
543 | 2.32k | } |
544 | 3.46k | comparison = Compare(lhs, rhs); |
545 | 7.30k | } else { |
546 | | // Move the power of 5 to the other side of the equation, giving us: |
547 | | // lhs = exact_mantissa * 2**exact_exponent |
548 | | // rhs = guess_mantissa * 5**(-exact_exponent) * 2**guess_exponent |
549 | 7.30k | absl::strings_internal::BigUnsigned<84> rhs = |
550 | 7.30k | absl::strings_internal::BigUnsigned<84>::FiveToTheNth(-exact_exponent); |
551 | 7.30k | rhs.MultiplyBy(guess_mantissa); |
552 | 7.30k | if (exact_exponent > guess_exponent) { |
553 | 5.31k | lhs.ShiftLeft(exact_exponent - guess_exponent); |
554 | 5.31k | } else { |
555 | 1.98k | rhs.ShiftLeft(guess_exponent - exact_exponent); |
556 | 1.98k | } |
557 | 7.30k | comparison = Compare(lhs, rhs); |
558 | 7.30k | } |
559 | 10.7k | if (comparison < 0) { |
560 | 7.92k | return false; |
561 | 7.92k | } else if (comparison > 0) { |
562 | 2.03k | return true; |
563 | 2.03k | } else { |
564 | | // When lhs == rhs, the decimal input is exactly between A and B. |
565 | | // Round towards even -- round up only if the low bit of the initial |
566 | | // `guess_mantissa` was a 1. We shifted guess_mantissa left 1 bit at |
567 | | // the beginning of this function, so test the 2nd bit here. |
568 | 806 | return (guess_mantissa & 2) == 2; |
569 | 806 | } |
570 | 10.7k | } |
571 | | |
572 | | // Constructs a CalculatedFloat from a given mantissa and exponent, but |
573 | | // with the following normalizations applied: |
574 | | // |
575 | | // If rounding has caused mantissa to increase just past the allowed bit |
576 | | // width, shift and adjust exponent. |
577 | | // |
578 | | // If exponent is too high, sets kOverflow. |
579 | | // |
580 | | // If mantissa is zero (representing a non-zero value not representable, even |
581 | | // as a subnormal), sets kUnderflow. |
582 | | template <typename FloatType> |
583 | 1.47M | CalculatedFloat CalculatedFloatFromRawValues(uint64_t mantissa, int exponent) { |
584 | 1.47M | CalculatedFloat result; |
585 | 1.47M | if (mantissa == uint64_t{1} << FloatTraits<FloatType>::kTargetMantissaBits) { |
586 | 2.70k | mantissa >>= 1; |
587 | 2.70k | exponent += 1; |
588 | 2.70k | } |
589 | 1.47M | if (exponent > FloatTraits<FloatType>::kMaxExponent) { |
590 | 2.24k | result.exponent = kOverflow; |
591 | 1.47M | } else if (mantissa == 0) { |
592 | 1.20k | result.exponent = kUnderflow; |
593 | 1.47M | } else { |
594 | 1.47M | result.exponent = exponent; |
595 | 1.47M | result.mantissa = mantissa; |
596 | 1.47M | } |
597 | 1.47M | return result; |
598 | 1.47M | } charconv.cc:absl::(anonymous namespace)::CalculatedFloat absl::(anonymous namespace)::CalculatedFloatFromRawValues<double>(unsigned long, int) Line | Count | Source | 583 | 1.47M | CalculatedFloat CalculatedFloatFromRawValues(uint64_t mantissa, int exponent) { | 584 | 1.47M | CalculatedFloat result; | 585 | 1.47M | if (mantissa == uint64_t{1} << FloatTraits<FloatType>::kTargetMantissaBits) { | 586 | 2.70k | mantissa >>= 1; | 587 | 2.70k | exponent += 1; | 588 | 2.70k | } | 589 | 1.47M | if (exponent > FloatTraits<FloatType>::kMaxExponent) { | 590 | 2.24k | result.exponent = kOverflow; | 591 | 1.47M | } else if (mantissa == 0) { | 592 | 1.20k | result.exponent = kUnderflow; | 593 | 1.47M | } else { | 594 | 1.47M | result.exponent = exponent; | 595 | 1.47M | result.mantissa = mantissa; | 596 | 1.47M | } | 597 | 1.47M | return result; | 598 | 1.47M | } |
Unexecuted instantiation: charconv.cc:absl::(anonymous namespace)::CalculatedFloat absl::(anonymous namespace)::CalculatedFloatFromRawValues<float>(unsigned long, int) |
599 | | |
600 | | template <typename FloatType> |
601 | | CalculatedFloat CalculateFromParsedHexadecimal( |
602 | 4.41k | const strings_internal::ParsedFloat& parsed_hex) { |
603 | 4.41k | uint64_t mantissa = parsed_hex.mantissa; |
604 | 4.41k | int exponent = parsed_hex.exponent; |
605 | | // This static_cast is only needed when using a std::bit_width() |
606 | | // implementation that does not have the fix for LWG 3656 applied. |
607 | 4.41k | int mantissa_width = static_cast<int>(bit_width(mantissa)); |
608 | 4.41k | const int shift = NormalizedShiftSize<FloatType>(mantissa_width, exponent); |
609 | 4.41k | bool result_exact; |
610 | 4.41k | exponent += shift; |
611 | 4.41k | mantissa = ShiftRightAndRound(mantissa, shift, |
612 | 4.41k | /* input exact= */ true, &result_exact); |
613 | | // ParseFloat handles rounding in the hexadecimal case, so we don't have to |
614 | | // check `result_exact` here. |
615 | 4.41k | return CalculatedFloatFromRawValues<FloatType>(mantissa, exponent); |
616 | 4.41k | } charconv.cc:absl::(anonymous namespace)::CalculatedFloat absl::(anonymous namespace)::CalculateFromParsedHexadecimal<double>(absl::strings_internal::ParsedFloat const&) Line | Count | Source | 602 | 4.41k | const strings_internal::ParsedFloat& parsed_hex) { | 603 | 4.41k | uint64_t mantissa = parsed_hex.mantissa; | 604 | 4.41k | int exponent = parsed_hex.exponent; | 605 | | // This static_cast is only needed when using a std::bit_width() | 606 | | // implementation that does not have the fix for LWG 3656 applied. | 607 | 4.41k | int mantissa_width = static_cast<int>(bit_width(mantissa)); | 608 | 4.41k | const int shift = NormalizedShiftSize<FloatType>(mantissa_width, exponent); | 609 | 4.41k | bool result_exact; | 610 | 4.41k | exponent += shift; | 611 | 4.41k | mantissa = ShiftRightAndRound(mantissa, shift, | 612 | 4.41k | /* input exact= */ true, &result_exact); | 613 | | // ParseFloat handles rounding in the hexadecimal case, so we don't have to | 614 | | // check `result_exact` here. | 615 | 4.41k | return CalculatedFloatFromRawValues<FloatType>(mantissa, exponent); | 616 | 4.41k | } |
Unexecuted instantiation: charconv.cc:absl::(anonymous namespace)::CalculatedFloat absl::(anonymous namespace)::CalculateFromParsedHexadecimal<float>(absl::strings_internal::ParsedFloat const&) |
617 | | |
618 | | template <typename FloatType> |
619 | | CalculatedFloat CalculateFromParsedDecimal( |
620 | 1.47M | const strings_internal::ParsedFloat& parsed_decimal) { |
621 | 1.47M | CalculatedFloat result; |
622 | | |
623 | | // Large or small enough decimal exponents will always result in overflow |
624 | | // or underflow. |
625 | 1.47M | if (Power10Underflow(parsed_decimal.exponent)) { |
626 | 369 | result.exponent = kUnderflow; |
627 | 369 | return result; |
628 | 1.47M | } else if (Power10Overflow(parsed_decimal.exponent)) { |
629 | 950 | result.exponent = kOverflow; |
630 | 950 | return result; |
631 | 950 | } |
632 | | |
633 | | // Otherwise convert our power of 10 into a power of 2 times an integer |
634 | | // mantissa, and multiply this by our parsed decimal mantissa. |
635 | 1.47M | uint128 wide_binary_mantissa = parsed_decimal.mantissa; |
636 | 1.47M | wide_binary_mantissa *= Power10Mantissa(parsed_decimal.exponent); |
637 | 1.47M | int binary_exponent = Power10Exponent(parsed_decimal.exponent); |
638 | | |
639 | | // Discard bits that are inaccurate due to truncation error. The magic |
640 | | // `mantissa_width` constants below are justified in |
641 | | // https://abseil.io/about/design/charconv. They represent the number of bits |
642 | | // in `wide_binary_mantissa` that are guaranteed to be unaffected by error |
643 | | // propagation. |
644 | 1.47M | bool mantissa_exact; |
645 | 1.47M | int mantissa_width; |
646 | 1.47M | if (parsed_decimal.subrange_begin) { |
647 | | // Truncated mantissa |
648 | 11.9k | mantissa_width = 58; |
649 | 11.9k | mantissa_exact = false; |
650 | 11.9k | binary_exponent += |
651 | 11.9k | TruncateToBitWidth(mantissa_width, &wide_binary_mantissa); |
652 | 1.46M | } else if (!Power10Exact(parsed_decimal.exponent)) { |
653 | | // Exact mantissa, truncated power of ten |
654 | 4.05k | mantissa_width = 63; |
655 | 4.05k | mantissa_exact = false; |
656 | 4.05k | binary_exponent += |
657 | 4.05k | TruncateToBitWidth(mantissa_width, &wide_binary_mantissa); |
658 | 1.45M | } else { |
659 | | // Product is exact |
660 | 1.45M | mantissa_width = BitWidth(wide_binary_mantissa); |
661 | 1.45M | mantissa_exact = true; |
662 | 1.45M | } |
663 | | |
664 | | // Shift into an FloatType-sized mantissa, and round to nearest. |
665 | 1.47M | const int shift = |
666 | 1.47M | NormalizedShiftSize<FloatType>(mantissa_width, binary_exponent); |
667 | 1.47M | bool result_exact; |
668 | 1.47M | binary_exponent += shift; |
669 | 1.47M | uint64_t binary_mantissa = ShiftRightAndRound(wide_binary_mantissa, shift, |
670 | 1.47M | mantissa_exact, &result_exact); |
671 | 1.47M | if (!result_exact) { |
672 | | // We could not determine the rounding direction using int128 math. Use |
673 | | // full resolution math instead. |
674 | 10.7k | if (MustRoundUp(binary_mantissa, binary_exponent, parsed_decimal)) { |
675 | 2.42k | binary_mantissa += 1; |
676 | 2.42k | } |
677 | 10.7k | } |
678 | | |
679 | 1.47M | return CalculatedFloatFromRawValues<FloatType>(binary_mantissa, |
680 | 1.47M | binary_exponent); |
681 | 1.47M | } charconv.cc:absl::(anonymous namespace)::CalculatedFloat absl::(anonymous namespace)::CalculateFromParsedDecimal<double>(absl::strings_internal::ParsedFloat const&) Line | Count | Source | 620 | 1.47M | const strings_internal::ParsedFloat& parsed_decimal) { | 621 | 1.47M | CalculatedFloat result; | 622 | | | 623 | | // Large or small enough decimal exponents will always result in overflow | 624 | | // or underflow. | 625 | 1.47M | if (Power10Underflow(parsed_decimal.exponent)) { | 626 | 369 | result.exponent = kUnderflow; | 627 | 369 | return result; | 628 | 1.47M | } else if (Power10Overflow(parsed_decimal.exponent)) { | 629 | 950 | result.exponent = kOverflow; | 630 | 950 | return result; | 631 | 950 | } | 632 | | | 633 | | // Otherwise convert our power of 10 into a power of 2 times an integer | 634 | | // mantissa, and multiply this by our parsed decimal mantissa. | 635 | 1.47M | uint128 wide_binary_mantissa = parsed_decimal.mantissa; | 636 | 1.47M | wide_binary_mantissa *= Power10Mantissa(parsed_decimal.exponent); | 637 | 1.47M | int binary_exponent = Power10Exponent(parsed_decimal.exponent); | 638 | | | 639 | | // Discard bits that are inaccurate due to truncation error. The magic | 640 | | // `mantissa_width` constants below are justified in | 641 | | // https://abseil.io/about/design/charconv. They represent the number of bits | 642 | | // in `wide_binary_mantissa` that are guaranteed to be unaffected by error | 643 | | // propagation. | 644 | 1.47M | bool mantissa_exact; | 645 | 1.47M | int mantissa_width; | 646 | 1.47M | if (parsed_decimal.subrange_begin) { | 647 | | // Truncated mantissa | 648 | 11.9k | mantissa_width = 58; | 649 | 11.9k | mantissa_exact = false; | 650 | 11.9k | binary_exponent += | 651 | 11.9k | TruncateToBitWidth(mantissa_width, &wide_binary_mantissa); | 652 | 1.46M | } else if (!Power10Exact(parsed_decimal.exponent)) { | 653 | | // Exact mantissa, truncated power of ten | 654 | 4.05k | mantissa_width = 63; | 655 | 4.05k | mantissa_exact = false; | 656 | 4.05k | binary_exponent += | 657 | 4.05k | TruncateToBitWidth(mantissa_width, &wide_binary_mantissa); | 658 | 1.45M | } else { | 659 | | // Product is exact | 660 | 1.45M | mantissa_width = BitWidth(wide_binary_mantissa); | 661 | 1.45M | mantissa_exact = true; | 662 | 1.45M | } | 663 | | | 664 | | // Shift into an FloatType-sized mantissa, and round to nearest. | 665 | 1.47M | const int shift = | 666 | 1.47M | NormalizedShiftSize<FloatType>(mantissa_width, binary_exponent); | 667 | 1.47M | bool result_exact; | 668 | 1.47M | binary_exponent += shift; | 669 | 1.47M | uint64_t binary_mantissa = ShiftRightAndRound(wide_binary_mantissa, shift, | 670 | 1.47M | mantissa_exact, &result_exact); | 671 | 1.47M | if (!result_exact) { | 672 | | // We could not determine the rounding direction using int128 math. Use | 673 | | // full resolution math instead. | 674 | 10.7k | if (MustRoundUp(binary_mantissa, binary_exponent, parsed_decimal)) { | 675 | 2.42k | binary_mantissa += 1; | 676 | 2.42k | } | 677 | 10.7k | } | 678 | | | 679 | 1.47M | return CalculatedFloatFromRawValues<FloatType>(binary_mantissa, | 680 | 1.47M | binary_exponent); | 681 | 1.47M | } |
Unexecuted instantiation: charconv.cc:absl::(anonymous namespace)::CalculatedFloat absl::(anonymous namespace)::CalculateFromParsedDecimal<float>(absl::strings_internal::ParsedFloat const&) |
682 | | |
683 | | // As discussed in https://nigeltao.github.io/blog/2020/eisel-lemire.html the |
684 | | // primary goal of the Eisel-Lemire algorithm is speed, for 99+% of the cases, |
685 | | // not 100% coverage. As long as Eisel-Lemire doesn’t claim false positives, |
686 | | // the combined approach (falling back to an alternative implementation when |
687 | | // this function returns false) is both fast and correct. |
688 | | template <typename FloatType> |
689 | | bool EiselLemire(const strings_internal::ParsedFloat& input, bool negative, |
690 | | absl::Nonnull<FloatType*> value, |
691 | 11.8M | absl::Nonnull<std::errc*> ec) { |
692 | 11.8M | uint64_t man = input.mantissa; |
693 | 11.8M | int exp10 = input.exponent; |
694 | 11.8M | if (exp10 < FloatTraits<FloatType>::kEiselLemireMinInclusiveExp10) { |
695 | 454 | *value = negative ? -0.0 : 0.0; |
696 | 454 | *ec = std::errc::result_out_of_range; |
697 | 454 | return true; |
698 | 11.8M | } else if (exp10 >= FloatTraits<FloatType>::kEiselLemireMaxExclusiveExp10) { |
699 | | // Return max (a finite value) consistent with from_chars and DR 3081. For |
700 | | // SimpleAtod and SimpleAtof, post-processing will return infinity. |
701 | 1.84k | *value = negative ? -std::numeric_limits<FloatType>::max() |
702 | 1.84k | : std::numeric_limits<FloatType>::max(); |
703 | 1.84k | *ec = std::errc::result_out_of_range; |
704 | 1.84k | return true; |
705 | 1.84k | } |
706 | | |
707 | | // Assert kPower10TableMinInclusive <= exp10 < kPower10TableMaxExclusive. |
708 | | // Equivalently, !Power10Underflow(exp10) and !Power10Overflow(exp10). |
709 | 11.8M | static_assert( |
710 | 11.8M | FloatTraits<FloatType>::kEiselLemireMinInclusiveExp10 >= |
711 | 11.8M | kPower10TableMinInclusive, |
712 | 11.8M | "(exp10-kPower10TableMinInclusive) in kPower10MantissaHighTable bounds"); |
713 | 11.8M | static_assert( |
714 | 11.8M | FloatTraits<FloatType>::kEiselLemireMaxExclusiveExp10 <= |
715 | 11.8M | kPower10TableMaxExclusive, |
716 | 11.8M | "(exp10-kPower10TableMinInclusive) in kPower10MantissaHighTable bounds"); |
717 | | |
718 | | // The terse (+) comments in this function body refer to sections of the |
719 | | // https://nigeltao.github.io/blog/2020/eisel-lemire.html blog post. |
720 | | // |
721 | | // That blog post discusses double precision (11 exponent bits with a -1023 |
722 | | // bias, 52 mantissa bits), but the same approach applies to single precision |
723 | | // (8 exponent bits with a -127 bias, 23 mantissa bits). Either way, the |
724 | | // computation here happens with 64-bit values (e.g. man) or 128-bit values |
725 | | // (e.g. x) before finally converting to 64- or 32-bit floating point. |
726 | | // |
727 | | // See also "Number Parsing at a Gigabyte per Second, Software: Practice and |
728 | | // Experience 51 (8), 2021" (https://arxiv.org/abs/2101.11408) for detail. |
729 | | |
730 | | // (+) Normalization. |
731 | 11.8M | int clz = countl_zero(man); |
732 | 11.8M | man <<= static_cast<unsigned int>(clz); |
733 | | // The 217706 etc magic numbers are from the Power10Exponent function. |
734 | 11.8M | uint64_t ret_exp2 = |
735 | 11.8M | static_cast<uint64_t>((217706 * exp10 >> 16) + 64 + |
736 | 11.8M | FloatTraits<FloatType>::kExponentBias - clz); |
737 | | |
738 | | // (+) Multiplication. |
739 | 11.8M | uint128 x = static_cast<uint128>(man) * |
740 | 11.8M | static_cast<uint128>( |
741 | 11.8M | kPower10MantissaHighTable[exp10 - kPower10TableMinInclusive]); |
742 | | |
743 | | // (+) Wider Approximation. |
744 | 11.8M | static constexpr uint64_t high64_mask = |
745 | 11.8M | FloatTraits<FloatType>::kEiselLemireMask; |
746 | 11.8M | if (((Uint128High64(x) & high64_mask) == high64_mask) && |
747 | 11.8M | (man > (std::numeric_limits<uint64_t>::max() - Uint128Low64(x)))) { |
748 | 1.94k | uint128 y = |
749 | 1.94k | static_cast<uint128>(man) * |
750 | 1.94k | static_cast<uint128>( |
751 | 1.94k | kPower10MantissaLowTable[exp10 - kPower10TableMinInclusive]); |
752 | 1.94k | x += Uint128High64(y); |
753 | | // For example, parsing "4503599627370497.5" will take the if-true |
754 | | // branch here (for double precision), since: |
755 | | // - x = 0x8000000000000BFF_FFFFFFFFFFFFFFFF |
756 | | // - y = 0x8000000000000BFF_7FFFFFFFFFFFF400 |
757 | | // - man = 0xA000000000000F00 |
758 | | // Likewise, when parsing "0.0625" for single precision: |
759 | | // - x = 0x7FFFFFFFFFFFFFFF_FFFFFFFFFFFFFFFF |
760 | | // - y = 0x813FFFFFFFFFFFFF_8A00000000000000 |
761 | | // - man = 0x9C40000000000000 |
762 | 1.94k | if (((Uint128High64(x) & high64_mask) == high64_mask) && |
763 | 1.94k | ((Uint128Low64(x) + 1) == 0) && |
764 | 1.94k | (man > (std::numeric_limits<uint64_t>::max() - Uint128Low64(y)))) { |
765 | 828 | return false; |
766 | 828 | } |
767 | 1.94k | } |
768 | | |
769 | | // (+) Shifting to 54 Bits (or for single precision, to 25 bits). |
770 | 11.8M | uint64_t msb = Uint128High64(x) >> 63; |
771 | 11.8M | uint64_t ret_man = |
772 | 11.8M | Uint128High64(x) >> (msb + FloatTraits<FloatType>::kEiselLemireShift); |
773 | 11.8M | ret_exp2 -= 1 ^ msb; |
774 | | |
775 | | // (+) Half-way Ambiguity. |
776 | | // |
777 | | // For example, parsing "1e+23" will take the if-true branch here (for double |
778 | | // precision), since: |
779 | | // - x = 0x54B40B1F852BDA00_0000000000000000 |
780 | | // - ret_man = 0x002A5A058FC295ED |
781 | | // Likewise, when parsing "20040229.0" for single precision: |
782 | | // - x = 0x4C72894000000000_0000000000000000 |
783 | | // - ret_man = 0x000000000131CA25 |
784 | 11.8M | if ((Uint128Low64(x) == 0) && ((Uint128High64(x) & high64_mask) == 0) && |
785 | 11.8M | ((ret_man & 3) == 1)) { |
786 | 1.45M | return false; |
787 | 1.45M | } |
788 | | |
789 | | // (+) From 54 to 53 Bits (or for single precision, from 25 to 24 bits). |
790 | 10.3M | ret_man += ret_man & 1; // Line From54a. |
791 | 10.3M | ret_man >>= 1; // Line From54b. |
792 | | // Incrementing ret_man (at line From54a) may have overflowed 54 bits (53 |
793 | | // bits after the right shift by 1 at line From54b), so adjust for that. |
794 | | // |
795 | | // For example, parsing "9223372036854775807" will take the if-true branch |
796 | | // here (for double precision), since: |
797 | | // - ret_man = 0x0020000000000000 = (1 << 53) |
798 | | // Likewise, when parsing "2147483647.0" for single precision: |
799 | | // - ret_man = 0x0000000001000000 = (1 << 24) |
800 | 10.3M | if ((ret_man >> FloatTraits<FloatType>::kTargetMantissaBits) > 0) { |
801 | 208 | ret_exp2 += 1; |
802 | | // Conceptually, we need a "ret_man >>= 1" in this if-block to balance |
803 | | // incrementing ret_exp2 in the line immediately above. However, we only |
804 | | // get here when line From54a overflowed (after adding a 1), so ret_man |
805 | | // here is (1 << 53). Its low 53 bits are therefore all zeroes. The only |
806 | | // remaining use of ret_man is to mask it with ((1 << 52) - 1), so only its |
807 | | // low 52 bits matter. A "ret_man >>= 1" would have no effect in practice. |
808 | | // |
809 | | // We omit the "ret_man >>= 1", even if it is cheap (and this if-branch is |
810 | | // rarely taken) and technically 'more correct', so that mutation tests |
811 | | // that would otherwise modify or omit that "ret_man >>= 1" don't complain |
812 | | // that such code mutations have no observable effect. |
813 | 208 | } |
814 | | |
815 | | // ret_exp2 is a uint64_t. Zero or underflow means that we're in subnormal |
816 | | // space. max_exp2 (0x7FF for double precision, 0xFF for single precision) or |
817 | | // above means that we're in Inf/NaN space. |
818 | | // |
819 | | // The if block is equivalent to (but has fewer branches than): |
820 | | // if ((ret_exp2 <= 0) || (ret_exp2 >= max_exp2)) { etc } |
821 | | // |
822 | | // For example, parsing "4.9406564584124654e-324" will take the if-true |
823 | | // branch here, since ret_exp2 = -51. |
824 | 10.3M | static constexpr uint64_t max_exp2 = |
825 | 10.3M | (1 << FloatTraits<FloatType>::kTargetExponentBits) - 1; |
826 | 10.3M | if ((ret_exp2 - 1) >= (max_exp2 - 1)) { |
827 | 3.23k | return false; |
828 | 3.23k | } |
829 | | |
830 | | #ifndef ABSL_BIT_PACK_FLOATS |
831 | | if (FloatTraits<FloatType>::kTargetBits == 64) { |
832 | | *value = FloatTraits<FloatType>::Make( |
833 | | (ret_man & 0x000FFFFFFFFFFFFFu) | 0x0010000000000000u, |
834 | | static_cast<int>(ret_exp2) - 1023 - 52, negative); |
835 | | return true; |
836 | | } else if (FloatTraits<FloatType>::kTargetBits == 32) { |
837 | | *value = FloatTraits<FloatType>::Make( |
838 | | (static_cast<uint32_t>(ret_man) & 0x007FFFFFu) | 0x00800000u, |
839 | | static_cast<int>(ret_exp2) - 127 - 23, negative); |
840 | | return true; |
841 | | } |
842 | | #else |
843 | 10.3M | if (FloatTraits<FloatType>::kTargetBits == 64) { |
844 | 10.3M | uint64_t ret_bits = (ret_exp2 << 52) | (ret_man & 0x000FFFFFFFFFFFFFu); |
845 | 10.3M | if (negative) { |
846 | 3.81k | ret_bits |= 0x8000000000000000u; |
847 | 3.81k | } |
848 | 10.3M | *value = absl::bit_cast<double>(ret_bits); |
849 | 10.3M | return true; |
850 | 10.3M | } else if (FloatTraits<FloatType>::kTargetBits == 32) { |
851 | 0 | uint32_t ret_bits = (static_cast<uint32_t>(ret_exp2) << 23) | |
852 | 0 | (static_cast<uint32_t>(ret_man) & 0x007FFFFFu); |
853 | 0 | if (negative) { |
854 | 0 | ret_bits |= 0x80000000u; |
855 | 0 | } |
856 | 0 | *value = absl::bit_cast<float>(ret_bits); |
857 | 0 | return true; |
858 | 0 | } |
859 | 0 | #endif // ABSL_BIT_PACK_FLOATS |
860 | 0 | return false; |
861 | 10.3M | } charconv.cc:bool absl::(anonymous namespace)::EiselLemire<double>(absl::strings_internal::ParsedFloat const&, bool, double*, std::__1::errc*) Line | Count | Source | 691 | 11.8M | absl::Nonnull<std::errc*> ec) { | 692 | 11.8M | uint64_t man = input.mantissa; | 693 | 11.8M | int exp10 = input.exponent; | 694 | 11.8M | if (exp10 < FloatTraits<FloatType>::kEiselLemireMinInclusiveExp10) { | 695 | 454 | *value = negative ? -0.0 : 0.0; | 696 | 454 | *ec = std::errc::result_out_of_range; | 697 | 454 | return true; | 698 | 11.8M | } else if (exp10 >= FloatTraits<FloatType>::kEiselLemireMaxExclusiveExp10) { | 699 | | // Return max (a finite value) consistent with from_chars and DR 3081. For | 700 | | // SimpleAtod and SimpleAtof, post-processing will return infinity. | 701 | 1.84k | *value = negative ? -std::numeric_limits<FloatType>::max() | 702 | 1.84k | : std::numeric_limits<FloatType>::max(); | 703 | 1.84k | *ec = std::errc::result_out_of_range; | 704 | 1.84k | return true; | 705 | 1.84k | } | 706 | | | 707 | | // Assert kPower10TableMinInclusive <= exp10 < kPower10TableMaxExclusive. | 708 | | // Equivalently, !Power10Underflow(exp10) and !Power10Overflow(exp10). | 709 | 11.8M | static_assert( | 710 | 11.8M | FloatTraits<FloatType>::kEiselLemireMinInclusiveExp10 >= | 711 | 11.8M | kPower10TableMinInclusive, | 712 | 11.8M | "(exp10-kPower10TableMinInclusive) in kPower10MantissaHighTable bounds"); | 713 | 11.8M | static_assert( | 714 | 11.8M | FloatTraits<FloatType>::kEiselLemireMaxExclusiveExp10 <= | 715 | 11.8M | kPower10TableMaxExclusive, | 716 | 11.8M | "(exp10-kPower10TableMinInclusive) in kPower10MantissaHighTable bounds"); | 717 | | | 718 | | // The terse (+) comments in this function body refer to sections of the | 719 | | // https://nigeltao.github.io/blog/2020/eisel-lemire.html blog post. | 720 | | // | 721 | | // That blog post discusses double precision (11 exponent bits with a -1023 | 722 | | // bias, 52 mantissa bits), but the same approach applies to single precision | 723 | | // (8 exponent bits with a -127 bias, 23 mantissa bits). Either way, the | 724 | | // computation here happens with 64-bit values (e.g. man) or 128-bit values | 725 | | // (e.g. x) before finally converting to 64- or 32-bit floating point. | 726 | | // | 727 | | // See also "Number Parsing at a Gigabyte per Second, Software: Practice and | 728 | | // Experience 51 (8), 2021" (https://arxiv.org/abs/2101.11408) for detail. | 729 | | | 730 | | // (+) Normalization. | 731 | 11.8M | int clz = countl_zero(man); | 732 | 11.8M | man <<= static_cast<unsigned int>(clz); | 733 | | // The 217706 etc magic numbers are from the Power10Exponent function. | 734 | 11.8M | uint64_t ret_exp2 = | 735 | 11.8M | static_cast<uint64_t>((217706 * exp10 >> 16) + 64 + | 736 | 11.8M | FloatTraits<FloatType>::kExponentBias - clz); | 737 | | | 738 | | // (+) Multiplication. | 739 | 11.8M | uint128 x = static_cast<uint128>(man) * | 740 | 11.8M | static_cast<uint128>( | 741 | 11.8M | kPower10MantissaHighTable[exp10 - kPower10TableMinInclusive]); | 742 | | | 743 | | // (+) Wider Approximation. | 744 | 11.8M | static constexpr uint64_t high64_mask = | 745 | 11.8M | FloatTraits<FloatType>::kEiselLemireMask; | 746 | 11.8M | if (((Uint128High64(x) & high64_mask) == high64_mask) && | 747 | 11.8M | (man > (std::numeric_limits<uint64_t>::max() - Uint128Low64(x)))) { | 748 | 1.94k | uint128 y = | 749 | 1.94k | static_cast<uint128>(man) * | 750 | 1.94k | static_cast<uint128>( | 751 | 1.94k | kPower10MantissaLowTable[exp10 - kPower10TableMinInclusive]); | 752 | 1.94k | x += Uint128High64(y); | 753 | | // For example, parsing "4503599627370497.5" will take the if-true | 754 | | // branch here (for double precision), since: | 755 | | // - x = 0x8000000000000BFF_FFFFFFFFFFFFFFFF | 756 | | // - y = 0x8000000000000BFF_7FFFFFFFFFFFF400 | 757 | | // - man = 0xA000000000000F00 | 758 | | // Likewise, when parsing "0.0625" for single precision: | 759 | | // - x = 0x7FFFFFFFFFFFFFFF_FFFFFFFFFFFFFFFF | 760 | | // - y = 0x813FFFFFFFFFFFFF_8A00000000000000 | 761 | | // - man = 0x9C40000000000000 | 762 | 1.94k | if (((Uint128High64(x) & high64_mask) == high64_mask) && | 763 | 1.94k | ((Uint128Low64(x) + 1) == 0) && | 764 | 1.94k | (man > (std::numeric_limits<uint64_t>::max() - Uint128Low64(y)))) { | 765 | 828 | return false; | 766 | 828 | } | 767 | 1.94k | } | 768 | | | 769 | | // (+) Shifting to 54 Bits (or for single precision, to 25 bits). | 770 | 11.8M | uint64_t msb = Uint128High64(x) >> 63; | 771 | 11.8M | uint64_t ret_man = | 772 | 11.8M | Uint128High64(x) >> (msb + FloatTraits<FloatType>::kEiselLemireShift); | 773 | 11.8M | ret_exp2 -= 1 ^ msb; | 774 | | | 775 | | // (+) Half-way Ambiguity. | 776 | | // | 777 | | // For example, parsing "1e+23" will take the if-true branch here (for double | 778 | | // precision), since: | 779 | | // - x = 0x54B40B1F852BDA00_0000000000000000 | 780 | | // - ret_man = 0x002A5A058FC295ED | 781 | | // Likewise, when parsing "20040229.0" for single precision: | 782 | | // - x = 0x4C72894000000000_0000000000000000 | 783 | | // - ret_man = 0x000000000131CA25 | 784 | 11.8M | if ((Uint128Low64(x) == 0) && ((Uint128High64(x) & high64_mask) == 0) && | 785 | 11.8M | ((ret_man & 3) == 1)) { | 786 | 1.45M | return false; | 787 | 1.45M | } | 788 | | | 789 | | // (+) From 54 to 53 Bits (or for single precision, from 25 to 24 bits). | 790 | 10.3M | ret_man += ret_man & 1; // Line From54a. | 791 | 10.3M | ret_man >>= 1; // Line From54b. | 792 | | // Incrementing ret_man (at line From54a) may have overflowed 54 bits (53 | 793 | | // bits after the right shift by 1 at line From54b), so adjust for that. | 794 | | // | 795 | | // For example, parsing "9223372036854775807" will take the if-true branch | 796 | | // here (for double precision), since: | 797 | | // - ret_man = 0x0020000000000000 = (1 << 53) | 798 | | // Likewise, when parsing "2147483647.0" for single precision: | 799 | | // - ret_man = 0x0000000001000000 = (1 << 24) | 800 | 10.3M | if ((ret_man >> FloatTraits<FloatType>::kTargetMantissaBits) > 0) { | 801 | 208 | ret_exp2 += 1; | 802 | | // Conceptually, we need a "ret_man >>= 1" in this if-block to balance | 803 | | // incrementing ret_exp2 in the line immediately above. However, we only | 804 | | // get here when line From54a overflowed (after adding a 1), so ret_man | 805 | | // here is (1 << 53). Its low 53 bits are therefore all zeroes. The only | 806 | | // remaining use of ret_man is to mask it with ((1 << 52) - 1), so only its | 807 | | // low 52 bits matter. A "ret_man >>= 1" would have no effect in practice. | 808 | | // | 809 | | // We omit the "ret_man >>= 1", even if it is cheap (and this if-branch is | 810 | | // rarely taken) and technically 'more correct', so that mutation tests | 811 | | // that would otherwise modify or omit that "ret_man >>= 1" don't complain | 812 | | // that such code mutations have no observable effect. | 813 | 208 | } | 814 | | | 815 | | // ret_exp2 is a uint64_t. Zero or underflow means that we're in subnormal | 816 | | // space. max_exp2 (0x7FF for double precision, 0xFF for single precision) or | 817 | | // above means that we're in Inf/NaN space. | 818 | | // | 819 | | // The if block is equivalent to (but has fewer branches than): | 820 | | // if ((ret_exp2 <= 0) || (ret_exp2 >= max_exp2)) { etc } | 821 | | // | 822 | | // For example, parsing "4.9406564584124654e-324" will take the if-true | 823 | | // branch here, since ret_exp2 = -51. | 824 | 10.3M | static constexpr uint64_t max_exp2 = | 825 | 10.3M | (1 << FloatTraits<FloatType>::kTargetExponentBits) - 1; | 826 | 10.3M | if ((ret_exp2 - 1) >= (max_exp2 - 1)) { | 827 | 3.23k | return false; | 828 | 3.23k | } | 829 | | | 830 | | #ifndef ABSL_BIT_PACK_FLOATS | 831 | | if (FloatTraits<FloatType>::kTargetBits == 64) { | 832 | | *value = FloatTraits<FloatType>::Make( | 833 | | (ret_man & 0x000FFFFFFFFFFFFFu) | 0x0010000000000000u, | 834 | | static_cast<int>(ret_exp2) - 1023 - 52, negative); | 835 | | return true; | 836 | | } else if (FloatTraits<FloatType>::kTargetBits == 32) { | 837 | | *value = FloatTraits<FloatType>::Make( | 838 | | (static_cast<uint32_t>(ret_man) & 0x007FFFFFu) | 0x00800000u, | 839 | | static_cast<int>(ret_exp2) - 127 - 23, negative); | 840 | | return true; | 841 | | } | 842 | | #else | 843 | 10.3M | if (FloatTraits<FloatType>::kTargetBits == 64) { | 844 | 10.3M | uint64_t ret_bits = (ret_exp2 << 52) | (ret_man & 0x000FFFFFFFFFFFFFu); | 845 | 10.3M | if (negative) { | 846 | 3.81k | ret_bits |= 0x8000000000000000u; | 847 | 3.81k | } | 848 | 10.3M | *value = absl::bit_cast<double>(ret_bits); | 849 | 10.3M | return true; | 850 | 10.3M | } else if (FloatTraits<FloatType>::kTargetBits == 32) { | 851 | 0 | uint32_t ret_bits = (static_cast<uint32_t>(ret_exp2) << 23) | | 852 | 0 | (static_cast<uint32_t>(ret_man) & 0x007FFFFFu); | 853 | 0 | if (negative) { | 854 | 0 | ret_bits |= 0x80000000u; | 855 | 0 | } | 856 | 0 | *value = absl::bit_cast<float>(ret_bits); | 857 | 0 | return true; | 858 | 0 | } | 859 | 0 | #endif // ABSL_BIT_PACK_FLOATS | 860 | 0 | return false; | 861 | 10.3M | } |
Unexecuted instantiation: charconv.cc:bool absl::(anonymous namespace)::EiselLemire<float>(absl::strings_internal::ParsedFloat const&, bool, float*, std::__1::errc*) |
862 | | |
863 | | template <typename FloatType> |
864 | | from_chars_result FromCharsImpl(absl::Nonnull<const char*> first, |
865 | | absl::Nonnull<const char*> last, |
866 | 12.4M | FloatType& value, chars_format fmt_flags) { |
867 | 12.4M | from_chars_result result; |
868 | 12.4M | result.ptr = first; // overwritten on successful parse |
869 | 12.4M | result.ec = std::errc(); |
870 | | |
871 | 12.4M | bool negative = false; |
872 | 12.4M | if (first != last && *first == '-') { |
873 | 4.81k | ++first; |
874 | 4.81k | negative = true; |
875 | 4.81k | } |
876 | | // If the `hex` flag is *not* set, then we will accept a 0x prefix and try |
877 | | // to parse a hexadecimal float. |
878 | 12.4M | if ((fmt_flags & chars_format::hex) == chars_format{} && last - first >= 2 && |
879 | 12.4M | *first == '0' && (first[1] == 'x' || first[1] == 'X')) { |
880 | 5.15k | const char* hex_first = first + 2; |
881 | 5.15k | strings_internal::ParsedFloat hex_parse = |
882 | 5.15k | strings_internal::ParseFloat<16>(hex_first, last, fmt_flags); |
883 | 5.15k | if (hex_parse.end == nullptr || |
884 | 5.15k | hex_parse.type != strings_internal::FloatType::kNumber) { |
885 | | // Either we failed to parse a hex float after the "0x", or we read |
886 | | // "0xinf" or "0xnan" which we don't want to match. |
887 | | // |
888 | | // However, a string that begins with "0x" also begins with "0", which |
889 | | // is normally a valid match for the number zero. So we want these |
890 | | // strings to match zero unless fmt_flags is `scientific`. (This flag |
891 | | // means an exponent is required, which the string "0" does not have.) |
892 | 27 | if (fmt_flags == chars_format::scientific) { |
893 | 0 | result.ec = std::errc::invalid_argument; |
894 | 27 | } else { |
895 | 27 | result.ptr = first + 1; |
896 | 27 | value = negative ? -0.0 : 0.0; |
897 | 27 | } |
898 | 27 | return result; |
899 | 27 | } |
900 | | // We matched a value. |
901 | 5.12k | result.ptr = hex_parse.end; |
902 | 5.12k | if (HandleEdgeCase(hex_parse, negative, &value)) { |
903 | 704 | return result; |
904 | 704 | } |
905 | 4.41k | CalculatedFloat calculated = |
906 | 4.41k | CalculateFromParsedHexadecimal<FloatType>(hex_parse); |
907 | 4.41k | EncodeResult(calculated, negative, &result, &value); |
908 | 4.41k | return result; |
909 | 5.12k | } |
910 | | // Otherwise, we choose the number base based on the flags. |
911 | 12.4M | if ((fmt_flags & chars_format::hex) == chars_format::hex) { |
912 | 0 | strings_internal::ParsedFloat hex_parse = |
913 | 0 | strings_internal::ParseFloat<16>(first, last, fmt_flags); |
914 | 0 | if (hex_parse.end == nullptr) { |
915 | 0 | result.ec = std::errc::invalid_argument; |
916 | 0 | return result; |
917 | 0 | } |
918 | 0 | result.ptr = hex_parse.end; |
919 | 0 | if (HandleEdgeCase(hex_parse, negative, &value)) { |
920 | 0 | return result; |
921 | 0 | } |
922 | 0 | CalculatedFloat calculated = |
923 | 0 | CalculateFromParsedHexadecimal<FloatType>(hex_parse); |
924 | 0 | EncodeResult(calculated, negative, &result, &value); |
925 | 0 | return result; |
926 | 12.4M | } else { |
927 | 12.4M | strings_internal::ParsedFloat decimal_parse = |
928 | 12.4M | strings_internal::ParseFloat<10>(first, last, fmt_flags); |
929 | 12.4M | if (decimal_parse.end == nullptr) { |
930 | 2.21k | result.ec = std::errc::invalid_argument; |
931 | 2.21k | return result; |
932 | 2.21k | } |
933 | 12.4M | result.ptr = decimal_parse.end; |
934 | 12.4M | if (HandleEdgeCase(decimal_parse, negative, &value)) { |
935 | 645k | return result; |
936 | 645k | } |
937 | | // A nullptr subrange_begin means that the decimal_parse.mantissa is exact |
938 | | // (not truncated), a precondition of the Eisel-Lemire algorithm. |
939 | 11.8M | if ((decimal_parse.subrange_begin == nullptr) && |
940 | 11.8M | EiselLemire<FloatType>(decimal_parse, negative, &value, &result.ec)) { |
941 | 10.3M | return result; |
942 | 10.3M | } |
943 | 1.47M | CalculatedFloat calculated = |
944 | 1.47M | CalculateFromParsedDecimal<FloatType>(decimal_parse); |
945 | 1.47M | EncodeResult(calculated, negative, &result, &value); |
946 | 1.47M | return result; |
947 | 11.8M | } |
948 | 12.4M | } charconv.cc:absl::from_chars_result absl::(anonymous namespace)::FromCharsImpl<double>(char const*, char const*, double&, absl::chars_format) Line | Count | Source | 866 | 12.4M | FloatType& value, chars_format fmt_flags) { | 867 | 12.4M | from_chars_result result; | 868 | 12.4M | result.ptr = first; // overwritten on successful parse | 869 | 12.4M | result.ec = std::errc(); | 870 | | | 871 | 12.4M | bool negative = false; | 872 | 12.4M | if (first != last && *first == '-') { | 873 | 4.81k | ++first; | 874 | 4.81k | negative = true; | 875 | 4.81k | } | 876 | | // If the `hex` flag is *not* set, then we will accept a 0x prefix and try | 877 | | // to parse a hexadecimal float. | 878 | 12.4M | if ((fmt_flags & chars_format::hex) == chars_format{} && last - first >= 2 && | 879 | 12.4M | *first == '0' && (first[1] == 'x' || first[1] == 'X')) { | 880 | 5.15k | const char* hex_first = first + 2; | 881 | 5.15k | strings_internal::ParsedFloat hex_parse = | 882 | 5.15k | strings_internal::ParseFloat<16>(hex_first, last, fmt_flags); | 883 | 5.15k | if (hex_parse.end == nullptr || | 884 | 5.15k | hex_parse.type != strings_internal::FloatType::kNumber) { | 885 | | // Either we failed to parse a hex float after the "0x", or we read | 886 | | // "0xinf" or "0xnan" which we don't want to match. | 887 | | // | 888 | | // However, a string that begins with "0x" also begins with "0", which | 889 | | // is normally a valid match for the number zero. So we want these | 890 | | // strings to match zero unless fmt_flags is `scientific`. (This flag | 891 | | // means an exponent is required, which the string "0" does not have.) | 892 | 27 | if (fmt_flags == chars_format::scientific) { | 893 | 0 | result.ec = std::errc::invalid_argument; | 894 | 27 | } else { | 895 | 27 | result.ptr = first + 1; | 896 | 27 | value = negative ? -0.0 : 0.0; | 897 | 27 | } | 898 | 27 | return result; | 899 | 27 | } | 900 | | // We matched a value. | 901 | 5.12k | result.ptr = hex_parse.end; | 902 | 5.12k | if (HandleEdgeCase(hex_parse, negative, &value)) { | 903 | 704 | return result; | 904 | 704 | } | 905 | 4.41k | CalculatedFloat calculated = | 906 | 4.41k | CalculateFromParsedHexadecimal<FloatType>(hex_parse); | 907 | 4.41k | EncodeResult(calculated, negative, &result, &value); | 908 | 4.41k | return result; | 909 | 5.12k | } | 910 | | // Otherwise, we choose the number base based on the flags. | 911 | 12.4M | if ((fmt_flags & chars_format::hex) == chars_format::hex) { | 912 | 0 | strings_internal::ParsedFloat hex_parse = | 913 | 0 | strings_internal::ParseFloat<16>(first, last, fmt_flags); | 914 | 0 | if (hex_parse.end == nullptr) { | 915 | 0 | result.ec = std::errc::invalid_argument; | 916 | 0 | return result; | 917 | 0 | } | 918 | 0 | result.ptr = hex_parse.end; | 919 | 0 | if (HandleEdgeCase(hex_parse, negative, &value)) { | 920 | 0 | return result; | 921 | 0 | } | 922 | 0 | CalculatedFloat calculated = | 923 | 0 | CalculateFromParsedHexadecimal<FloatType>(hex_parse); | 924 | 0 | EncodeResult(calculated, negative, &result, &value); | 925 | 0 | return result; | 926 | 12.4M | } else { | 927 | 12.4M | strings_internal::ParsedFloat decimal_parse = | 928 | 12.4M | strings_internal::ParseFloat<10>(first, last, fmt_flags); | 929 | 12.4M | if (decimal_parse.end == nullptr) { | 930 | 2.21k | result.ec = std::errc::invalid_argument; | 931 | 2.21k | return result; | 932 | 2.21k | } | 933 | 12.4M | result.ptr = decimal_parse.end; | 934 | 12.4M | if (HandleEdgeCase(decimal_parse, negative, &value)) { | 935 | 645k | return result; | 936 | 645k | } | 937 | | // A nullptr subrange_begin means that the decimal_parse.mantissa is exact | 938 | | // (not truncated), a precondition of the Eisel-Lemire algorithm. | 939 | 11.8M | if ((decimal_parse.subrange_begin == nullptr) && | 940 | 11.8M | EiselLemire<FloatType>(decimal_parse, negative, &value, &result.ec)) { | 941 | 10.3M | return result; | 942 | 10.3M | } | 943 | 1.47M | CalculatedFloat calculated = | 944 | 1.47M | CalculateFromParsedDecimal<FloatType>(decimal_parse); | 945 | 1.47M | EncodeResult(calculated, negative, &result, &value); | 946 | 1.47M | return result; | 947 | 11.8M | } | 948 | 12.4M | } |
Unexecuted instantiation: charconv.cc:absl::from_chars_result absl::(anonymous namespace)::FromCharsImpl<float>(char const*, char const*, float&, absl::chars_format) |
949 | | } // namespace |
950 | | |
951 | | from_chars_result from_chars(absl::Nonnull<const char*> first, |
952 | | absl::Nonnull<const char*> last, double& value, |
953 | 12.4M | chars_format fmt) { |
954 | 12.4M | return FromCharsImpl(first, last, value, fmt); |
955 | 12.4M | } |
956 | | |
957 | | from_chars_result from_chars(absl::Nonnull<const char*> first, |
958 | | absl::Nonnull<const char*> last, float& value, |
959 | 0 | chars_format fmt) { |
960 | 0 | return FromCharsImpl(first, last, value, fmt); |
961 | 0 | } |
962 | | |
963 | | namespace { |
964 | | |
965 | | // Table of powers of 10, from kPower10TableMinInclusive to |
966 | | // kPower10TableMaxExclusive. |
967 | | // |
968 | | // kPower10MantissaHighTable[i - kPower10TableMinInclusive] stores the 64-bit |
969 | | // mantissa. The high bit is always on. |
970 | | // |
971 | | // kPower10MantissaLowTable extends that 64-bit mantissa to 128 bits. |
972 | | // |
973 | | // Power10Exponent(i) calculates the power-of-two exponent. |
974 | | // |
975 | | // For a number i, this gives the unique mantissaHigh and exponent such that |
976 | | // (mantissaHigh * 2**exponent) <= 10**i < ((mantissaHigh + 1) * 2**exponent). |
977 | | // |
978 | | // For example, Python can confirm that the exact hexadecimal value of 1e60 is: |
979 | | // >>> a = 1000000000000000000000000000000000000000000000000000000000000 |
980 | | // >>> hex(a) |
981 | | // '0x9f4f2726179a224501d762422c946590d91000000000000000' |
982 | | // Adding underscores at every 8th hex digit shows 50 hex digits: |
983 | | // '0x9f4f2726_179a2245_01d76242_2c946590_d9100000_00000000_00'. |
984 | | // In this case, the high bit of the first hex digit, 9, is coincidentally set, |
985 | | // so we do not have to do further shifting to deduce the 128-bit mantissa: |
986 | | // - kPower10MantissaHighTable[60 - kP10TMI] = 0x9f4f2726179a2245U |
987 | | // - kPower10MantissaLowTable[ 60 - kP10TMI] = 0x01d762422c946590U |
988 | | // where kP10TMI is kPower10TableMinInclusive. The low 18 of those 50 hex |
989 | | // digits are truncated. |
990 | | // |
991 | | // 50 hex digits (with the high bit set) is 200 bits and mantissaHigh holds 64 |
992 | | // bits, so Power10Exponent(60) = 200 - 64 = 136. Again, Python can confirm: |
993 | | // >>> b = 0x9f4f2726179a2245 |
994 | | // >>> ((b+0)<<136) <= a |
995 | | // True |
996 | | // >>> ((b+1)<<136) <= a |
997 | | // False |
998 | | // |
999 | | // The tables were generated by |
1000 | | // https://github.com/google/wuffs/blob/315b2e52625ebd7b02d8fac13e3cd85ea374fb80/script/print-mpb-powers-of-10.go |
1001 | | // after re-formatting its output into two arrays of N uint64_t values (instead |
1002 | | // of an N element array of uint64_t pairs). |
1003 | | |
1004 | | const uint64_t kPower10MantissaHighTable[] = { |
1005 | | 0xeef453d6923bd65aU, 0x9558b4661b6565f8U, 0xbaaee17fa23ebf76U, |
1006 | | 0xe95a99df8ace6f53U, 0x91d8a02bb6c10594U, 0xb64ec836a47146f9U, |
1007 | | 0xe3e27a444d8d98b7U, 0x8e6d8c6ab0787f72U, 0xb208ef855c969f4fU, |
1008 | | 0xde8b2b66b3bc4723U, 0x8b16fb203055ac76U, 0xaddcb9e83c6b1793U, |
1009 | | 0xd953e8624b85dd78U, 0x87d4713d6f33aa6bU, 0xa9c98d8ccb009506U, |
1010 | | 0xd43bf0effdc0ba48U, 0x84a57695fe98746dU, 0xa5ced43b7e3e9188U, |
1011 | | 0xcf42894a5dce35eaU, 0x818995ce7aa0e1b2U, 0xa1ebfb4219491a1fU, |
1012 | | 0xca66fa129f9b60a6U, 0xfd00b897478238d0U, 0x9e20735e8cb16382U, |
1013 | | 0xc5a890362fddbc62U, 0xf712b443bbd52b7bU, 0x9a6bb0aa55653b2dU, |
1014 | | 0xc1069cd4eabe89f8U, 0xf148440a256e2c76U, 0x96cd2a865764dbcaU, |
1015 | | 0xbc807527ed3e12bcU, 0xeba09271e88d976bU, 0x93445b8731587ea3U, |
1016 | | 0xb8157268fdae9e4cU, 0xe61acf033d1a45dfU, 0x8fd0c16206306babU, |
1017 | | 0xb3c4f1ba87bc8696U, 0xe0b62e2929aba83cU, 0x8c71dcd9ba0b4925U, |
1018 | | 0xaf8e5410288e1b6fU, 0xdb71e91432b1a24aU, 0x892731ac9faf056eU, |
1019 | | 0xab70fe17c79ac6caU, 0xd64d3d9db981787dU, 0x85f0468293f0eb4eU, |
1020 | | 0xa76c582338ed2621U, 0xd1476e2c07286faaU, 0x82cca4db847945caU, |
1021 | | 0xa37fce126597973cU, 0xcc5fc196fefd7d0cU, 0xff77b1fcbebcdc4fU, |
1022 | | 0x9faacf3df73609b1U, 0xc795830d75038c1dU, 0xf97ae3d0d2446f25U, |
1023 | | 0x9becce62836ac577U, 0xc2e801fb244576d5U, 0xf3a20279ed56d48aU, |
1024 | | 0x9845418c345644d6U, 0xbe5691ef416bd60cU, 0xedec366b11c6cb8fU, |
1025 | | 0x94b3a202eb1c3f39U, 0xb9e08a83a5e34f07U, 0xe858ad248f5c22c9U, |
1026 | | 0x91376c36d99995beU, 0xb58547448ffffb2dU, 0xe2e69915b3fff9f9U, |
1027 | | 0x8dd01fad907ffc3bU, 0xb1442798f49ffb4aU, 0xdd95317f31c7fa1dU, |
1028 | | 0x8a7d3eef7f1cfc52U, 0xad1c8eab5ee43b66U, 0xd863b256369d4a40U, |
1029 | | 0x873e4f75e2224e68U, 0xa90de3535aaae202U, 0xd3515c2831559a83U, |
1030 | | 0x8412d9991ed58091U, 0xa5178fff668ae0b6U, 0xce5d73ff402d98e3U, |
1031 | | 0x80fa687f881c7f8eU, 0xa139029f6a239f72U, 0xc987434744ac874eU, |
1032 | | 0xfbe9141915d7a922U, 0x9d71ac8fada6c9b5U, 0xc4ce17b399107c22U, |
1033 | | 0xf6019da07f549b2bU, 0x99c102844f94e0fbU, 0xc0314325637a1939U, |
1034 | | 0xf03d93eebc589f88U, 0x96267c7535b763b5U, 0xbbb01b9283253ca2U, |
1035 | | 0xea9c227723ee8bcbU, 0x92a1958a7675175fU, 0xb749faed14125d36U, |
1036 | | 0xe51c79a85916f484U, 0x8f31cc0937ae58d2U, 0xb2fe3f0b8599ef07U, |
1037 | | 0xdfbdcece67006ac9U, 0x8bd6a141006042bdU, 0xaecc49914078536dU, |
1038 | | 0xda7f5bf590966848U, 0x888f99797a5e012dU, 0xaab37fd7d8f58178U, |
1039 | | 0xd5605fcdcf32e1d6U, 0x855c3be0a17fcd26U, 0xa6b34ad8c9dfc06fU, |
1040 | | 0xd0601d8efc57b08bU, 0x823c12795db6ce57U, 0xa2cb1717b52481edU, |
1041 | | 0xcb7ddcdda26da268U, 0xfe5d54150b090b02U, 0x9efa548d26e5a6e1U, |
1042 | | 0xc6b8e9b0709f109aU, 0xf867241c8cc6d4c0U, 0x9b407691d7fc44f8U, |
1043 | | 0xc21094364dfb5636U, 0xf294b943e17a2bc4U, 0x979cf3ca6cec5b5aU, |
1044 | | 0xbd8430bd08277231U, 0xece53cec4a314ebdU, 0x940f4613ae5ed136U, |
1045 | | 0xb913179899f68584U, 0xe757dd7ec07426e5U, 0x9096ea6f3848984fU, |
1046 | | 0xb4bca50b065abe63U, 0xe1ebce4dc7f16dfbU, 0x8d3360f09cf6e4bdU, |
1047 | | 0xb080392cc4349decU, 0xdca04777f541c567U, 0x89e42caaf9491b60U, |
1048 | | 0xac5d37d5b79b6239U, 0xd77485cb25823ac7U, 0x86a8d39ef77164bcU, |
1049 | | 0xa8530886b54dbdebU, 0xd267caa862a12d66U, 0x8380dea93da4bc60U, |
1050 | | 0xa46116538d0deb78U, 0xcd795be870516656U, 0x806bd9714632dff6U, |
1051 | | 0xa086cfcd97bf97f3U, 0xc8a883c0fdaf7df0U, 0xfad2a4b13d1b5d6cU, |
1052 | | 0x9cc3a6eec6311a63U, 0xc3f490aa77bd60fcU, 0xf4f1b4d515acb93bU, |
1053 | | 0x991711052d8bf3c5U, 0xbf5cd54678eef0b6U, 0xef340a98172aace4U, |
1054 | | 0x9580869f0e7aac0eU, 0xbae0a846d2195712U, 0xe998d258869facd7U, |
1055 | | 0x91ff83775423cc06U, 0xb67f6455292cbf08U, 0xe41f3d6a7377eecaU, |
1056 | | 0x8e938662882af53eU, 0xb23867fb2a35b28dU, 0xdec681f9f4c31f31U, |
1057 | | 0x8b3c113c38f9f37eU, 0xae0b158b4738705eU, 0xd98ddaee19068c76U, |
1058 | | 0x87f8a8d4cfa417c9U, 0xa9f6d30a038d1dbcU, 0xd47487cc8470652bU, |
1059 | | 0x84c8d4dfd2c63f3bU, 0xa5fb0a17c777cf09U, 0xcf79cc9db955c2ccU, |
1060 | | 0x81ac1fe293d599bfU, 0xa21727db38cb002fU, 0xca9cf1d206fdc03bU, |
1061 | | 0xfd442e4688bd304aU, 0x9e4a9cec15763e2eU, 0xc5dd44271ad3cdbaU, |
1062 | | 0xf7549530e188c128U, 0x9a94dd3e8cf578b9U, 0xc13a148e3032d6e7U, |
1063 | | 0xf18899b1bc3f8ca1U, 0x96f5600f15a7b7e5U, 0xbcb2b812db11a5deU, |
1064 | | 0xebdf661791d60f56U, 0x936b9fcebb25c995U, 0xb84687c269ef3bfbU, |
1065 | | 0xe65829b3046b0afaU, 0x8ff71a0fe2c2e6dcU, 0xb3f4e093db73a093U, |
1066 | | 0xe0f218b8d25088b8U, 0x8c974f7383725573U, 0xafbd2350644eeacfU, |
1067 | | 0xdbac6c247d62a583U, 0x894bc396ce5da772U, 0xab9eb47c81f5114fU, |
1068 | | 0xd686619ba27255a2U, 0x8613fd0145877585U, 0xa798fc4196e952e7U, |
1069 | | 0xd17f3b51fca3a7a0U, 0x82ef85133de648c4U, 0xa3ab66580d5fdaf5U, |
1070 | | 0xcc963fee10b7d1b3U, 0xffbbcfe994e5c61fU, 0x9fd561f1fd0f9bd3U, |
1071 | | 0xc7caba6e7c5382c8U, 0xf9bd690a1b68637bU, 0x9c1661a651213e2dU, |
1072 | | 0xc31bfa0fe5698db8U, 0xf3e2f893dec3f126U, 0x986ddb5c6b3a76b7U, |
1073 | | 0xbe89523386091465U, 0xee2ba6c0678b597fU, 0x94db483840b717efU, |
1074 | | 0xba121a4650e4ddebU, 0xe896a0d7e51e1566U, 0x915e2486ef32cd60U, |
1075 | | 0xb5b5ada8aaff80b8U, 0xe3231912d5bf60e6U, 0x8df5efabc5979c8fU, |
1076 | | 0xb1736b96b6fd83b3U, 0xddd0467c64bce4a0U, 0x8aa22c0dbef60ee4U, |
1077 | | 0xad4ab7112eb3929dU, 0xd89d64d57a607744U, 0x87625f056c7c4a8bU, |
1078 | | 0xa93af6c6c79b5d2dU, 0xd389b47879823479U, 0x843610cb4bf160cbU, |
1079 | | 0xa54394fe1eedb8feU, 0xce947a3da6a9273eU, 0x811ccc668829b887U, |
1080 | | 0xa163ff802a3426a8U, 0xc9bcff6034c13052U, 0xfc2c3f3841f17c67U, |
1081 | | 0x9d9ba7832936edc0U, 0xc5029163f384a931U, 0xf64335bcf065d37dU, |
1082 | | 0x99ea0196163fa42eU, 0xc06481fb9bcf8d39U, 0xf07da27a82c37088U, |
1083 | | 0x964e858c91ba2655U, 0xbbe226efb628afeaU, 0xeadab0aba3b2dbe5U, |
1084 | | 0x92c8ae6b464fc96fU, 0xb77ada0617e3bbcbU, 0xe55990879ddcaabdU, |
1085 | | 0x8f57fa54c2a9eab6U, 0xb32df8e9f3546564U, 0xdff9772470297ebdU, |
1086 | | 0x8bfbea76c619ef36U, 0xaefae51477a06b03U, 0xdab99e59958885c4U, |
1087 | | 0x88b402f7fd75539bU, 0xaae103b5fcd2a881U, 0xd59944a37c0752a2U, |
1088 | | 0x857fcae62d8493a5U, 0xa6dfbd9fb8e5b88eU, 0xd097ad07a71f26b2U, |
1089 | | 0x825ecc24c873782fU, 0xa2f67f2dfa90563bU, 0xcbb41ef979346bcaU, |
1090 | | 0xfea126b7d78186bcU, 0x9f24b832e6b0f436U, 0xc6ede63fa05d3143U, |
1091 | | 0xf8a95fcf88747d94U, 0x9b69dbe1b548ce7cU, 0xc24452da229b021bU, |
1092 | | 0xf2d56790ab41c2a2U, 0x97c560ba6b0919a5U, 0xbdb6b8e905cb600fU, |
1093 | | 0xed246723473e3813U, 0x9436c0760c86e30bU, 0xb94470938fa89bceU, |
1094 | | 0xe7958cb87392c2c2U, 0x90bd77f3483bb9b9U, 0xb4ecd5f01a4aa828U, |
1095 | | 0xe2280b6c20dd5232U, 0x8d590723948a535fU, 0xb0af48ec79ace837U, |
1096 | | 0xdcdb1b2798182244U, 0x8a08f0f8bf0f156bU, 0xac8b2d36eed2dac5U, |
1097 | | 0xd7adf884aa879177U, 0x86ccbb52ea94baeaU, 0xa87fea27a539e9a5U, |
1098 | | 0xd29fe4b18e88640eU, 0x83a3eeeef9153e89U, 0xa48ceaaab75a8e2bU, |
1099 | | 0xcdb02555653131b6U, 0x808e17555f3ebf11U, 0xa0b19d2ab70e6ed6U, |
1100 | | 0xc8de047564d20a8bU, 0xfb158592be068d2eU, 0x9ced737bb6c4183dU, |
1101 | | 0xc428d05aa4751e4cU, 0xf53304714d9265dfU, 0x993fe2c6d07b7fabU, |
1102 | | 0xbf8fdb78849a5f96U, 0xef73d256a5c0f77cU, 0x95a8637627989aadU, |
1103 | | 0xbb127c53b17ec159U, 0xe9d71b689dde71afU, 0x9226712162ab070dU, |
1104 | | 0xb6b00d69bb55c8d1U, 0xe45c10c42a2b3b05U, 0x8eb98a7a9a5b04e3U, |
1105 | | 0xb267ed1940f1c61cU, 0xdf01e85f912e37a3U, 0x8b61313bbabce2c6U, |
1106 | | 0xae397d8aa96c1b77U, 0xd9c7dced53c72255U, 0x881cea14545c7575U, |
1107 | | 0xaa242499697392d2U, 0xd4ad2dbfc3d07787U, 0x84ec3c97da624ab4U, |
1108 | | 0xa6274bbdd0fadd61U, 0xcfb11ead453994baU, 0x81ceb32c4b43fcf4U, |
1109 | | 0xa2425ff75e14fc31U, 0xcad2f7f5359a3b3eU, 0xfd87b5f28300ca0dU, |
1110 | | 0x9e74d1b791e07e48U, 0xc612062576589ddaU, 0xf79687aed3eec551U, |
1111 | | 0x9abe14cd44753b52U, 0xc16d9a0095928a27U, 0xf1c90080baf72cb1U, |
1112 | | 0x971da05074da7beeU, 0xbce5086492111aeaU, 0xec1e4a7db69561a5U, |
1113 | | 0x9392ee8e921d5d07U, 0xb877aa3236a4b449U, 0xe69594bec44de15bU, |
1114 | | 0x901d7cf73ab0acd9U, 0xb424dc35095cd80fU, 0xe12e13424bb40e13U, |
1115 | | 0x8cbccc096f5088cbU, 0xafebff0bcb24aafeU, 0xdbe6fecebdedd5beU, |
1116 | | 0x89705f4136b4a597U, 0xabcc77118461cefcU, 0xd6bf94d5e57a42bcU, |
1117 | | 0x8637bd05af6c69b5U, 0xa7c5ac471b478423U, 0xd1b71758e219652bU, |
1118 | | 0x83126e978d4fdf3bU, 0xa3d70a3d70a3d70aU, 0xccccccccccccccccU, |
1119 | | 0x8000000000000000U, 0xa000000000000000U, 0xc800000000000000U, |
1120 | | 0xfa00000000000000U, 0x9c40000000000000U, 0xc350000000000000U, |
1121 | | 0xf424000000000000U, 0x9896800000000000U, 0xbebc200000000000U, |
1122 | | 0xee6b280000000000U, 0x9502f90000000000U, 0xba43b74000000000U, |
1123 | | 0xe8d4a51000000000U, 0x9184e72a00000000U, 0xb5e620f480000000U, |
1124 | | 0xe35fa931a0000000U, 0x8e1bc9bf04000000U, 0xb1a2bc2ec5000000U, |
1125 | | 0xde0b6b3a76400000U, 0x8ac7230489e80000U, 0xad78ebc5ac620000U, |
1126 | | 0xd8d726b7177a8000U, 0x878678326eac9000U, 0xa968163f0a57b400U, |
1127 | | 0xd3c21bcecceda100U, 0x84595161401484a0U, 0xa56fa5b99019a5c8U, |
1128 | | 0xcecb8f27f4200f3aU, 0x813f3978f8940984U, 0xa18f07d736b90be5U, |
1129 | | 0xc9f2c9cd04674edeU, 0xfc6f7c4045812296U, 0x9dc5ada82b70b59dU, |
1130 | | 0xc5371912364ce305U, 0xf684df56c3e01bc6U, 0x9a130b963a6c115cU, |
1131 | | 0xc097ce7bc90715b3U, 0xf0bdc21abb48db20U, 0x96769950b50d88f4U, |
1132 | | 0xbc143fa4e250eb31U, 0xeb194f8e1ae525fdU, 0x92efd1b8d0cf37beU, |
1133 | | 0xb7abc627050305adU, 0xe596b7b0c643c719U, 0x8f7e32ce7bea5c6fU, |
1134 | | 0xb35dbf821ae4f38bU, 0xe0352f62a19e306eU, 0x8c213d9da502de45U, |
1135 | | 0xaf298d050e4395d6U, 0xdaf3f04651d47b4cU, 0x88d8762bf324cd0fU, |
1136 | | 0xab0e93b6efee0053U, 0xd5d238a4abe98068U, 0x85a36366eb71f041U, |
1137 | | 0xa70c3c40a64e6c51U, 0xd0cf4b50cfe20765U, 0x82818f1281ed449fU, |
1138 | | 0xa321f2d7226895c7U, 0xcbea6f8ceb02bb39U, 0xfee50b7025c36a08U, |
1139 | | 0x9f4f2726179a2245U, 0xc722f0ef9d80aad6U, 0xf8ebad2b84e0d58bU, |
1140 | | 0x9b934c3b330c8577U, 0xc2781f49ffcfa6d5U, 0xf316271c7fc3908aU, |
1141 | | 0x97edd871cfda3a56U, 0xbde94e8e43d0c8ecU, 0xed63a231d4c4fb27U, |
1142 | | 0x945e455f24fb1cf8U, 0xb975d6b6ee39e436U, 0xe7d34c64a9c85d44U, |
1143 | | 0x90e40fbeea1d3a4aU, 0xb51d13aea4a488ddU, 0xe264589a4dcdab14U, |
1144 | | 0x8d7eb76070a08aecU, 0xb0de65388cc8ada8U, 0xdd15fe86affad912U, |
1145 | | 0x8a2dbf142dfcc7abU, 0xacb92ed9397bf996U, 0xd7e77a8f87daf7fbU, |
1146 | | 0x86f0ac99b4e8dafdU, 0xa8acd7c0222311bcU, 0xd2d80db02aabd62bU, |
1147 | | 0x83c7088e1aab65dbU, 0xa4b8cab1a1563f52U, 0xcde6fd5e09abcf26U, |
1148 | | 0x80b05e5ac60b6178U, 0xa0dc75f1778e39d6U, 0xc913936dd571c84cU, |
1149 | | 0xfb5878494ace3a5fU, 0x9d174b2dcec0e47bU, 0xc45d1df942711d9aU, |
1150 | | 0xf5746577930d6500U, 0x9968bf6abbe85f20U, 0xbfc2ef456ae276e8U, |
1151 | | 0xefb3ab16c59b14a2U, 0x95d04aee3b80ece5U, 0xbb445da9ca61281fU, |
1152 | | 0xea1575143cf97226U, 0x924d692ca61be758U, 0xb6e0c377cfa2e12eU, |
1153 | | 0xe498f455c38b997aU, 0x8edf98b59a373fecU, 0xb2977ee300c50fe7U, |
1154 | | 0xdf3d5e9bc0f653e1U, 0x8b865b215899f46cU, 0xae67f1e9aec07187U, |
1155 | | 0xda01ee641a708de9U, 0x884134fe908658b2U, 0xaa51823e34a7eedeU, |
1156 | | 0xd4e5e2cdc1d1ea96U, 0x850fadc09923329eU, 0xa6539930bf6bff45U, |
1157 | | 0xcfe87f7cef46ff16U, 0x81f14fae158c5f6eU, 0xa26da3999aef7749U, |
1158 | | 0xcb090c8001ab551cU, 0xfdcb4fa002162a63U, 0x9e9f11c4014dda7eU, |
1159 | | 0xc646d63501a1511dU, 0xf7d88bc24209a565U, 0x9ae757596946075fU, |
1160 | | 0xc1a12d2fc3978937U, 0xf209787bb47d6b84U, 0x9745eb4d50ce6332U, |
1161 | | 0xbd176620a501fbffU, 0xec5d3fa8ce427affU, 0x93ba47c980e98cdfU, |
1162 | | 0xb8a8d9bbe123f017U, 0xe6d3102ad96cec1dU, 0x9043ea1ac7e41392U, |
1163 | | 0xb454e4a179dd1877U, 0xe16a1dc9d8545e94U, 0x8ce2529e2734bb1dU, |
1164 | | 0xb01ae745b101e9e4U, 0xdc21a1171d42645dU, 0x899504ae72497ebaU, |
1165 | | 0xabfa45da0edbde69U, 0xd6f8d7509292d603U, 0x865b86925b9bc5c2U, |
1166 | | 0xa7f26836f282b732U, 0xd1ef0244af2364ffU, 0x8335616aed761f1fU, |
1167 | | 0xa402b9c5a8d3a6e7U, 0xcd036837130890a1U, 0x802221226be55a64U, |
1168 | | 0xa02aa96b06deb0fdU, 0xc83553c5c8965d3dU, 0xfa42a8b73abbf48cU, |
1169 | | 0x9c69a97284b578d7U, 0xc38413cf25e2d70dU, 0xf46518c2ef5b8cd1U, |
1170 | | 0x98bf2f79d5993802U, 0xbeeefb584aff8603U, 0xeeaaba2e5dbf6784U, |
1171 | | 0x952ab45cfa97a0b2U, 0xba756174393d88dfU, 0xe912b9d1478ceb17U, |
1172 | | 0x91abb422ccb812eeU, 0xb616a12b7fe617aaU, 0xe39c49765fdf9d94U, |
1173 | | 0x8e41ade9fbebc27dU, 0xb1d219647ae6b31cU, 0xde469fbd99a05fe3U, |
1174 | | 0x8aec23d680043beeU, 0xada72ccc20054ae9U, 0xd910f7ff28069da4U, |
1175 | | 0x87aa9aff79042286U, 0xa99541bf57452b28U, 0xd3fa922f2d1675f2U, |
1176 | | 0x847c9b5d7c2e09b7U, 0xa59bc234db398c25U, 0xcf02b2c21207ef2eU, |
1177 | | 0x8161afb94b44f57dU, 0xa1ba1ba79e1632dcU, 0xca28a291859bbf93U, |
1178 | | 0xfcb2cb35e702af78U, 0x9defbf01b061adabU, 0xc56baec21c7a1916U, |
1179 | | 0xf6c69a72a3989f5bU, 0x9a3c2087a63f6399U, 0xc0cb28a98fcf3c7fU, |
1180 | | 0xf0fdf2d3f3c30b9fU, 0x969eb7c47859e743U, 0xbc4665b596706114U, |
1181 | | 0xeb57ff22fc0c7959U, 0x9316ff75dd87cbd8U, 0xb7dcbf5354e9beceU, |
1182 | | 0xe5d3ef282a242e81U, 0x8fa475791a569d10U, 0xb38d92d760ec4455U, |
1183 | | 0xe070f78d3927556aU, 0x8c469ab843b89562U, 0xaf58416654a6babbU, |
1184 | | 0xdb2e51bfe9d0696aU, 0x88fcf317f22241e2U, 0xab3c2fddeeaad25aU, |
1185 | | 0xd60b3bd56a5586f1U, 0x85c7056562757456U, 0xa738c6bebb12d16cU, |
1186 | | 0xd106f86e69d785c7U, 0x82a45b450226b39cU, 0xa34d721642b06084U, |
1187 | | 0xcc20ce9bd35c78a5U, 0xff290242c83396ceU, 0x9f79a169bd203e41U, |
1188 | | 0xc75809c42c684dd1U, 0xf92e0c3537826145U, 0x9bbcc7a142b17ccbU, |
1189 | | 0xc2abf989935ddbfeU, 0xf356f7ebf83552feU, 0x98165af37b2153deU, |
1190 | | 0xbe1bf1b059e9a8d6U, 0xeda2ee1c7064130cU, 0x9485d4d1c63e8be7U, |
1191 | | 0xb9a74a0637ce2ee1U, 0xe8111c87c5c1ba99U, 0x910ab1d4db9914a0U, |
1192 | | 0xb54d5e4a127f59c8U, 0xe2a0b5dc971f303aU, 0x8da471a9de737e24U, |
1193 | | 0xb10d8e1456105dadU, 0xdd50f1996b947518U, 0x8a5296ffe33cc92fU, |
1194 | | 0xace73cbfdc0bfb7bU, 0xd8210befd30efa5aU, 0x8714a775e3e95c78U, |
1195 | | 0xa8d9d1535ce3b396U, 0xd31045a8341ca07cU, 0x83ea2b892091e44dU, |
1196 | | 0xa4e4b66b68b65d60U, 0xce1de40642e3f4b9U, 0x80d2ae83e9ce78f3U, |
1197 | | 0xa1075a24e4421730U, 0xc94930ae1d529cfcU, 0xfb9b7cd9a4a7443cU, |
1198 | | 0x9d412e0806e88aa5U, 0xc491798a08a2ad4eU, 0xf5b5d7ec8acb58a2U, |
1199 | | 0x9991a6f3d6bf1765U, 0xbff610b0cc6edd3fU, 0xeff394dcff8a948eU, |
1200 | | 0x95f83d0a1fb69cd9U, 0xbb764c4ca7a4440fU, 0xea53df5fd18d5513U, |
1201 | | 0x92746b9be2f8552cU, 0xb7118682dbb66a77U, 0xe4d5e82392a40515U, |
1202 | | 0x8f05b1163ba6832dU, 0xb2c71d5bca9023f8U, 0xdf78e4b2bd342cf6U, |
1203 | | 0x8bab8eefb6409c1aU, 0xae9672aba3d0c320U, 0xda3c0f568cc4f3e8U, |
1204 | | 0x8865899617fb1871U, 0xaa7eebfb9df9de8dU, 0xd51ea6fa85785631U, |
1205 | | 0x8533285c936b35deU, 0xa67ff273b8460356U, 0xd01fef10a657842cU, |
1206 | | 0x8213f56a67f6b29bU, 0xa298f2c501f45f42U, 0xcb3f2f7642717713U, |
1207 | | 0xfe0efb53d30dd4d7U, 0x9ec95d1463e8a506U, 0xc67bb4597ce2ce48U, |
1208 | | 0xf81aa16fdc1b81daU, 0x9b10a4e5e9913128U, 0xc1d4ce1f63f57d72U, |
1209 | | 0xf24a01a73cf2dccfU, 0x976e41088617ca01U, 0xbd49d14aa79dbc82U, |
1210 | | 0xec9c459d51852ba2U, 0x93e1ab8252f33b45U, 0xb8da1662e7b00a17U, |
1211 | | 0xe7109bfba19c0c9dU, 0x906a617d450187e2U, 0xb484f9dc9641e9daU, |
1212 | | 0xe1a63853bbd26451U, 0x8d07e33455637eb2U, 0xb049dc016abc5e5fU, |
1213 | | 0xdc5c5301c56b75f7U, 0x89b9b3e11b6329baU, 0xac2820d9623bf429U, |
1214 | | 0xd732290fbacaf133U, 0x867f59a9d4bed6c0U, 0xa81f301449ee8c70U, |
1215 | | 0xd226fc195c6a2f8cU, 0x83585d8fd9c25db7U, 0xa42e74f3d032f525U, |
1216 | | 0xcd3a1230c43fb26fU, 0x80444b5e7aa7cf85U, 0xa0555e361951c366U, |
1217 | | 0xc86ab5c39fa63440U, 0xfa856334878fc150U, 0x9c935e00d4b9d8d2U, |
1218 | | 0xc3b8358109e84f07U, 0xf4a642e14c6262c8U, 0x98e7e9cccfbd7dbdU, |
1219 | | 0xbf21e44003acdd2cU, 0xeeea5d5004981478U, 0x95527a5202df0ccbU, |
1220 | | 0xbaa718e68396cffdU, 0xe950df20247c83fdU, 0x91d28b7416cdd27eU, |
1221 | | 0xb6472e511c81471dU, 0xe3d8f9e563a198e5U, 0x8e679c2f5e44ff8fU, |
1222 | | }; |
1223 | | |
1224 | | const uint64_t kPower10MantissaLowTable[] = { |
1225 | | 0x113faa2906a13b3fU, 0x4ac7ca59a424c507U, 0x5d79bcf00d2df649U, |
1226 | | 0xf4d82c2c107973dcU, 0x79071b9b8a4be869U, 0x9748e2826cdee284U, |
1227 | | 0xfd1b1b2308169b25U, 0xfe30f0f5e50e20f7U, 0xbdbd2d335e51a935U, |
1228 | | 0xad2c788035e61382U, 0x4c3bcb5021afcc31U, 0xdf4abe242a1bbf3dU, |
1229 | | 0xd71d6dad34a2af0dU, 0x8672648c40e5ad68U, 0x680efdaf511f18c2U, |
1230 | | 0x0212bd1b2566def2U, 0x014bb630f7604b57U, 0x419ea3bd35385e2dU, |
1231 | | 0x52064cac828675b9U, 0x7343efebd1940993U, 0x1014ebe6c5f90bf8U, |
1232 | | 0xd41a26e077774ef6U, 0x8920b098955522b4U, 0x55b46e5f5d5535b0U, |
1233 | | 0xeb2189f734aa831dU, 0xa5e9ec7501d523e4U, 0x47b233c92125366eU, |
1234 | | 0x999ec0bb696e840aU, 0xc00670ea43ca250dU, 0x380406926a5e5728U, |
1235 | | 0xc605083704f5ecf2U, 0xf7864a44c633682eU, 0x7ab3ee6afbe0211dU, |
1236 | | 0x5960ea05bad82964U, 0x6fb92487298e33bdU, 0xa5d3b6d479f8e056U, |
1237 | | 0x8f48a4899877186cU, 0x331acdabfe94de87U, 0x9ff0c08b7f1d0b14U, |
1238 | | 0x07ecf0ae5ee44dd9U, 0xc9e82cd9f69d6150U, 0xbe311c083a225cd2U, |
1239 | | 0x6dbd630a48aaf406U, 0x092cbbccdad5b108U, 0x25bbf56008c58ea5U, |
1240 | | 0xaf2af2b80af6f24eU, 0x1af5af660db4aee1U, 0x50d98d9fc890ed4dU, |
1241 | | 0xe50ff107bab528a0U, 0x1e53ed49a96272c8U, 0x25e8e89c13bb0f7aU, |
1242 | | 0x77b191618c54e9acU, 0xd59df5b9ef6a2417U, 0x4b0573286b44ad1dU, |
1243 | | 0x4ee367f9430aec32U, 0x229c41f793cda73fU, 0x6b43527578c1110fU, |
1244 | | 0x830a13896b78aaa9U, 0x23cc986bc656d553U, 0x2cbfbe86b7ec8aa8U, |
1245 | | 0x7bf7d71432f3d6a9U, 0xdaf5ccd93fb0cc53U, 0xd1b3400f8f9cff68U, |
1246 | | 0x23100809b9c21fa1U, 0xabd40a0c2832a78aU, 0x16c90c8f323f516cU, |
1247 | | 0xae3da7d97f6792e3U, 0x99cd11cfdf41779cU, 0x40405643d711d583U, |
1248 | | 0x482835ea666b2572U, 0xda3243650005eecfU, 0x90bed43e40076a82U, |
1249 | | 0x5a7744a6e804a291U, 0x711515d0a205cb36U, 0x0d5a5b44ca873e03U, |
1250 | | 0xe858790afe9486c2U, 0x626e974dbe39a872U, 0xfb0a3d212dc8128fU, |
1251 | | 0x7ce66634bc9d0b99U, 0x1c1fffc1ebc44e80U, 0xa327ffb266b56220U, |
1252 | | 0x4bf1ff9f0062baa8U, 0x6f773fc3603db4a9U, 0xcb550fb4384d21d3U, |
1253 | | 0x7e2a53a146606a48U, 0x2eda7444cbfc426dU, 0xfa911155fefb5308U, |
1254 | | 0x793555ab7eba27caU, 0x4bc1558b2f3458deU, 0x9eb1aaedfb016f16U, |
1255 | | 0x465e15a979c1cadcU, 0x0bfacd89ec191ec9U, 0xcef980ec671f667bU, |
1256 | | 0x82b7e12780e7401aU, 0xd1b2ecb8b0908810U, 0x861fa7e6dcb4aa15U, |
1257 | | 0x67a791e093e1d49aU, 0xe0c8bb2c5c6d24e0U, 0x58fae9f773886e18U, |
1258 | | 0xaf39a475506a899eU, 0x6d8406c952429603U, 0xc8e5087ba6d33b83U, |
1259 | | 0xfb1e4a9a90880a64U, 0x5cf2eea09a55067fU, 0xf42faa48c0ea481eU, |
1260 | | 0xf13b94daf124da26U, 0x76c53d08d6b70858U, 0x54768c4b0c64ca6eU, |
1261 | | 0xa9942f5dcf7dfd09U, 0xd3f93b35435d7c4cU, 0xc47bc5014a1a6dafU, |
1262 | | 0x359ab6419ca1091bU, 0xc30163d203c94b62U, 0x79e0de63425dcf1dU, |
1263 | | 0x985915fc12f542e4U, 0x3e6f5b7b17b2939dU, 0xa705992ceecf9c42U, |
1264 | | 0x50c6ff782a838353U, 0xa4f8bf5635246428U, 0x871b7795e136be99U, |
1265 | | 0x28e2557b59846e3fU, 0x331aeada2fe589cfU, 0x3ff0d2c85def7621U, |
1266 | | 0x0fed077a756b53a9U, 0xd3e8495912c62894U, 0x64712dd7abbbd95cU, |
1267 | | 0xbd8d794d96aacfb3U, 0xecf0d7a0fc5583a0U, 0xf41686c49db57244U, |
1268 | | 0x311c2875c522ced5U, 0x7d633293366b828bU, 0xae5dff9c02033197U, |
1269 | | 0xd9f57f830283fdfcU, 0xd072df63c324fd7bU, 0x4247cb9e59f71e6dU, |
1270 | | 0x52d9be85f074e608U, 0x67902e276c921f8bU, 0x00ba1cd8a3db53b6U, |
1271 | | 0x80e8a40eccd228a4U, 0x6122cd128006b2cdU, 0x796b805720085f81U, |
1272 | | 0xcbe3303674053bb0U, 0xbedbfc4411068a9cU, 0xee92fb5515482d44U, |
1273 | | 0x751bdd152d4d1c4aU, 0xd262d45a78a0635dU, 0x86fb897116c87c34U, |
1274 | | 0xd45d35e6ae3d4da0U, 0x8974836059cca109U, 0x2bd1a438703fc94bU, |
1275 | | 0x7b6306a34627ddcfU, 0x1a3bc84c17b1d542U, 0x20caba5f1d9e4a93U, |
1276 | | 0x547eb47b7282ee9cU, 0xe99e619a4f23aa43U, 0x6405fa00e2ec94d4U, |
1277 | | 0xde83bc408dd3dd04U, 0x9624ab50b148d445U, 0x3badd624dd9b0957U, |
1278 | | 0xe54ca5d70a80e5d6U, 0x5e9fcf4ccd211f4cU, 0x7647c3200069671fU, |
1279 | | 0x29ecd9f40041e073U, 0xf468107100525890U, 0x7182148d4066eeb4U, |
1280 | | 0xc6f14cd848405530U, 0xb8ada00e5a506a7cU, 0xa6d90811f0e4851cU, |
1281 | | 0x908f4a166d1da663U, 0x9a598e4e043287feU, 0x40eff1e1853f29fdU, |
1282 | | 0xd12bee59e68ef47cU, 0x82bb74f8301958ceU, 0xe36a52363c1faf01U, |
1283 | | 0xdc44e6c3cb279ac1U, 0x29ab103a5ef8c0b9U, 0x7415d448f6b6f0e7U, |
1284 | | 0x111b495b3464ad21U, 0xcab10dd900beec34U, 0x3d5d514f40eea742U, |
1285 | | 0x0cb4a5a3112a5112U, 0x47f0e785eaba72abU, 0x59ed216765690f56U, |
1286 | | 0x306869c13ec3532cU, 0x1e414218c73a13fbU, 0xe5d1929ef90898faU, |
1287 | | 0xdf45f746b74abf39U, 0x6b8bba8c328eb783U, 0x066ea92f3f326564U, |
1288 | | 0xc80a537b0efefebdU, 0xbd06742ce95f5f36U, 0x2c48113823b73704U, |
1289 | | 0xf75a15862ca504c5U, 0x9a984d73dbe722fbU, 0xc13e60d0d2e0ebbaU, |
1290 | | 0x318df905079926a8U, 0xfdf17746497f7052U, 0xfeb6ea8bedefa633U, |
1291 | | 0xfe64a52ee96b8fc0U, 0x3dfdce7aa3c673b0U, 0x06bea10ca65c084eU, |
1292 | | 0x486e494fcff30a62U, 0x5a89dba3c3efccfaU, 0xf89629465a75e01cU, |
1293 | | 0xf6bbb397f1135823U, 0x746aa07ded582e2cU, 0xa8c2a44eb4571cdcU, |
1294 | | 0x92f34d62616ce413U, 0x77b020baf9c81d17U, 0x0ace1474dc1d122eU, |
1295 | | 0x0d819992132456baU, 0x10e1fff697ed6c69U, 0xca8d3ffa1ef463c1U, |
1296 | | 0xbd308ff8a6b17cb2U, 0xac7cb3f6d05ddbdeU, 0x6bcdf07a423aa96bU, |
1297 | | 0x86c16c98d2c953c6U, 0xe871c7bf077ba8b7U, 0x11471cd764ad4972U, |
1298 | | 0xd598e40d3dd89bcfU, 0x4aff1d108d4ec2c3U, 0xcedf722a585139baU, |
1299 | | 0xc2974eb4ee658828U, 0x733d226229feea32U, 0x0806357d5a3f525fU, |
1300 | | 0xca07c2dcb0cf26f7U, 0xfc89b393dd02f0b5U, 0xbbac2078d443ace2U, |
1301 | | 0xd54b944b84aa4c0dU, 0x0a9e795e65d4df11U, 0x4d4617b5ff4a16d5U, |
1302 | | 0x504bced1bf8e4e45U, 0xe45ec2862f71e1d6U, 0x5d767327bb4e5a4cU, |
1303 | | 0x3a6a07f8d510f86fU, 0x890489f70a55368bU, 0x2b45ac74ccea842eU, |
1304 | | 0x3b0b8bc90012929dU, 0x09ce6ebb40173744U, 0xcc420a6a101d0515U, |
1305 | | 0x9fa946824a12232dU, 0x47939822dc96abf9U, 0x59787e2b93bc56f7U, |
1306 | | 0x57eb4edb3c55b65aU, 0xede622920b6b23f1U, 0xe95fab368e45ecedU, |
1307 | | 0x11dbcb0218ebb414U, 0xd652bdc29f26a119U, 0x4be76d3346f0495fU, |
1308 | | 0x6f70a4400c562ddbU, 0xcb4ccd500f6bb952U, 0x7e2000a41346a7a7U, |
1309 | | 0x8ed400668c0c28c8U, 0x728900802f0f32faU, 0x4f2b40a03ad2ffb9U, |
1310 | | 0xe2f610c84987bfa8U, 0x0dd9ca7d2df4d7c9U, 0x91503d1c79720dbbU, |
1311 | | 0x75a44c6397ce912aU, 0xc986afbe3ee11abaU, 0xfbe85badce996168U, |
1312 | | 0xfae27299423fb9c3U, 0xdccd879fc967d41aU, 0x5400e987bbc1c920U, |
1313 | | 0x290123e9aab23b68U, 0xf9a0b6720aaf6521U, 0xf808e40e8d5b3e69U, |
1314 | | 0xb60b1d1230b20e04U, 0xb1c6f22b5e6f48c2U, 0x1e38aeb6360b1af3U, |
1315 | | 0x25c6da63c38de1b0U, 0x579c487e5a38ad0eU, 0x2d835a9df0c6d851U, |
1316 | | 0xf8e431456cf88e65U, 0x1b8e9ecb641b58ffU, 0xe272467e3d222f3fU, |
1317 | | 0x5b0ed81dcc6abb0fU, 0x98e947129fc2b4e9U, 0x3f2398d747b36224U, |
1318 | | 0x8eec7f0d19a03aadU, 0x1953cf68300424acU, 0x5fa8c3423c052dd7U, |
1319 | | 0x3792f412cb06794dU, 0xe2bbd88bbee40bd0U, 0x5b6aceaeae9d0ec4U, |
1320 | | 0xf245825a5a445275U, 0xeed6e2f0f0d56712U, 0x55464dd69685606bU, |
1321 | | 0xaa97e14c3c26b886U, 0xd53dd99f4b3066a8U, 0xe546a8038efe4029U, |
1322 | | 0xde98520472bdd033U, 0x963e66858f6d4440U, 0xdde7001379a44aa8U, |
1323 | | 0x5560c018580d5d52U, 0xaab8f01e6e10b4a6U, 0xcab3961304ca70e8U, |
1324 | | 0x3d607b97c5fd0d22U, 0x8cb89a7db77c506aU, 0x77f3608e92adb242U, |
1325 | | 0x55f038b237591ed3U, 0x6b6c46dec52f6688U, 0x2323ac4b3b3da015U, |
1326 | | 0xabec975e0a0d081aU, 0x96e7bd358c904a21U, 0x7e50d64177da2e54U, |
1327 | | 0xdde50bd1d5d0b9e9U, 0x955e4ec64b44e864U, 0xbd5af13bef0b113eU, |
1328 | | 0xecb1ad8aeacdd58eU, 0x67de18eda5814af2U, 0x80eacf948770ced7U, |
1329 | | 0xa1258379a94d028dU, 0x096ee45813a04330U, 0x8bca9d6e188853fcU, |
1330 | | 0x775ea264cf55347dU, 0x95364afe032a819dU, 0x3a83ddbd83f52204U, |
1331 | | 0xc4926a9672793542U, 0x75b7053c0f178293U, 0x5324c68b12dd6338U, |
1332 | | 0xd3f6fc16ebca5e03U, 0x88f4bb1ca6bcf584U, 0x2b31e9e3d06c32e5U, |
1333 | | 0x3aff322e62439fcfU, 0x09befeb9fad487c2U, 0x4c2ebe687989a9b3U, |
1334 | | 0x0f9d37014bf60a10U, 0x538484c19ef38c94U, 0x2865a5f206b06fb9U, |
1335 | | 0xf93f87b7442e45d3U, 0xf78f69a51539d748U, 0xb573440e5a884d1bU, |
1336 | | 0x31680a88f8953030U, 0xfdc20d2b36ba7c3dU, 0x3d32907604691b4cU, |
1337 | | 0xa63f9a49c2c1b10fU, 0x0fcf80dc33721d53U, 0xd3c36113404ea4a8U, |
1338 | | 0x645a1cac083126e9U, 0x3d70a3d70a3d70a3U, 0xccccccccccccccccU, |
1339 | | 0x0000000000000000U, 0x0000000000000000U, 0x0000000000000000U, |
1340 | | 0x0000000000000000U, 0x0000000000000000U, 0x0000000000000000U, |
1341 | | 0x0000000000000000U, 0x0000000000000000U, 0x0000000000000000U, |
1342 | | 0x0000000000000000U, 0x0000000000000000U, 0x0000000000000000U, |
1343 | | 0x0000000000000000U, 0x0000000000000000U, 0x0000000000000000U, |
1344 | | 0x0000000000000000U, 0x0000000000000000U, 0x0000000000000000U, |
1345 | | 0x0000000000000000U, 0x0000000000000000U, 0x0000000000000000U, |
1346 | | 0x0000000000000000U, 0x0000000000000000U, 0x0000000000000000U, |
1347 | | 0x0000000000000000U, 0x0000000000000000U, 0x0000000000000000U, |
1348 | | 0x0000000000000000U, 0x4000000000000000U, 0x5000000000000000U, |
1349 | | 0xa400000000000000U, 0x4d00000000000000U, 0xf020000000000000U, |
1350 | | 0x6c28000000000000U, 0xc732000000000000U, 0x3c7f400000000000U, |
1351 | | 0x4b9f100000000000U, 0x1e86d40000000000U, 0x1314448000000000U, |
1352 | | 0x17d955a000000000U, 0x5dcfab0800000000U, 0x5aa1cae500000000U, |
1353 | | 0xf14a3d9e40000000U, 0x6d9ccd05d0000000U, 0xe4820023a2000000U, |
1354 | | 0xdda2802c8a800000U, 0xd50b2037ad200000U, 0x4526f422cc340000U, |
1355 | | 0x9670b12b7f410000U, 0x3c0cdd765f114000U, 0xa5880a69fb6ac800U, |
1356 | | 0x8eea0d047a457a00U, 0x72a4904598d6d880U, 0x47a6da2b7f864750U, |
1357 | | 0x999090b65f67d924U, 0xfff4b4e3f741cf6dU, 0xbff8f10e7a8921a4U, |
1358 | | 0xaff72d52192b6a0dU, 0x9bf4f8a69f764490U, 0x02f236d04753d5b4U, |
1359 | | 0x01d762422c946590U, 0x424d3ad2b7b97ef5U, 0xd2e0898765a7deb2U, |
1360 | | 0x63cc55f49f88eb2fU, 0x3cbf6b71c76b25fbU, 0x8bef464e3945ef7aU, |
1361 | | 0x97758bf0e3cbb5acU, 0x3d52eeed1cbea317U, 0x4ca7aaa863ee4bddU, |
1362 | | 0x8fe8caa93e74ef6aU, 0xb3e2fd538e122b44U, 0x60dbbca87196b616U, |
1363 | | 0xbc8955e946fe31cdU, 0x6babab6398bdbe41U, 0xc696963c7eed2dd1U, |
1364 | | 0xfc1e1de5cf543ca2U, 0x3b25a55f43294bcbU, 0x49ef0eb713f39ebeU, |
1365 | | 0x6e3569326c784337U, 0x49c2c37f07965404U, 0xdc33745ec97be906U, |
1366 | | 0x69a028bb3ded71a3U, 0xc40832ea0d68ce0cU, 0xf50a3fa490c30190U, |
1367 | | 0x792667c6da79e0faU, 0x577001b891185938U, 0xed4c0226b55e6f86U, |
1368 | | 0x544f8158315b05b4U, 0x696361ae3db1c721U, 0x03bc3a19cd1e38e9U, |
1369 | | 0x04ab48a04065c723U, 0x62eb0d64283f9c76U, 0x3ba5d0bd324f8394U, |
1370 | | 0xca8f44ec7ee36479U, 0x7e998b13cf4e1ecbU, 0x9e3fedd8c321a67eU, |
1371 | | 0xc5cfe94ef3ea101eU, 0xbba1f1d158724a12U, 0x2a8a6e45ae8edc97U, |
1372 | | 0xf52d09d71a3293bdU, 0x593c2626705f9c56U, 0x6f8b2fb00c77836cU, |
1373 | | 0x0b6dfb9c0f956447U, 0x4724bd4189bd5eacU, 0x58edec91ec2cb657U, |
1374 | | 0x2f2967b66737e3edU, 0xbd79e0d20082ee74U, 0xecd8590680a3aa11U, |
1375 | | 0xe80e6f4820cc9495U, 0x3109058d147fdcddU, 0xbd4b46f0599fd415U, |
1376 | | 0x6c9e18ac7007c91aU, 0x03e2cf6bc604ddb0U, 0x84db8346b786151cU, |
1377 | | 0xe612641865679a63U, 0x4fcb7e8f3f60c07eU, 0xe3be5e330f38f09dU, |
1378 | | 0x5cadf5bfd3072cc5U, 0x73d9732fc7c8f7f6U, 0x2867e7fddcdd9afaU, |
1379 | | 0xb281e1fd541501b8U, 0x1f225a7ca91a4226U, 0x3375788de9b06958U, |
1380 | | 0x0052d6b1641c83aeU, 0xc0678c5dbd23a49aU, 0xf840b7ba963646e0U, |
1381 | | 0xb650e5a93bc3d898U, 0xa3e51f138ab4cebeU, 0xc66f336c36b10137U, |
1382 | | 0xb80b0047445d4184U, 0xa60dc059157491e5U, 0x87c89837ad68db2fU, |
1383 | | 0x29babe4598c311fbU, 0xf4296dd6fef3d67aU, 0x1899e4a65f58660cU, |
1384 | | 0x5ec05dcff72e7f8fU, 0x76707543f4fa1f73U, 0x6a06494a791c53a8U, |
1385 | | 0x0487db9d17636892U, 0x45a9d2845d3c42b6U, 0x0b8a2392ba45a9b2U, |
1386 | | 0x8e6cac7768d7141eU, 0x3207d795430cd926U, 0x7f44e6bd49e807b8U, |
1387 | | 0x5f16206c9c6209a6U, 0x36dba887c37a8c0fU, 0xc2494954da2c9789U, |
1388 | | 0xf2db9baa10b7bd6cU, 0x6f92829494e5acc7U, 0xcb772339ba1f17f9U, |
1389 | | 0xff2a760414536efbU, 0xfef5138519684abaU, 0x7eb258665fc25d69U, |
1390 | | 0xef2f773ffbd97a61U, 0xaafb550ffacfd8faU, 0x95ba2a53f983cf38U, |
1391 | | 0xdd945a747bf26183U, 0x94f971119aeef9e4U, 0x7a37cd5601aab85dU, |
1392 | | 0xac62e055c10ab33aU, 0x577b986b314d6009U, 0xed5a7e85fda0b80bU, |
1393 | | 0x14588f13be847307U, 0x596eb2d8ae258fc8U, 0x6fca5f8ed9aef3bbU, |
1394 | | 0x25de7bb9480d5854U, 0xaf561aa79a10ae6aU, 0x1b2ba1518094da04U, |
1395 | | 0x90fb44d2f05d0842U, 0x353a1607ac744a53U, 0x42889b8997915ce8U, |
1396 | | 0x69956135febada11U, 0x43fab9837e699095U, 0x94f967e45e03f4bbU, |
1397 | | 0x1d1be0eebac278f5U, 0x6462d92a69731732U, 0x7d7b8f7503cfdcfeU, |
1398 | | 0x5cda735244c3d43eU, 0x3a0888136afa64a7U, 0x088aaa1845b8fdd0U, |
1399 | | 0x8aad549e57273d45U, 0x36ac54e2f678864bU, 0x84576a1bb416a7ddU, |
1400 | | 0x656d44a2a11c51d5U, 0x9f644ae5a4b1b325U, 0x873d5d9f0dde1feeU, |
1401 | | 0xa90cb506d155a7eaU, 0x09a7f12442d588f2U, 0x0c11ed6d538aeb2fU, |
1402 | | 0x8f1668c8a86da5faU, 0xf96e017d694487bcU, 0x37c981dcc395a9acU, |
1403 | | 0x85bbe253f47b1417U, 0x93956d7478ccec8eU, 0x387ac8d1970027b2U, |
1404 | | 0x06997b05fcc0319eU, 0x441fece3bdf81f03U, 0xd527e81cad7626c3U, |
1405 | | 0x8a71e223d8d3b074U, 0xf6872d5667844e49U, 0xb428f8ac016561dbU, |
1406 | | 0xe13336d701beba52U, 0xecc0024661173473U, 0x27f002d7f95d0190U, |
1407 | | 0x31ec038df7b441f4U, 0x7e67047175a15271U, 0x0f0062c6e984d386U, |
1408 | | 0x52c07b78a3e60868U, 0xa7709a56ccdf8a82U, 0x88a66076400bb691U, |
1409 | | 0x6acff893d00ea435U, 0x0583f6b8c4124d43U, 0xc3727a337a8b704aU, |
1410 | | 0x744f18c0592e4c5cU, 0x1162def06f79df73U, 0x8addcb5645ac2ba8U, |
1411 | | 0x6d953e2bd7173692U, 0xc8fa8db6ccdd0437U, 0x1d9c9892400a22a2U, |
1412 | | 0x2503beb6d00cab4bU, 0x2e44ae64840fd61dU, 0x5ceaecfed289e5d2U, |
1413 | | 0x7425a83e872c5f47U, 0xd12f124e28f77719U, 0x82bd6b70d99aaa6fU, |
1414 | | 0x636cc64d1001550bU, 0x3c47f7e05401aa4eU, 0x65acfaec34810a71U, |
1415 | | 0x7f1839a741a14d0dU, 0x1ede48111209a050U, 0x934aed0aab460432U, |
1416 | | 0xf81da84d5617853fU, 0x36251260ab9d668eU, 0xc1d72b7c6b426019U, |
1417 | | 0xb24cf65b8612f81fU, 0xdee033f26797b627U, 0x169840ef017da3b1U, |
1418 | | 0x8e1f289560ee864eU, 0xf1a6f2bab92a27e2U, 0xae10af696774b1dbU, |
1419 | | 0xacca6da1e0a8ef29U, 0x17fd090a58d32af3U, 0xddfc4b4cef07f5b0U, |
1420 | | 0x4abdaf101564f98eU, 0x9d6d1ad41abe37f1U, 0x84c86189216dc5edU, |
1421 | | 0x32fd3cf5b4e49bb4U, 0x3fbc8c33221dc2a1U, 0x0fabaf3feaa5334aU, |
1422 | | 0x29cb4d87f2a7400eU, 0x743e20e9ef511012U, 0x914da9246b255416U, |
1423 | | 0x1ad089b6c2f7548eU, 0xa184ac2473b529b1U, 0xc9e5d72d90a2741eU, |
1424 | | 0x7e2fa67c7a658892U, 0xddbb901b98feeab7U, 0x552a74227f3ea565U, |
1425 | | 0xd53a88958f87275fU, 0x8a892abaf368f137U, 0x2d2b7569b0432d85U, |
1426 | | 0x9c3b29620e29fc73U, 0x8349f3ba91b47b8fU, 0x241c70a936219a73U, |
1427 | | 0xed238cd383aa0110U, 0xf4363804324a40aaU, 0xb143c6053edcd0d5U, |
1428 | | 0xdd94b7868e94050aU, 0xca7cf2b4191c8326U, 0xfd1c2f611f63a3f0U, |
1429 | | 0xbc633b39673c8cecU, 0xd5be0503e085d813U, 0x4b2d8644d8a74e18U, |
1430 | | 0xddf8e7d60ed1219eU, 0xcabb90e5c942b503U, 0x3d6a751f3b936243U, |
1431 | | 0x0cc512670a783ad4U, 0x27fb2b80668b24c5U, 0xb1f9f660802dedf6U, |
1432 | | 0x5e7873f8a0396973U, 0xdb0b487b6423e1e8U, 0x91ce1a9a3d2cda62U, |
1433 | | 0x7641a140cc7810fbU, 0xa9e904c87fcb0a9dU, 0x546345fa9fbdcd44U, |
1434 | | 0xa97c177947ad4095U, 0x49ed8eabcccc485dU, 0x5c68f256bfff5a74U, |
1435 | | 0x73832eec6fff3111U, 0xc831fd53c5ff7eabU, 0xba3e7ca8b77f5e55U, |
1436 | | 0x28ce1bd2e55f35ebU, 0x7980d163cf5b81b3U, 0xd7e105bcc332621fU, |
1437 | | 0x8dd9472bf3fefaa7U, 0xb14f98f6f0feb951U, 0x6ed1bf9a569f33d3U, |
1438 | | 0x0a862f80ec4700c8U, 0xcd27bb612758c0faU, 0x8038d51cb897789cU, |
1439 | | 0xe0470a63e6bd56c3U, 0x1858ccfce06cac74U, 0x0f37801e0c43ebc8U, |
1440 | | 0xd30560258f54e6baU, 0x47c6b82ef32a2069U, 0x4cdc331d57fa5441U, |
1441 | | 0xe0133fe4adf8e952U, 0x58180fddd97723a6U, 0x570f09eaa7ea7648U, |
1442 | | }; |
1443 | | |
1444 | | } // namespace |
1445 | | ABSL_NAMESPACE_END |
1446 | | } // namespace absl |