WPILibC++ 2023.4.3
format-inl.h
Go to the documentation of this file.
1// Formatting library for C++ - implementation
2//
3// Copyright (c) 2012 - 2016, Victor Zverovich
4// All rights reserved.
5//
6// For the license information refer to format.h.
7
8#ifndef FMT_FORMAT_INL_H_
9#define FMT_FORMAT_INL_H_
10
11#include <algorithm>
12#include <cctype>
13#include <cerrno> // errno
14#include <climits>
15#include <cmath>
16#include <cstdarg>
17#include <cstring> // std::memmove
18#include <cwchar>
19#include <exception>
20
21#ifndef FMT_STATIC_THOUSANDS_SEPARATOR
22# include <locale>
23#endif
24
25#ifdef _WIN32
26# include <io.h> // _isatty
27#endif
28
29#include "format.h"
30
32namespace detail {
33
34FMT_FUNC void assert_fail(const char* file, int line, const char* message) {
35 // Use unchecked std::fprintf to avoid triggering another assertion when
36 // writing to stderr fails
37 std::fprintf(stderr, "%s:%d: assertion failed: %s", file, line, message);
38 // Chosen instead of std::abort to satisfy Clang in CUDA mode during device
39 // code pass.
40 std::terminate();
41}
42
43FMT_FUNC void throw_format_error(const char* message) {
44 FMT_THROW(format_error(message));
45}
46
47FMT_FUNC void format_error_code(detail::buffer<char>& out, int error_code,
48 string_view message) noexcept {
49 // Report error code making sure that the output fits into
50 // inline_buffer_size to avoid dynamic memory allocation and potential
51 // bad_alloc.
52 out.try_resize(0);
53 static const char SEP[] = ": ";
54 static const char ERROR_STR[] = "error ";
55 // Subtract 2 to account for terminating null characters in SEP and ERROR_STR.
56 size_t error_code_size = sizeof(SEP) + sizeof(ERROR_STR) - 2;
57 auto abs_value = static_cast<uint32_or_64_or_128_t<int>>(error_code);
58 if (detail::is_negative(error_code)) {
59 abs_value = 0 - abs_value;
60 ++error_code_size;
61 }
62 error_code_size += detail::to_unsigned(detail::count_digits(abs_value));
63 auto it = buffer_appender<char>(out);
64 if (message.size() <= inline_buffer_size - error_code_size)
65 format_to(it, FMT_STRING("{}{}"), message, SEP);
66 format_to(it, FMT_STRING("{}{}"), ERROR_STR, error_code);
67 FMT_ASSERT(out.size() <= inline_buffer_size, "");
68}
69
70FMT_FUNC void report_error(format_func func, int error_code,
71 const char* message) noexcept {
72 memory_buffer full_message;
73 func(full_message, error_code, message);
74 // Don't use fwrite_fully because the latter may throw.
75 if (std::fwrite(full_message.data(), full_message.size(), 1, stderr) > 0)
76 std::fputc('\n', stderr);
77}
78
79// A wrapper around fwrite that throws on error.
80inline void fwrite_fully(const void* ptr, size_t size, size_t count,
81 FILE* stream) {
82 std::fwrite(ptr, size, count, stream);
83}
84
85#ifndef FMT_STATIC_THOUSANDS_SEPARATOR
86template <typename Locale>
87locale_ref::locale_ref(const Locale& loc) : locale_(&loc) {
88 static_assert(std::is_same<Locale, std::locale>::value, "");
89}
90
91template <typename Locale> Locale locale_ref::get() const {
92 static_assert(std::is_same<Locale, std::locale>::value, "");
93 return locale_ ? *static_cast<const std::locale*>(locale_) : std::locale();
94}
95
96template <typename Char>
98 auto& facet = std::use_facet<std::numpunct<Char>>(loc.get<std::locale>());
99 auto grouping = facet.grouping();
100 auto thousands_sep = grouping.empty() ? Char() : facet.thousands_sep();
101 return {std::move(grouping), thousands_sep};
102}
103template <typename Char> FMT_FUNC Char decimal_point_impl(locale_ref loc) {
104 return std::use_facet<std::numpunct<Char>>(loc.get<std::locale>())
105 .decimal_point();
106}
107#else
108template <typename Char>
110 return {"\03", FMT_STATIC_THOUSANDS_SEPARATOR};
111}
112template <typename Char> FMT_FUNC Char decimal_point_impl(locale_ref) {
113 return '.';
114}
115#endif
116} // namespace detail
117
118#if !FMT_MSC_VERSION
119FMT_API FMT_FUNC format_error::~format_error() noexcept = default;
120#endif
121
123 format_args args) {
124 auto ec = std::error_code(error_code, std::generic_category());
125 return std::system_error(ec, vformat(format_str, args));
126}
127
128namespace detail {
129
130template <typename F> inline bool operator==(basic_fp<F> x, basic_fp<F> y) {
131 return x.f == y.f && x.e == y.e;
132}
133
134// Compilers should be able to optimize this into the ror instruction.
136 r &= 31;
137 return (n >> r) | (n << (32 - r));
138}
140 r &= 63;
141 return (n >> r) | (n << (64 - r));
142}
143
144// Computes 128-bit result of multiplication of two 64-bit unsigned integers.
146#if FMT_USE_INT128
147 auto p = static_cast<uint128_opt>(x) * static_cast<uint128_opt>(y);
148 return {static_cast<uint64_t>(p >> 64), static_cast<uint64_t>(p)};
149#elif defined(_MSC_VER) && defined(_M_X64)
150 auto result = uint128_fallback();
151 result.lo_ = _umul128(x, y, &result.hi_);
152 return result;
153#else
154 const uint64_t mask = static_cast<uint64_t>(max_value<uint32_t>());
155
156 uint64_t a = x >> 32;
157 uint64_t b = x & mask;
158 uint64_t c = y >> 32;
159 uint64_t d = y & mask;
160
161 uint64_t ac = a * c;
162 uint64_t bc = b * c;
163 uint64_t ad = a * d;
164 uint64_t bd = b * d;
165
166 uint64_t intermediate = (bd >> 32) + (ad & mask) + (bc & mask);
167
168 return {ac + (intermediate >> 32) + (ad >> 32) + (bc >> 32),
169 (intermediate << 32) + (bd & mask)};
170#endif
171}
172
173// Implementation of Dragonbox algorithm: https://github.com/jk-jeon/dragonbox.
174namespace dragonbox {
175// Computes upper 64 bits of multiplication of two 64-bit unsigned integers.
177#if FMT_USE_INT128
178 auto p = static_cast<uint128_opt>(x) * static_cast<uint128_opt>(y);
179 return static_cast<uint64_t>(p >> 64);
180#elif defined(_MSC_VER) && defined(_M_X64)
181 return __umulh(x, y);
182#else
183 return umul128(x, y).high();
184#endif
185}
186
187// Computes upper 128 bits of multiplication of a 64-bit unsigned integer and a
188// 128-bit unsigned integer.
190 uint128_fallback y) noexcept {
191 uint128_fallback r = umul128(x, y.high());
192 r += umul128_upper64(x, y.low());
193 return r;
194}
195
196// Computes upper 64 bits of multiplication of a 32-bit unsigned integer and a
197// 64-bit unsigned integer.
199 return umul128_upper64(static_cast<uint64_t>(x) << 32, y);
200}
201
202// Computes lower 128 bits of multiplication of a 64-bit unsigned integer and a
203// 128-bit unsigned integer.
205 uint128_fallback y) noexcept {
206 uint64_t high = x * y.high();
207 uint128_fallback high_low = umul128(x, y.low());
208 return {high + high_low.high(), high_low.low()};
209}
210
211// Computes lower 64 bits of multiplication of a 32-bit unsigned integer and a
212// 64-bit unsigned integer.
214 return x * y;
215}
216
217// Computes floor(log10(pow(2, e))) for e in [-2620, 2620] using the method from
218// https://fmt.dev/papers/Dragonbox.pdf#page=28, section 6.1.
219inline int floor_log10_pow2(int e) noexcept {
220 FMT_ASSERT(e <= 2620 && e >= -2620, "too large exponent");
221 static_assert((-1 >> 1) == -1, "right shift is not arithmetic");
222 return (e * 315653) >> 20;
223}
224
225// Various fast log computations.
226inline int floor_log2_pow10(int e) noexcept {
227 FMT_ASSERT(e <= 1233 && e >= -1233, "too large exponent");
228 return (e * 1741647) >> 19;
229}
230inline int floor_log10_pow2_minus_log10_4_over_3(int e) noexcept {
231 FMT_ASSERT(e <= 2936 && e >= -2985, "too large exponent");
232 return (e * 631305 - 261663) >> 21;
233}
234
235static constexpr struct {
238} div_small_pow10_infos[] = {{10, 16}, {100, 16}};
239
240// Replaces n by floor(n / pow(10, N)) returning true if and only if n is
241// divisible by pow(10, N).
242// Precondition: n <= pow(10, N + 1).
243template <int N>
245 // The numbers below are chosen such that:
246 // 1. floor(n/d) = floor(nm / 2^k) where d=10 or d=100,
247 // 2. nm mod 2^k < m if and only if n is divisible by d,
248 // where m is magic_number, k is shift_amount
249 // and d is divisor.
250 //
251 // Item 1 is a common technique of replacing division by a constant with
252 // multiplication, see e.g. "Division by Invariant Integers Using
253 // Multiplication" by Granlund and Montgomery (1994). magic_number (m) is set
254 // to ceil(2^k/d) for large enough k.
255 // The idea for item 2 originates from Schubfach.
256 constexpr auto info = div_small_pow10_infos[N - 1];
257 FMT_ASSERT(n <= info.divisor * 10, "n is too large");
258 constexpr uint32_t magic_number =
259 (1u << info.shift_amount) / info.divisor + 1;
260 n *= magic_number;
261 const uint32_t comparison_mask = (1u << info.shift_amount) - 1;
262 bool result = (n & comparison_mask) < magic_number;
263 n >>= info.shift_amount;
264 return result;
265}
266
267// Computes floor(n / pow(10, N)) for small n and N.
268// Precondition: n <= pow(10, N + 1).
269template <int N> uint32_t small_division_by_pow10(uint32_t n) noexcept {
270 constexpr auto info = div_small_pow10_infos[N - 1];
271 FMT_ASSERT(n <= info.divisor * 10, "n is too large");
272 constexpr uint32_t magic_number =
273 (1u << info.shift_amount) / info.divisor + 1;
274 return (n * magic_number) >> info.shift_amount;
275}
276
277// Computes floor(n / 10^(kappa + 1)) (float)
279 // 1374389535 = ceil(2^37/100)
280 return static_cast<uint32_t>((static_cast<uint64_t>(n) * 1374389535) >> 37);
281}
282// Computes floor(n / 10^(kappa + 1)) (double)
284 // 2361183241434822607 = ceil(2^(64+7)/1000)
285 return umul128_upper64(n, 2361183241434822607ull) >> 7;
286}
287
288// Various subroutines using pow10 cache
289template <class T> struct cache_accessor;
290
291template <> struct cache_accessor<float> {
292 using carrier_uint = float_info<float>::carrier_uint;
294
295 static uint64_t get_cached_power(int k) noexcept {
296 FMT_ASSERT(k >= float_info<float>::min_k && k <= float_info<float>::max_k,
297 "k is out of range");
298 static constexpr const uint64_t pow10_significands[] = {
299 0x81ceb32c4b43fcf5, 0xa2425ff75e14fc32, 0xcad2f7f5359a3b3f,
300 0xfd87b5f28300ca0e, 0x9e74d1b791e07e49, 0xc612062576589ddb,
301 0xf79687aed3eec552, 0x9abe14cd44753b53, 0xc16d9a0095928a28,
302 0xf1c90080baf72cb2, 0x971da05074da7bef, 0xbce5086492111aeb,
303 0xec1e4a7db69561a6, 0x9392ee8e921d5d08, 0xb877aa3236a4b44a,
304 0xe69594bec44de15c, 0x901d7cf73ab0acda, 0xb424dc35095cd810,
305 0xe12e13424bb40e14, 0x8cbccc096f5088cc, 0xafebff0bcb24aaff,
306 0xdbe6fecebdedd5bf, 0x89705f4136b4a598, 0xabcc77118461cefd,
307 0xd6bf94d5e57a42bd, 0x8637bd05af6c69b6, 0xa7c5ac471b478424,
308 0xd1b71758e219652c, 0x83126e978d4fdf3c, 0xa3d70a3d70a3d70b,
309 0xcccccccccccccccd, 0x8000000000000000, 0xa000000000000000,
310 0xc800000000000000, 0xfa00000000000000, 0x9c40000000000000,
311 0xc350000000000000, 0xf424000000000000, 0x9896800000000000,
312 0xbebc200000000000, 0xee6b280000000000, 0x9502f90000000000,
313 0xba43b74000000000, 0xe8d4a51000000000, 0x9184e72a00000000,
314 0xb5e620f480000000, 0xe35fa931a0000000, 0x8e1bc9bf04000000,
315 0xb1a2bc2ec5000000, 0xde0b6b3a76400000, 0x8ac7230489e80000,
316 0xad78ebc5ac620000, 0xd8d726b7177a8000, 0x878678326eac9000,
317 0xa968163f0a57b400, 0xd3c21bcecceda100, 0x84595161401484a0,
318 0xa56fa5b99019a5c8, 0xcecb8f27f4200f3a, 0x813f3978f8940985,
319 0xa18f07d736b90be6, 0xc9f2c9cd04674edf, 0xfc6f7c4045812297,
320 0x9dc5ada82b70b59e, 0xc5371912364ce306, 0xf684df56c3e01bc7,
321 0x9a130b963a6c115d, 0xc097ce7bc90715b4, 0xf0bdc21abb48db21,
322 0x96769950b50d88f5, 0xbc143fa4e250eb32, 0xeb194f8e1ae525fe,
323 0x92efd1b8d0cf37bf, 0xb7abc627050305ae, 0xe596b7b0c643c71a,
324 0x8f7e32ce7bea5c70, 0xb35dbf821ae4f38c, 0xe0352f62a19e306f};
325 return pow10_significands[k - float_info<float>::min_k];
326 }
327
328 struct compute_mul_result {
331 };
332 struct compute_mul_parity_result {
333 bool parity;
335 };
336
337 static compute_mul_result compute_mul(
338 carrier_uint u, const cache_entry_type& cache) noexcept {
339 auto r = umul96_upper64(u, cache);
340 return {static_cast<carrier_uint>(r >> 32),
341 static_cast<carrier_uint>(r) == 0};
342 }
343
345 int beta) noexcept {
346 return static_cast<uint32_t>(cache >> (64 - 1 - beta));
347 }
348
349 static compute_mul_parity_result compute_mul_parity(
350 carrier_uint two_f, const cache_entry_type& cache, int beta) noexcept {
351 FMT_ASSERT(beta >= 1, "");
352 FMT_ASSERT(beta < 64, "");
353
354 auto r = umul96_lower64(two_f, cache);
355 return {((r >> (64 - beta)) & 1) != 0,
356 static_cast<uint32_t>(r >> (32 - beta)) == 0};
357 }
358
360 const cache_entry_type& cache, int beta) noexcept {
361 return static_cast<carrier_uint>(
362 (cache - (cache >> (num_significand_bits<float>() + 2))) >>
363 (64 - num_significand_bits<float>() - 1 - beta));
364 }
365
367 const cache_entry_type& cache, int beta) noexcept {
368 return static_cast<carrier_uint>(
369 (cache + (cache >> (num_significand_bits<float>() + 1))) >>
370 (64 - num_significand_bits<float>() - 1 - beta));
371 }
372
374 const cache_entry_type& cache, int beta) noexcept {
375 return (static_cast<carrier_uint>(
376 cache >> (64 - num_significand_bits<float>() - 2 - beta)) +
377 1) /
378 2;
379 }
380};
381
382template <> struct cache_accessor<double> {
383 using carrier_uint = float_info<double>::carrier_uint;
385
386 static uint128_fallback get_cached_power(int k) noexcept {
387 FMT_ASSERT(k >= float_info<double>::min_k && k <= float_info<double>::max_k,
388 "k is out of range");
389
390 static constexpr const uint128_fallback pow10_significands[] = {
391#if FMT_USE_FULL_CACHE_DRAGONBOX
392 {0xff77b1fcbebcdc4f, 0x25e8e89c13bb0f7b},
393 {0x9faacf3df73609b1, 0x77b191618c54e9ad},
394 {0xc795830d75038c1d, 0xd59df5b9ef6a2418},
395 {0xf97ae3d0d2446f25, 0x4b0573286b44ad1e},
396 {0x9becce62836ac577, 0x4ee367f9430aec33},
397 {0xc2e801fb244576d5, 0x229c41f793cda740},
398 {0xf3a20279ed56d48a, 0x6b43527578c11110},
399 {0x9845418c345644d6, 0x830a13896b78aaaa},
400 {0xbe5691ef416bd60c, 0x23cc986bc656d554},
401 {0xedec366b11c6cb8f, 0x2cbfbe86b7ec8aa9},
402 {0x94b3a202eb1c3f39, 0x7bf7d71432f3d6aa},
403 {0xb9e08a83a5e34f07, 0xdaf5ccd93fb0cc54},
404 {0xe858ad248f5c22c9, 0xd1b3400f8f9cff69},
405 {0x91376c36d99995be, 0x23100809b9c21fa2},
406 {0xb58547448ffffb2d, 0xabd40a0c2832a78b},
407 {0xe2e69915b3fff9f9, 0x16c90c8f323f516d},
408 {0x8dd01fad907ffc3b, 0xae3da7d97f6792e4},
409 {0xb1442798f49ffb4a, 0x99cd11cfdf41779d},
410 {0xdd95317f31c7fa1d, 0x40405643d711d584},
411 {0x8a7d3eef7f1cfc52, 0x482835ea666b2573},
412 {0xad1c8eab5ee43b66, 0xda3243650005eed0},
413 {0xd863b256369d4a40, 0x90bed43e40076a83},
414 {0x873e4f75e2224e68, 0x5a7744a6e804a292},
415 {0xa90de3535aaae202, 0x711515d0a205cb37},
416 {0xd3515c2831559a83, 0x0d5a5b44ca873e04},
417 {0x8412d9991ed58091, 0xe858790afe9486c3},
418 {0xa5178fff668ae0b6, 0x626e974dbe39a873},
419 {0xce5d73ff402d98e3, 0xfb0a3d212dc81290},
420 {0x80fa687f881c7f8e, 0x7ce66634bc9d0b9a},
421 {0xa139029f6a239f72, 0x1c1fffc1ebc44e81},
422 {0xc987434744ac874e, 0xa327ffb266b56221},
423 {0xfbe9141915d7a922, 0x4bf1ff9f0062baa9},
424 {0x9d71ac8fada6c9b5, 0x6f773fc3603db4aa},
425 {0xc4ce17b399107c22, 0xcb550fb4384d21d4},
426 {0xf6019da07f549b2b, 0x7e2a53a146606a49},
427 {0x99c102844f94e0fb, 0x2eda7444cbfc426e},
428 {0xc0314325637a1939, 0xfa911155fefb5309},
429 {0xf03d93eebc589f88, 0x793555ab7eba27cb},
430 {0x96267c7535b763b5, 0x4bc1558b2f3458df},
431 {0xbbb01b9283253ca2, 0x9eb1aaedfb016f17},
432 {0xea9c227723ee8bcb, 0x465e15a979c1cadd},
433 {0x92a1958a7675175f, 0x0bfacd89ec191eca},
434 {0xb749faed14125d36, 0xcef980ec671f667c},
435 {0xe51c79a85916f484, 0x82b7e12780e7401b},
436 {0x8f31cc0937ae58d2, 0xd1b2ecb8b0908811},
437 {0xb2fe3f0b8599ef07, 0x861fa7e6dcb4aa16},
438 {0xdfbdcece67006ac9, 0x67a791e093e1d49b},
439 {0x8bd6a141006042bd, 0xe0c8bb2c5c6d24e1},
440 {0xaecc49914078536d, 0x58fae9f773886e19},
441 {0xda7f5bf590966848, 0xaf39a475506a899f},
442 {0x888f99797a5e012d, 0x6d8406c952429604},
443 {0xaab37fd7d8f58178, 0xc8e5087ba6d33b84},
444 {0xd5605fcdcf32e1d6, 0xfb1e4a9a90880a65},
445 {0x855c3be0a17fcd26, 0x5cf2eea09a550680},
446 {0xa6b34ad8c9dfc06f, 0xf42faa48c0ea481f},
447 {0xd0601d8efc57b08b, 0xf13b94daf124da27},
448 {0x823c12795db6ce57, 0x76c53d08d6b70859},
449 {0xa2cb1717b52481ed, 0x54768c4b0c64ca6f},
450 {0xcb7ddcdda26da268, 0xa9942f5dcf7dfd0a},
451 {0xfe5d54150b090b02, 0xd3f93b35435d7c4d},
452 {0x9efa548d26e5a6e1, 0xc47bc5014a1a6db0},
453 {0xc6b8e9b0709f109a, 0x359ab6419ca1091c},
454 {0xf867241c8cc6d4c0, 0xc30163d203c94b63},
455 {0x9b407691d7fc44f8, 0x79e0de63425dcf1e},
456 {0xc21094364dfb5636, 0x985915fc12f542e5},
457 {0xf294b943e17a2bc4, 0x3e6f5b7b17b2939e},
458 {0x979cf3ca6cec5b5a, 0xa705992ceecf9c43},
459 {0xbd8430bd08277231, 0x50c6ff782a838354},
460 {0xece53cec4a314ebd, 0xa4f8bf5635246429},
461 {0x940f4613ae5ed136, 0x871b7795e136be9a},
462 {0xb913179899f68584, 0x28e2557b59846e40},
463 {0xe757dd7ec07426e5, 0x331aeada2fe589d0},
464 {0x9096ea6f3848984f, 0x3ff0d2c85def7622},
465 {0xb4bca50b065abe63, 0x0fed077a756b53aa},
466 {0xe1ebce4dc7f16dfb, 0xd3e8495912c62895},
467 {0x8d3360f09cf6e4bd, 0x64712dd7abbbd95d},
468 {0xb080392cc4349dec, 0xbd8d794d96aacfb4},
469 {0xdca04777f541c567, 0xecf0d7a0fc5583a1},
470 {0x89e42caaf9491b60, 0xf41686c49db57245},
471 {0xac5d37d5b79b6239, 0x311c2875c522ced6},
472 {0xd77485cb25823ac7, 0x7d633293366b828c},
473 {0x86a8d39ef77164bc, 0xae5dff9c02033198},
474 {0xa8530886b54dbdeb, 0xd9f57f830283fdfd},
475 {0xd267caa862a12d66, 0xd072df63c324fd7c},
476 {0x8380dea93da4bc60, 0x4247cb9e59f71e6e},
477 {0xa46116538d0deb78, 0x52d9be85f074e609},
478 {0xcd795be870516656, 0x67902e276c921f8c},
479 {0x806bd9714632dff6, 0x00ba1cd8a3db53b7},
480 {0xa086cfcd97bf97f3, 0x80e8a40eccd228a5},
481 {0xc8a883c0fdaf7df0, 0x6122cd128006b2ce},
482 {0xfad2a4b13d1b5d6c, 0x796b805720085f82},
483 {0x9cc3a6eec6311a63, 0xcbe3303674053bb1},
484 {0xc3f490aa77bd60fc, 0xbedbfc4411068a9d},
485 {0xf4f1b4d515acb93b, 0xee92fb5515482d45},
486 {0x991711052d8bf3c5, 0x751bdd152d4d1c4b},
487 {0xbf5cd54678eef0b6, 0xd262d45a78a0635e},
488 {0xef340a98172aace4, 0x86fb897116c87c35},
489 {0x9580869f0e7aac0e, 0xd45d35e6ae3d4da1},
490 {0xbae0a846d2195712, 0x8974836059cca10a},
491 {0xe998d258869facd7, 0x2bd1a438703fc94c},
492 {0x91ff83775423cc06, 0x7b6306a34627ddd0},
493 {0xb67f6455292cbf08, 0x1a3bc84c17b1d543},
494 {0xe41f3d6a7377eeca, 0x20caba5f1d9e4a94},
495 {0x8e938662882af53e, 0x547eb47b7282ee9d},
496 {0xb23867fb2a35b28d, 0xe99e619a4f23aa44},
497 {0xdec681f9f4c31f31, 0x6405fa00e2ec94d5},
498 {0x8b3c113c38f9f37e, 0xde83bc408dd3dd05},
499 {0xae0b158b4738705e, 0x9624ab50b148d446},
500 {0xd98ddaee19068c76, 0x3badd624dd9b0958},
501 {0x87f8a8d4cfa417c9, 0xe54ca5d70a80e5d7},
502 {0xa9f6d30a038d1dbc, 0x5e9fcf4ccd211f4d},
503 {0xd47487cc8470652b, 0x7647c32000696720},
504 {0x84c8d4dfd2c63f3b, 0x29ecd9f40041e074},
505 {0xa5fb0a17c777cf09, 0xf468107100525891},
506 {0xcf79cc9db955c2cc, 0x7182148d4066eeb5},
507 {0x81ac1fe293d599bf, 0xc6f14cd848405531},
508 {0xa21727db38cb002f, 0xb8ada00e5a506a7d},
509 {0xca9cf1d206fdc03b, 0xa6d90811f0e4851d},
510 {0xfd442e4688bd304a, 0x908f4a166d1da664},
511 {0x9e4a9cec15763e2e, 0x9a598e4e043287ff},
512 {0xc5dd44271ad3cdba, 0x40eff1e1853f29fe},
513 {0xf7549530e188c128, 0xd12bee59e68ef47d},
514 {0x9a94dd3e8cf578b9, 0x82bb74f8301958cf},
515 {0xc13a148e3032d6e7, 0xe36a52363c1faf02},
516 {0xf18899b1bc3f8ca1, 0xdc44e6c3cb279ac2},
517 {0x96f5600f15a7b7e5, 0x29ab103a5ef8c0ba},
518 {0xbcb2b812db11a5de, 0x7415d448f6b6f0e8},
519 {0xebdf661791d60f56, 0x111b495b3464ad22},
520 {0x936b9fcebb25c995, 0xcab10dd900beec35},
521 {0xb84687c269ef3bfb, 0x3d5d514f40eea743},
522 {0xe65829b3046b0afa, 0x0cb4a5a3112a5113},
523 {0x8ff71a0fe2c2e6dc, 0x47f0e785eaba72ac},
524 {0xb3f4e093db73a093, 0x59ed216765690f57},
525 {0xe0f218b8d25088b8, 0x306869c13ec3532d},
526 {0x8c974f7383725573, 0x1e414218c73a13fc},
527 {0xafbd2350644eeacf, 0xe5d1929ef90898fb},
528 {0xdbac6c247d62a583, 0xdf45f746b74abf3a},
529 {0x894bc396ce5da772, 0x6b8bba8c328eb784},
530 {0xab9eb47c81f5114f, 0x066ea92f3f326565},
531 {0xd686619ba27255a2, 0xc80a537b0efefebe},
532 {0x8613fd0145877585, 0xbd06742ce95f5f37},
533 {0xa798fc4196e952e7, 0x2c48113823b73705},
534 {0xd17f3b51fca3a7a0, 0xf75a15862ca504c6},
535 {0x82ef85133de648c4, 0x9a984d73dbe722fc},
536 {0xa3ab66580d5fdaf5, 0xc13e60d0d2e0ebbb},
537 {0xcc963fee10b7d1b3, 0x318df905079926a9},
538 {0xffbbcfe994e5c61f, 0xfdf17746497f7053},
539 {0x9fd561f1fd0f9bd3, 0xfeb6ea8bedefa634},
540 {0xc7caba6e7c5382c8, 0xfe64a52ee96b8fc1},
541 {0xf9bd690a1b68637b, 0x3dfdce7aa3c673b1},
542 {0x9c1661a651213e2d, 0x06bea10ca65c084f},
543 {0xc31bfa0fe5698db8, 0x486e494fcff30a63},
544 {0xf3e2f893dec3f126, 0x5a89dba3c3efccfb},
545 {0x986ddb5c6b3a76b7, 0xf89629465a75e01d},
546 {0xbe89523386091465, 0xf6bbb397f1135824},
547 {0xee2ba6c0678b597f, 0x746aa07ded582e2d},
548 {0x94db483840b717ef, 0xa8c2a44eb4571cdd},
549 {0xba121a4650e4ddeb, 0x92f34d62616ce414},
550 {0xe896a0d7e51e1566, 0x77b020baf9c81d18},
551 {0x915e2486ef32cd60, 0x0ace1474dc1d122f},
552 {0xb5b5ada8aaff80b8, 0x0d819992132456bb},
553 {0xe3231912d5bf60e6, 0x10e1fff697ed6c6a},
554 {0x8df5efabc5979c8f, 0xca8d3ffa1ef463c2},
555 {0xb1736b96b6fd83b3, 0xbd308ff8a6b17cb3},
556 {0xddd0467c64bce4a0, 0xac7cb3f6d05ddbdf},
557 {0x8aa22c0dbef60ee4, 0x6bcdf07a423aa96c},
558 {0xad4ab7112eb3929d, 0x86c16c98d2c953c7},
559 {0xd89d64d57a607744, 0xe871c7bf077ba8b8},
560 {0x87625f056c7c4a8b, 0x11471cd764ad4973},
561 {0xa93af6c6c79b5d2d, 0xd598e40d3dd89bd0},
562 {0xd389b47879823479, 0x4aff1d108d4ec2c4},
563 {0x843610cb4bf160cb, 0xcedf722a585139bb},
564 {0xa54394fe1eedb8fe, 0xc2974eb4ee658829},
565 {0xce947a3da6a9273e, 0x733d226229feea33},
566 {0x811ccc668829b887, 0x0806357d5a3f5260},
567 {0xa163ff802a3426a8, 0xca07c2dcb0cf26f8},
568 {0xc9bcff6034c13052, 0xfc89b393dd02f0b6},
569 {0xfc2c3f3841f17c67, 0xbbac2078d443ace3},
570 {0x9d9ba7832936edc0, 0xd54b944b84aa4c0e},
571 {0xc5029163f384a931, 0x0a9e795e65d4df12},
572 {0xf64335bcf065d37d, 0x4d4617b5ff4a16d6},
573 {0x99ea0196163fa42e, 0x504bced1bf8e4e46},
574 {0xc06481fb9bcf8d39, 0xe45ec2862f71e1d7},
575 {0xf07da27a82c37088, 0x5d767327bb4e5a4d},
576 {0x964e858c91ba2655, 0x3a6a07f8d510f870},
577 {0xbbe226efb628afea, 0x890489f70a55368c},
578 {0xeadab0aba3b2dbe5, 0x2b45ac74ccea842f},
579 {0x92c8ae6b464fc96f, 0x3b0b8bc90012929e},
580 {0xb77ada0617e3bbcb, 0x09ce6ebb40173745},
581 {0xe55990879ddcaabd, 0xcc420a6a101d0516},
582 {0x8f57fa54c2a9eab6, 0x9fa946824a12232e},
583 {0xb32df8e9f3546564, 0x47939822dc96abfa},
584 {0xdff9772470297ebd, 0x59787e2b93bc56f8},
585 {0x8bfbea76c619ef36, 0x57eb4edb3c55b65b},
586 {0xaefae51477a06b03, 0xede622920b6b23f2},
587 {0xdab99e59958885c4, 0xe95fab368e45ecee},
588 {0x88b402f7fd75539b, 0x11dbcb0218ebb415},
589 {0xaae103b5fcd2a881, 0xd652bdc29f26a11a},
590 {0xd59944a37c0752a2, 0x4be76d3346f04960},
591 {0x857fcae62d8493a5, 0x6f70a4400c562ddc},
592 {0xa6dfbd9fb8e5b88e, 0xcb4ccd500f6bb953},
593 {0xd097ad07a71f26b2, 0x7e2000a41346a7a8},
594 {0x825ecc24c873782f, 0x8ed400668c0c28c9},
595 {0xa2f67f2dfa90563b, 0x728900802f0f32fb},
596 {0xcbb41ef979346bca, 0x4f2b40a03ad2ffba},
597 {0xfea126b7d78186bc, 0xe2f610c84987bfa9},
598 {0x9f24b832e6b0f436, 0x0dd9ca7d2df4d7ca},
599 {0xc6ede63fa05d3143, 0x91503d1c79720dbc},
600 {0xf8a95fcf88747d94, 0x75a44c6397ce912b},
601 {0x9b69dbe1b548ce7c, 0xc986afbe3ee11abb},
602 {0xc24452da229b021b, 0xfbe85badce996169},
603 {0xf2d56790ab41c2a2, 0xfae27299423fb9c4},
604 {0x97c560ba6b0919a5, 0xdccd879fc967d41b},
605 {0xbdb6b8e905cb600f, 0x5400e987bbc1c921},
606 {0xed246723473e3813, 0x290123e9aab23b69},
607 {0x9436c0760c86e30b, 0xf9a0b6720aaf6522},
608 {0xb94470938fa89bce, 0xf808e40e8d5b3e6a},
609 {0xe7958cb87392c2c2, 0xb60b1d1230b20e05},
610 {0x90bd77f3483bb9b9, 0xb1c6f22b5e6f48c3},
611 {0xb4ecd5f01a4aa828, 0x1e38aeb6360b1af4},
612 {0xe2280b6c20dd5232, 0x25c6da63c38de1b1},
613 {0x8d590723948a535f, 0x579c487e5a38ad0f},
614 {0xb0af48ec79ace837, 0x2d835a9df0c6d852},
615 {0xdcdb1b2798182244, 0xf8e431456cf88e66},
616 {0x8a08f0f8bf0f156b, 0x1b8e9ecb641b5900},
617 {0xac8b2d36eed2dac5, 0xe272467e3d222f40},
618 {0xd7adf884aa879177, 0x5b0ed81dcc6abb10},
619 {0x86ccbb52ea94baea, 0x98e947129fc2b4ea},
620 {0xa87fea27a539e9a5, 0x3f2398d747b36225},
621 {0xd29fe4b18e88640e, 0x8eec7f0d19a03aae},
622 {0x83a3eeeef9153e89, 0x1953cf68300424ad},
623 {0xa48ceaaab75a8e2b, 0x5fa8c3423c052dd8},
624 {0xcdb02555653131b6, 0x3792f412cb06794e},
625 {0x808e17555f3ebf11, 0xe2bbd88bbee40bd1},
626 {0xa0b19d2ab70e6ed6, 0x5b6aceaeae9d0ec5},
627 {0xc8de047564d20a8b, 0xf245825a5a445276},
628 {0xfb158592be068d2e, 0xeed6e2f0f0d56713},
629 {0x9ced737bb6c4183d, 0x55464dd69685606c},
630 {0xc428d05aa4751e4c, 0xaa97e14c3c26b887},
631 {0xf53304714d9265df, 0xd53dd99f4b3066a9},
632 {0x993fe2c6d07b7fab, 0xe546a8038efe402a},
633 {0xbf8fdb78849a5f96, 0xde98520472bdd034},
634 {0xef73d256a5c0f77c, 0x963e66858f6d4441},
635 {0x95a8637627989aad, 0xdde7001379a44aa9},
636 {0xbb127c53b17ec159, 0x5560c018580d5d53},
637 {0xe9d71b689dde71af, 0xaab8f01e6e10b4a7},
638 {0x9226712162ab070d, 0xcab3961304ca70e9},
639 {0xb6b00d69bb55c8d1, 0x3d607b97c5fd0d23},
640 {0xe45c10c42a2b3b05, 0x8cb89a7db77c506b},
641 {0x8eb98a7a9a5b04e3, 0x77f3608e92adb243},
642 {0xb267ed1940f1c61c, 0x55f038b237591ed4},
643 {0xdf01e85f912e37a3, 0x6b6c46dec52f6689},
644 {0x8b61313bbabce2c6, 0x2323ac4b3b3da016},
645 {0xae397d8aa96c1b77, 0xabec975e0a0d081b},
646 {0xd9c7dced53c72255, 0x96e7bd358c904a22},
647 {0x881cea14545c7575, 0x7e50d64177da2e55},
648 {0xaa242499697392d2, 0xdde50bd1d5d0b9ea},
649 {0xd4ad2dbfc3d07787, 0x955e4ec64b44e865},
650 {0x84ec3c97da624ab4, 0xbd5af13bef0b113f},
651 {0xa6274bbdd0fadd61, 0xecb1ad8aeacdd58f},
652 {0xcfb11ead453994ba, 0x67de18eda5814af3},
653 {0x81ceb32c4b43fcf4, 0x80eacf948770ced8},
654 {0xa2425ff75e14fc31, 0xa1258379a94d028e},
655 {0xcad2f7f5359a3b3e, 0x096ee45813a04331},
656 {0xfd87b5f28300ca0d, 0x8bca9d6e188853fd},
657 {0x9e74d1b791e07e48, 0x775ea264cf55347e},
658 {0xc612062576589dda, 0x95364afe032a819e},
659 {0xf79687aed3eec551, 0x3a83ddbd83f52205},
660 {0x9abe14cd44753b52, 0xc4926a9672793543},
661 {0xc16d9a0095928a27, 0x75b7053c0f178294},
662 {0xf1c90080baf72cb1, 0x5324c68b12dd6339},
663 {0x971da05074da7bee, 0xd3f6fc16ebca5e04},
664 {0xbce5086492111aea, 0x88f4bb1ca6bcf585},
665 {0xec1e4a7db69561a5, 0x2b31e9e3d06c32e6},
666 {0x9392ee8e921d5d07, 0x3aff322e62439fd0},
667 {0xb877aa3236a4b449, 0x09befeb9fad487c3},
668 {0xe69594bec44de15b, 0x4c2ebe687989a9b4},
669 {0x901d7cf73ab0acd9, 0x0f9d37014bf60a11},
670 {0xb424dc35095cd80f, 0x538484c19ef38c95},
671 {0xe12e13424bb40e13, 0x2865a5f206b06fba},
672 {0x8cbccc096f5088cb, 0xf93f87b7442e45d4},
673 {0xafebff0bcb24aafe, 0xf78f69a51539d749},
674 {0xdbe6fecebdedd5be, 0xb573440e5a884d1c},
675 {0x89705f4136b4a597, 0x31680a88f8953031},
676 {0xabcc77118461cefc, 0xfdc20d2b36ba7c3e},
677 {0xd6bf94d5e57a42bc, 0x3d32907604691b4d},
678 {0x8637bd05af6c69b5, 0xa63f9a49c2c1b110},
679 {0xa7c5ac471b478423, 0x0fcf80dc33721d54},
680 {0xd1b71758e219652b, 0xd3c36113404ea4a9},
681 {0x83126e978d4fdf3b, 0x645a1cac083126ea},
682 {0xa3d70a3d70a3d70a, 0x3d70a3d70a3d70a4},
683 {0xcccccccccccccccc, 0xcccccccccccccccd},
684 {0x8000000000000000, 0x0000000000000000},
685 {0xa000000000000000, 0x0000000000000000},
686 {0xc800000000000000, 0x0000000000000000},
687 {0xfa00000000000000, 0x0000000000000000},
688 {0x9c40000000000000, 0x0000000000000000},
689 {0xc350000000000000, 0x0000000000000000},
690 {0xf424000000000000, 0x0000000000000000},
691 {0x9896800000000000, 0x0000000000000000},
692 {0xbebc200000000000, 0x0000000000000000},
693 {0xee6b280000000000, 0x0000000000000000},
694 {0x9502f90000000000, 0x0000000000000000},
695 {0xba43b74000000000, 0x0000000000000000},
696 {0xe8d4a51000000000, 0x0000000000000000},
697 {0x9184e72a00000000, 0x0000000000000000},
698 {0xb5e620f480000000, 0x0000000000000000},
699 {0xe35fa931a0000000, 0x0000000000000000},
700 {0x8e1bc9bf04000000, 0x0000000000000000},
701 {0xb1a2bc2ec5000000, 0x0000000000000000},
702 {0xde0b6b3a76400000, 0x0000000000000000},
703 {0x8ac7230489e80000, 0x0000000000000000},
704 {0xad78ebc5ac620000, 0x0000000000000000},
705 {0xd8d726b7177a8000, 0x0000000000000000},
706 {0x878678326eac9000, 0x0000000000000000},
707 {0xa968163f0a57b400, 0x0000000000000000},
708 {0xd3c21bcecceda100, 0x0000000000000000},
709 {0x84595161401484a0, 0x0000000000000000},
710 {0xa56fa5b99019a5c8, 0x0000000000000000},
711 {0xcecb8f27f4200f3a, 0x0000000000000000},
712 {0x813f3978f8940984, 0x4000000000000000},
713 {0xa18f07d736b90be5, 0x5000000000000000},
714 {0xc9f2c9cd04674ede, 0xa400000000000000},
715 {0xfc6f7c4045812296, 0x4d00000000000000},
716 {0x9dc5ada82b70b59d, 0xf020000000000000},
717 {0xc5371912364ce305, 0x6c28000000000000},
718 {0xf684df56c3e01bc6, 0xc732000000000000},
719 {0x9a130b963a6c115c, 0x3c7f400000000000},
720 {0xc097ce7bc90715b3, 0x4b9f100000000000},
721 {0xf0bdc21abb48db20, 0x1e86d40000000000},
722 {0x96769950b50d88f4, 0x1314448000000000},
723 {0xbc143fa4e250eb31, 0x17d955a000000000},
724 {0xeb194f8e1ae525fd, 0x5dcfab0800000000},
725 {0x92efd1b8d0cf37be, 0x5aa1cae500000000},
726 {0xb7abc627050305ad, 0xf14a3d9e40000000},
727 {0xe596b7b0c643c719, 0x6d9ccd05d0000000},
728 {0x8f7e32ce7bea5c6f, 0xe4820023a2000000},
729 {0xb35dbf821ae4f38b, 0xdda2802c8a800000},
730 {0xe0352f62a19e306e, 0xd50b2037ad200000},
731 {0x8c213d9da502de45, 0x4526f422cc340000},
732 {0xaf298d050e4395d6, 0x9670b12b7f410000},
733 {0xdaf3f04651d47b4c, 0x3c0cdd765f114000},
734 {0x88d8762bf324cd0f, 0xa5880a69fb6ac800},
735 {0xab0e93b6efee0053, 0x8eea0d047a457a00},
736 {0xd5d238a4abe98068, 0x72a4904598d6d880},
737 {0x85a36366eb71f041, 0x47a6da2b7f864750},
738 {0xa70c3c40a64e6c51, 0x999090b65f67d924},
739 {0xd0cf4b50cfe20765, 0xfff4b4e3f741cf6d},
740 {0x82818f1281ed449f, 0xbff8f10e7a8921a5},
741 {0xa321f2d7226895c7, 0xaff72d52192b6a0e},
742 {0xcbea6f8ceb02bb39, 0x9bf4f8a69f764491},
743 {0xfee50b7025c36a08, 0x02f236d04753d5b5},
744 {0x9f4f2726179a2245, 0x01d762422c946591},
745 {0xc722f0ef9d80aad6, 0x424d3ad2b7b97ef6},
746 {0xf8ebad2b84e0d58b, 0xd2e0898765a7deb3},
747 {0x9b934c3b330c8577, 0x63cc55f49f88eb30},
748 {0xc2781f49ffcfa6d5, 0x3cbf6b71c76b25fc},
749 {0xf316271c7fc3908a, 0x8bef464e3945ef7b},
750 {0x97edd871cfda3a56, 0x97758bf0e3cbb5ad},
751 {0xbde94e8e43d0c8ec, 0x3d52eeed1cbea318},
752 {0xed63a231d4c4fb27, 0x4ca7aaa863ee4bde},
753 {0x945e455f24fb1cf8, 0x8fe8caa93e74ef6b},
754 {0xb975d6b6ee39e436, 0xb3e2fd538e122b45},
755 {0xe7d34c64a9c85d44, 0x60dbbca87196b617},
756 {0x90e40fbeea1d3a4a, 0xbc8955e946fe31ce},
757 {0xb51d13aea4a488dd, 0x6babab6398bdbe42},
758 {0xe264589a4dcdab14, 0xc696963c7eed2dd2},
759 {0x8d7eb76070a08aec, 0xfc1e1de5cf543ca3},
760 {0xb0de65388cc8ada8, 0x3b25a55f43294bcc},
761 {0xdd15fe86affad912, 0x49ef0eb713f39ebf},
762 {0x8a2dbf142dfcc7ab, 0x6e3569326c784338},
763 {0xacb92ed9397bf996, 0x49c2c37f07965405},
764 {0xd7e77a8f87daf7fb, 0xdc33745ec97be907},
765 {0x86f0ac99b4e8dafd, 0x69a028bb3ded71a4},
766 {0xa8acd7c0222311bc, 0xc40832ea0d68ce0d},
767 {0xd2d80db02aabd62b, 0xf50a3fa490c30191},
768 {0x83c7088e1aab65db, 0x792667c6da79e0fb},
769 {0xa4b8cab1a1563f52, 0x577001b891185939},
770 {0xcde6fd5e09abcf26, 0xed4c0226b55e6f87},
771 {0x80b05e5ac60b6178, 0x544f8158315b05b5},
772 {0xa0dc75f1778e39d6, 0x696361ae3db1c722},
773 {0xc913936dd571c84c, 0x03bc3a19cd1e38ea},
774 {0xfb5878494ace3a5f, 0x04ab48a04065c724},
775 {0x9d174b2dcec0e47b, 0x62eb0d64283f9c77},
776 {0xc45d1df942711d9a, 0x3ba5d0bd324f8395},
777 {0xf5746577930d6500, 0xca8f44ec7ee3647a},
778 {0x9968bf6abbe85f20, 0x7e998b13cf4e1ecc},
779 {0xbfc2ef456ae276e8, 0x9e3fedd8c321a67f},
780 {0xefb3ab16c59b14a2, 0xc5cfe94ef3ea101f},
781 {0x95d04aee3b80ece5, 0xbba1f1d158724a13},
782 {0xbb445da9ca61281f, 0x2a8a6e45ae8edc98},
783 {0xea1575143cf97226, 0xf52d09d71a3293be},
784 {0x924d692ca61be758, 0x593c2626705f9c57},
785 {0xb6e0c377cfa2e12e, 0x6f8b2fb00c77836d},
786 {0xe498f455c38b997a, 0x0b6dfb9c0f956448},
787 {0x8edf98b59a373fec, 0x4724bd4189bd5ead},
788 {0xb2977ee300c50fe7, 0x58edec91ec2cb658},
789 {0xdf3d5e9bc0f653e1, 0x2f2967b66737e3ee},
790 {0x8b865b215899f46c, 0xbd79e0d20082ee75},
791 {0xae67f1e9aec07187, 0xecd8590680a3aa12},
792 {0xda01ee641a708de9, 0xe80e6f4820cc9496},
793 {0x884134fe908658b2, 0x3109058d147fdcde},
794 {0xaa51823e34a7eede, 0xbd4b46f0599fd416},
795 {0xd4e5e2cdc1d1ea96, 0x6c9e18ac7007c91b},
796 {0x850fadc09923329e, 0x03e2cf6bc604ddb1},
797 {0xa6539930bf6bff45, 0x84db8346b786151d},
798 {0xcfe87f7cef46ff16, 0xe612641865679a64},
799 {0x81f14fae158c5f6e, 0x4fcb7e8f3f60c07f},
800 {0xa26da3999aef7749, 0xe3be5e330f38f09e},
801 {0xcb090c8001ab551c, 0x5cadf5bfd3072cc6},
802 {0xfdcb4fa002162a63, 0x73d9732fc7c8f7f7},
803 {0x9e9f11c4014dda7e, 0x2867e7fddcdd9afb},
804 {0xc646d63501a1511d, 0xb281e1fd541501b9},
805 {0xf7d88bc24209a565, 0x1f225a7ca91a4227},
806 {0x9ae757596946075f, 0x3375788de9b06959},
807 {0xc1a12d2fc3978937, 0x0052d6b1641c83af},
808 {0xf209787bb47d6b84, 0xc0678c5dbd23a49b},
809 {0x9745eb4d50ce6332, 0xf840b7ba963646e1},
810 {0xbd176620a501fbff, 0xb650e5a93bc3d899},
811 {0xec5d3fa8ce427aff, 0xa3e51f138ab4cebf},
812 {0x93ba47c980e98cdf, 0xc66f336c36b10138},
813 {0xb8a8d9bbe123f017, 0xb80b0047445d4185},
814 {0xe6d3102ad96cec1d, 0xa60dc059157491e6},
815 {0x9043ea1ac7e41392, 0x87c89837ad68db30},
816 {0xb454e4a179dd1877, 0x29babe4598c311fc},
817 {0xe16a1dc9d8545e94, 0xf4296dd6fef3d67b},
818 {0x8ce2529e2734bb1d, 0x1899e4a65f58660d},
819 {0xb01ae745b101e9e4, 0x5ec05dcff72e7f90},
820 {0xdc21a1171d42645d, 0x76707543f4fa1f74},
821 {0x899504ae72497eba, 0x6a06494a791c53a9},
822 {0xabfa45da0edbde69, 0x0487db9d17636893},
823 {0xd6f8d7509292d603, 0x45a9d2845d3c42b7},
824 {0x865b86925b9bc5c2, 0x0b8a2392ba45a9b3},
825 {0xa7f26836f282b732, 0x8e6cac7768d7141f},
826 {0xd1ef0244af2364ff, 0x3207d795430cd927},
827 {0x8335616aed761f1f, 0x7f44e6bd49e807b9},
828 {0xa402b9c5a8d3a6e7, 0x5f16206c9c6209a7},
829 {0xcd036837130890a1, 0x36dba887c37a8c10},
830 {0x802221226be55a64, 0xc2494954da2c978a},
831 {0xa02aa96b06deb0fd, 0xf2db9baa10b7bd6d},
832 {0xc83553c5c8965d3d, 0x6f92829494e5acc8},
833 {0xfa42a8b73abbf48c, 0xcb772339ba1f17fa},
834 {0x9c69a97284b578d7, 0xff2a760414536efc},
835 {0xc38413cf25e2d70d, 0xfef5138519684abb},
836 {0xf46518c2ef5b8cd1, 0x7eb258665fc25d6a},
837 {0x98bf2f79d5993802, 0xef2f773ffbd97a62},
838 {0xbeeefb584aff8603, 0xaafb550ffacfd8fb},
839 {0xeeaaba2e5dbf6784, 0x95ba2a53f983cf39},
840 {0x952ab45cfa97a0b2, 0xdd945a747bf26184},
841 {0xba756174393d88df, 0x94f971119aeef9e5},
842 {0xe912b9d1478ceb17, 0x7a37cd5601aab85e},
843 {0x91abb422ccb812ee, 0xac62e055c10ab33b},
844 {0xb616a12b7fe617aa, 0x577b986b314d600a},
845 {0xe39c49765fdf9d94, 0xed5a7e85fda0b80c},
846 {0x8e41ade9fbebc27d, 0x14588f13be847308},
847 {0xb1d219647ae6b31c, 0x596eb2d8ae258fc9},
848 {0xde469fbd99a05fe3, 0x6fca5f8ed9aef3bc},
849 {0x8aec23d680043bee, 0x25de7bb9480d5855},
850 {0xada72ccc20054ae9, 0xaf561aa79a10ae6b},
851 {0xd910f7ff28069da4, 0x1b2ba1518094da05},
852 {0x87aa9aff79042286, 0x90fb44d2f05d0843},
853 {0xa99541bf57452b28, 0x353a1607ac744a54},
854 {0xd3fa922f2d1675f2, 0x42889b8997915ce9},
855 {0x847c9b5d7c2e09b7, 0x69956135febada12},
856 {0xa59bc234db398c25, 0x43fab9837e699096},
857 {0xcf02b2c21207ef2e, 0x94f967e45e03f4bc},
858 {0x8161afb94b44f57d, 0x1d1be0eebac278f6},
859 {0xa1ba1ba79e1632dc, 0x6462d92a69731733},
860 {0xca28a291859bbf93, 0x7d7b8f7503cfdcff},
861 {0xfcb2cb35e702af78, 0x5cda735244c3d43f},
862 {0x9defbf01b061adab, 0x3a0888136afa64a8},
863 {0xc56baec21c7a1916, 0x088aaa1845b8fdd1},
864 {0xf6c69a72a3989f5b, 0x8aad549e57273d46},
865 {0x9a3c2087a63f6399, 0x36ac54e2f678864c},
866 {0xc0cb28a98fcf3c7f, 0x84576a1bb416a7de},
867 {0xf0fdf2d3f3c30b9f, 0x656d44a2a11c51d6},
868 {0x969eb7c47859e743, 0x9f644ae5a4b1b326},
869 {0xbc4665b596706114, 0x873d5d9f0dde1fef},
870 {0xeb57ff22fc0c7959, 0xa90cb506d155a7eb},
871 {0x9316ff75dd87cbd8, 0x09a7f12442d588f3},
872 {0xb7dcbf5354e9bece, 0x0c11ed6d538aeb30},
873 {0xe5d3ef282a242e81, 0x8f1668c8a86da5fb},
874 {0x8fa475791a569d10, 0xf96e017d694487bd},
875 {0xb38d92d760ec4455, 0x37c981dcc395a9ad},
876 {0xe070f78d3927556a, 0x85bbe253f47b1418},
877 {0x8c469ab843b89562, 0x93956d7478ccec8f},
878 {0xaf58416654a6babb, 0x387ac8d1970027b3},
879 {0xdb2e51bfe9d0696a, 0x06997b05fcc0319f},
880 {0x88fcf317f22241e2, 0x441fece3bdf81f04},
881 {0xab3c2fddeeaad25a, 0xd527e81cad7626c4},
882 {0xd60b3bd56a5586f1, 0x8a71e223d8d3b075},
883 {0x85c7056562757456, 0xf6872d5667844e4a},
884 {0xa738c6bebb12d16c, 0xb428f8ac016561dc},
885 {0xd106f86e69d785c7, 0xe13336d701beba53},
886 {0x82a45b450226b39c, 0xecc0024661173474},
887 {0xa34d721642b06084, 0x27f002d7f95d0191},
888 {0xcc20ce9bd35c78a5, 0x31ec038df7b441f5},
889 {0xff290242c83396ce, 0x7e67047175a15272},
890 {0x9f79a169bd203e41, 0x0f0062c6e984d387},
891 {0xc75809c42c684dd1, 0x52c07b78a3e60869},
892 {0xf92e0c3537826145, 0xa7709a56ccdf8a83},
893 {0x9bbcc7a142b17ccb, 0x88a66076400bb692},
894 {0xc2abf989935ddbfe, 0x6acff893d00ea436},
895 {0xf356f7ebf83552fe, 0x0583f6b8c4124d44},
896 {0x98165af37b2153de, 0xc3727a337a8b704b},
897 {0xbe1bf1b059e9a8d6, 0x744f18c0592e4c5d},
898 {0xeda2ee1c7064130c, 0x1162def06f79df74},
899 {0x9485d4d1c63e8be7, 0x8addcb5645ac2ba9},
900 {0xb9a74a0637ce2ee1, 0x6d953e2bd7173693},
901 {0xe8111c87c5c1ba99, 0xc8fa8db6ccdd0438},
902 {0x910ab1d4db9914a0, 0x1d9c9892400a22a3},
903 {0xb54d5e4a127f59c8, 0x2503beb6d00cab4c},
904 {0xe2a0b5dc971f303a, 0x2e44ae64840fd61e},
905 {0x8da471a9de737e24, 0x5ceaecfed289e5d3},
906 {0xb10d8e1456105dad, 0x7425a83e872c5f48},
907 {0xdd50f1996b947518, 0xd12f124e28f7771a},
908 {0x8a5296ffe33cc92f, 0x82bd6b70d99aaa70},
909 {0xace73cbfdc0bfb7b, 0x636cc64d1001550c},
910 {0xd8210befd30efa5a, 0x3c47f7e05401aa4f},
911 {0x8714a775e3e95c78, 0x65acfaec34810a72},
912 {0xa8d9d1535ce3b396, 0x7f1839a741a14d0e},
913 {0xd31045a8341ca07c, 0x1ede48111209a051},
914 {0x83ea2b892091e44d, 0x934aed0aab460433},
915 {0xa4e4b66b68b65d60, 0xf81da84d56178540},
916 {0xce1de40642e3f4b9, 0x36251260ab9d668f},
917 {0x80d2ae83e9ce78f3, 0xc1d72b7c6b42601a},
918 {0xa1075a24e4421730, 0xb24cf65b8612f820},
919 {0xc94930ae1d529cfc, 0xdee033f26797b628},
920 {0xfb9b7cd9a4a7443c, 0x169840ef017da3b2},
921 {0x9d412e0806e88aa5, 0x8e1f289560ee864f},
922 {0xc491798a08a2ad4e, 0xf1a6f2bab92a27e3},
923 {0xf5b5d7ec8acb58a2, 0xae10af696774b1dc},
924 {0x9991a6f3d6bf1765, 0xacca6da1e0a8ef2a},
925 {0xbff610b0cc6edd3f, 0x17fd090a58d32af4},
926 {0xeff394dcff8a948e, 0xddfc4b4cef07f5b1},
927 {0x95f83d0a1fb69cd9, 0x4abdaf101564f98f},
928 {0xbb764c4ca7a4440f, 0x9d6d1ad41abe37f2},
929 {0xea53df5fd18d5513, 0x84c86189216dc5ee},
930 {0x92746b9be2f8552c, 0x32fd3cf5b4e49bb5},
931 {0xb7118682dbb66a77, 0x3fbc8c33221dc2a2},
932 {0xe4d5e82392a40515, 0x0fabaf3feaa5334b},
933 {0x8f05b1163ba6832d, 0x29cb4d87f2a7400f},
934 {0xb2c71d5bca9023f8, 0x743e20e9ef511013},
935 {0xdf78e4b2bd342cf6, 0x914da9246b255417},
936 {0x8bab8eefb6409c1a, 0x1ad089b6c2f7548f},
937 {0xae9672aba3d0c320, 0xa184ac2473b529b2},
938 {0xda3c0f568cc4f3e8, 0xc9e5d72d90a2741f},
939 {0x8865899617fb1871, 0x7e2fa67c7a658893},
940 {0xaa7eebfb9df9de8d, 0xddbb901b98feeab8},
941 {0xd51ea6fa85785631, 0x552a74227f3ea566},
942 {0x8533285c936b35de, 0xd53a88958f872760},
943 {0xa67ff273b8460356, 0x8a892abaf368f138},
944 {0xd01fef10a657842c, 0x2d2b7569b0432d86},
945 {0x8213f56a67f6b29b, 0x9c3b29620e29fc74},
946 {0xa298f2c501f45f42, 0x8349f3ba91b47b90},
947 {0xcb3f2f7642717713, 0x241c70a936219a74},
948 {0xfe0efb53d30dd4d7, 0xed238cd383aa0111},
949 {0x9ec95d1463e8a506, 0xf4363804324a40ab},
950 {0xc67bb4597ce2ce48, 0xb143c6053edcd0d6},
951 {0xf81aa16fdc1b81da, 0xdd94b7868e94050b},
952 {0x9b10a4e5e9913128, 0xca7cf2b4191c8327},
953 {0xc1d4ce1f63f57d72, 0xfd1c2f611f63a3f1},
954 {0xf24a01a73cf2dccf, 0xbc633b39673c8ced},
955 {0x976e41088617ca01, 0xd5be0503e085d814},
956 {0xbd49d14aa79dbc82, 0x4b2d8644d8a74e19},
957 {0xec9c459d51852ba2, 0xddf8e7d60ed1219f},
958 {0x93e1ab8252f33b45, 0xcabb90e5c942b504},
959 {0xb8da1662e7b00a17, 0x3d6a751f3b936244},
960 {0xe7109bfba19c0c9d, 0x0cc512670a783ad5},
961 {0x906a617d450187e2, 0x27fb2b80668b24c6},
962 {0xb484f9dc9641e9da, 0xb1f9f660802dedf7},
963 {0xe1a63853bbd26451, 0x5e7873f8a0396974},
964 {0x8d07e33455637eb2, 0xdb0b487b6423e1e9},
965 {0xb049dc016abc5e5f, 0x91ce1a9a3d2cda63},
966 {0xdc5c5301c56b75f7, 0x7641a140cc7810fc},
967 {0x89b9b3e11b6329ba, 0xa9e904c87fcb0a9e},
968 {0xac2820d9623bf429, 0x546345fa9fbdcd45},
969 {0xd732290fbacaf133, 0xa97c177947ad4096},
970 {0x867f59a9d4bed6c0, 0x49ed8eabcccc485e},
971 {0xa81f301449ee8c70, 0x5c68f256bfff5a75},
972 {0xd226fc195c6a2f8c, 0x73832eec6fff3112},
973 {0x83585d8fd9c25db7, 0xc831fd53c5ff7eac},
974 {0xa42e74f3d032f525, 0xba3e7ca8b77f5e56},
975 {0xcd3a1230c43fb26f, 0x28ce1bd2e55f35ec},
976 {0x80444b5e7aa7cf85, 0x7980d163cf5b81b4},
977 {0xa0555e361951c366, 0xd7e105bcc3326220},
978 {0xc86ab5c39fa63440, 0x8dd9472bf3fefaa8},
979 {0xfa856334878fc150, 0xb14f98f6f0feb952},
980 {0x9c935e00d4b9d8d2, 0x6ed1bf9a569f33d4},
981 {0xc3b8358109e84f07, 0x0a862f80ec4700c9},
982 {0xf4a642e14c6262c8, 0xcd27bb612758c0fb},
983 {0x98e7e9cccfbd7dbd, 0x8038d51cb897789d},
984 {0xbf21e44003acdd2c, 0xe0470a63e6bd56c4},
985 {0xeeea5d5004981478, 0x1858ccfce06cac75},
986 {0x95527a5202df0ccb, 0x0f37801e0c43ebc9},
987 {0xbaa718e68396cffd, 0xd30560258f54e6bb},
988 {0xe950df20247c83fd, 0x47c6b82ef32a206a},
989 {0x91d28b7416cdd27e, 0x4cdc331d57fa5442},
990 {0xb6472e511c81471d, 0xe0133fe4adf8e953},
991 {0xe3d8f9e563a198e5, 0x58180fddd97723a7},
992 {0x8e679c2f5e44ff8f, 0x570f09eaa7ea7649},
993 {0xb201833b35d63f73, 0x2cd2cc6551e513db},
994 {0xde81e40a034bcf4f, 0xf8077f7ea65e58d2},
995 {0x8b112e86420f6191, 0xfb04afaf27faf783},
996 {0xadd57a27d29339f6, 0x79c5db9af1f9b564},
997 {0xd94ad8b1c7380874, 0x18375281ae7822bd},
998 {0x87cec76f1c830548, 0x8f2293910d0b15b6},
999 {0xa9c2794ae3a3c69a, 0xb2eb3875504ddb23},
1000 {0xd433179d9c8cb841, 0x5fa60692a46151ec},
1001 {0x849feec281d7f328, 0xdbc7c41ba6bcd334},
1002 {0xa5c7ea73224deff3, 0x12b9b522906c0801},
1003 {0xcf39e50feae16bef, 0xd768226b34870a01},
1004 {0x81842f29f2cce375, 0xe6a1158300d46641},
1005 {0xa1e53af46f801c53, 0x60495ae3c1097fd1},
1006 {0xca5e89b18b602368, 0x385bb19cb14bdfc5},
1007 {0xfcf62c1dee382c42, 0x46729e03dd9ed7b6},
1008 {0x9e19db92b4e31ba9, 0x6c07a2c26a8346d2},
1009 {0xc5a05277621be293, 0xc7098b7305241886},
1010 { 0xf70867153aa2db38,
1011 0xb8cbee4fc66d1ea8 }
1012#else
1013 {0xff77b1fcbebcdc4f, 0x25e8e89c13bb0f7b},
1014 {0xce5d73ff402d98e3, 0xfb0a3d212dc81290},
1015 {0xa6b34ad8c9dfc06f, 0xf42faa48c0ea481f},
1016 {0x86a8d39ef77164bc, 0xae5dff9c02033198},
1017 {0xd98ddaee19068c76, 0x3badd624dd9b0958},
1018 {0xafbd2350644eeacf, 0xe5d1929ef90898fb},
1019 {0x8df5efabc5979c8f, 0xca8d3ffa1ef463c2},
1020 {0xe55990879ddcaabd, 0xcc420a6a101d0516},
1021 {0xb94470938fa89bce, 0xf808e40e8d5b3e6a},
1022 {0x95a8637627989aad, 0xdde7001379a44aa9},
1023 {0xf1c90080baf72cb1, 0x5324c68b12dd6339},
1024 {0xc350000000000000, 0x0000000000000000},
1025 {0x9dc5ada82b70b59d, 0xf020000000000000},
1026 {0xfee50b7025c36a08, 0x02f236d04753d5b5},
1027 {0xcde6fd5e09abcf26, 0xed4c0226b55e6f87},
1028 {0xa6539930bf6bff45, 0x84db8346b786151d},
1029 {0x865b86925b9bc5c2, 0x0b8a2392ba45a9b3},
1030 {0xd910f7ff28069da4, 0x1b2ba1518094da05},
1031 {0xaf58416654a6babb, 0x387ac8d1970027b3},
1032 {0x8da471a9de737e24, 0x5ceaecfed289e5d3},
1033 {0xe4d5e82392a40515, 0x0fabaf3feaa5334b},
1034 {0xb8da1662e7b00a17, 0x3d6a751f3b936244},
1035 { 0x95527a5202df0ccb,
1036 0x0f37801e0c43ebc9 }
1037#endif
1038 };
1039
1040#if FMT_USE_FULL_CACHE_DRAGONBOX
1041 return pow10_significands[k - float_info<double>::min_k];
1042#else
1043 static constexpr const uint64_t powers_of_5_64[] = {
1044 0x0000000000000001, 0x0000000000000005, 0x0000000000000019,
1045 0x000000000000007d, 0x0000000000000271, 0x0000000000000c35,
1046 0x0000000000003d09, 0x000000000001312d, 0x000000000005f5e1,
1047 0x00000000001dcd65, 0x00000000009502f9, 0x0000000002e90edd,
1048 0x000000000e8d4a51, 0x0000000048c27395, 0x000000016bcc41e9,
1049 0x000000071afd498d, 0x0000002386f26fc1, 0x000000b1a2bc2ec5,
1050 0x000003782dace9d9, 0x00001158e460913d, 0x000056bc75e2d631,
1051 0x0001b1ae4d6e2ef5, 0x000878678326eac9, 0x002a5a058fc295ed,
1052 0x00d3c21bcecceda1, 0x0422ca8b0a00a425, 0x14adf4b7320334b9};
1053
1054 static const int compression_ratio = 27;
1055
1056 // Compute base index.
1057 int cache_index = (k - float_info<double>::min_k) / compression_ratio;
1058 int kb = cache_index * compression_ratio + float_info<double>::min_k;
1059 int offset = k - kb;
1060
1061 // Get base cache.
1062 uint128_fallback base_cache = pow10_significands[cache_index];
1063 if (offset == 0) return base_cache;
1064
1065 // Compute the required amount of bit-shift.
1066 int alpha = floor_log2_pow10(kb + offset) - floor_log2_pow10(kb) - offset;
1067 FMT_ASSERT(alpha > 0 && alpha < 64, "shifting error detected");
1068
1069 // Try to recover the real cache.
1070 uint64_t pow5 = powers_of_5_64[offset];
1071 uint128_fallback recovered_cache = umul128(base_cache.high(), pow5);
1072 uint128_fallback middle_low = umul128(base_cache.low(), pow5);
1073
1074 recovered_cache += middle_low.high();
1075
1076 uint64_t high_to_middle = recovered_cache.high() << (64 - alpha);
1077 uint64_t middle_to_low = recovered_cache.low() << (64 - alpha);
1078
1079 recovered_cache =
1080 uint128_fallback{(recovered_cache.low() >> alpha) | high_to_middle,
1081 ((middle_low.low() >> alpha) | middle_to_low)};
1082 FMT_ASSERT(recovered_cache.low() + 1 != 0, "");
1083 return {recovered_cache.high(), recovered_cache.low() + 1};
1084#endif
1085 }
1086
1087 struct compute_mul_result {
1090 };
1091 struct compute_mul_parity_result {
1094 };
1095
1096 static compute_mul_result compute_mul(
1097 carrier_uint u, const cache_entry_type& cache) noexcept {
1098 auto r = umul192_upper128(u, cache);
1099 return {r.high(), r.low() == 0};
1100 }
1101
1103 int beta) noexcept {
1104 return static_cast<uint32_t>(cache.high() >> (64 - 1 - beta));
1105 }
1106
1107 static compute_mul_parity_result compute_mul_parity(
1108 carrier_uint two_f, const cache_entry_type& cache, int beta) noexcept {
1109 FMT_ASSERT(beta >= 1, "");
1110 FMT_ASSERT(beta < 64, "");
1111
1112 auto r = umul192_lower128(two_f, cache);
1113 return {((r.high() >> (64 - beta)) & 1) != 0,
1114 ((r.high() << beta) | (r.low() >> (64 - beta))) == 0};
1115 }
1116
1118 const cache_entry_type& cache, int beta) noexcept {
1119 return (cache.high() -
1120 (cache.high() >> (num_significand_bits<double>() + 2))) >>
1121 (64 - num_significand_bits<double>() - 1 - beta);
1122 }
1123
1125 const cache_entry_type& cache, int beta) noexcept {
1126 return (cache.high() +
1127 (cache.high() >> (num_significand_bits<double>() + 1))) >>
1128 (64 - num_significand_bits<double>() - 1 - beta);
1129 }
1130
1132 const cache_entry_type& cache, int beta) noexcept {
1133 return ((cache.high() >> (64 - num_significand_bits<double>() - 2 - beta)) +
1134 1) /
1135 2;
1136 }
1137};
1138
1139// Various integer checks
1140template <class T>
1142 const int case_shorter_interval_left_endpoint_lower_threshold = 2;
1143 const int case_shorter_interval_left_endpoint_upper_threshold = 3;
1144 return exponent >= case_shorter_interval_left_endpoint_lower_threshold &&
1145 exponent <= case_shorter_interval_left_endpoint_upper_threshold;
1146}
1147
1148// Remove trailing zeros from n and return the number of zeros removed (float)
1150 FMT_ASSERT(n != 0, "");
1151 const uint32_t mod_inv_5 = 0xcccccccd;
1152 const uint32_t mod_inv_25 = mod_inv_5 * mod_inv_5;
1153
1154 int s = 0;
1155 while (true) {
1156 auto q = rotr(n * mod_inv_25, 2);
1157 if (q > max_value<uint32_t>() / 100) break;
1158 n = q;
1159 s += 2;
1160 }
1161 auto q = rotr(n * mod_inv_5, 1);
1162 if (q <= max_value<uint32_t>() / 10) {
1163 n = q;
1164 s |= 1;
1165 }
1166
1167 return s;
1168}
1169
1170// Removes trailing zeros and returns the number of zeros removed (double)
1172 FMT_ASSERT(n != 0, "");
1173
1174 // This magic number is ceil(2^90 / 10^8).
1175 constexpr uint64_t magic_number = 12379400392853802749ull;
1176 auto nm = umul128(n, magic_number);
1177
1178 // Is n is divisible by 10^8?
1179 if ((nm.high() & ((1ull << (90 - 64)) - 1)) == 0 && nm.low() < magic_number) {
1180 // If yes, work with the quotient.
1181 auto n32 = static_cast<uint32_t>(nm.high() >> (90 - 64));
1182
1183 const uint32_t mod_inv_5 = 0xcccccccd;
1184 const uint32_t mod_inv_25 = mod_inv_5 * mod_inv_5;
1185
1186 int s = 8;
1187 while (true) {
1188 auto q = rotr(n32 * mod_inv_25, 2);
1189 if (q > max_value<uint32_t>() / 100) break;
1190 n32 = q;
1191 s += 2;
1192 }
1193 auto q = rotr(n32 * mod_inv_5, 1);
1194 if (q <= max_value<uint32_t>() / 10) {
1195 n32 = q;
1196 s |= 1;
1197 }
1198
1199 n = n32;
1200 return s;
1201 }
1202
1203 // If n is not divisible by 10^8, work with n itself.
1204 const uint64_t mod_inv_5 = 0xcccccccccccccccd;
1205 const uint64_t mod_inv_25 = mod_inv_5 * mod_inv_5;
1206
1207 int s = 0;
1208 while (true) {
1209 auto q = rotr(n * mod_inv_25, 2);
1210 if (q > max_value<uint64_t>() / 100) break;
1211 n = q;
1212 s += 2;
1213 }
1214 auto q = rotr(n * mod_inv_5, 1);
1215 if (q <= max_value<uint64_t>() / 10) {
1216 n = q;
1217 s |= 1;
1218 }
1219
1220 return s;
1221}
1222
1223// The main algorithm for shorter interval case
1224template <class T>
1225FMT_INLINE decimal_fp<T> shorter_interval_case(int exponent) noexcept {
1226 decimal_fp<T> ret_value;
1227 // Compute k and beta
1228 const int minus_k = floor_log10_pow2_minus_log10_4_over_3(exponent);
1229 const int beta = exponent + floor_log2_pow10(-minus_k);
1230
1231 // Compute xi and zi
1232 using cache_entry_type = typename cache_accessor<T>::cache_entry_type;
1233 const cache_entry_type cache = cache_accessor<T>::get_cached_power(-minus_k);
1234
1236 cache, beta);
1238 cache, beta);
1239
1240 // If the left endpoint is not an integer, increase it
1241 if (!is_left_endpoint_integer_shorter_interval<T>(exponent)) ++xi;
1242
1243 // Try bigger divisor
1244 ret_value.significand = zi / 10;
1245
1246 // If succeed, remove trailing zeros if necessary and return
1247 if (ret_value.significand * 10 >= xi) {
1248 ret_value.exponent = minus_k + 1;
1249 ret_value.exponent += remove_trailing_zeros(ret_value.significand);
1250 return ret_value;
1251 }
1252
1253 // Otherwise, compute the round-up of y
1254 ret_value.significand =
1256 beta);
1257 ret_value.exponent = minus_k;
1258
1259 // When tie occurs, choose one of them according to the rule
1260 if (exponent >= float_info<T>::shorter_interval_tie_lower_threshold &&
1261 exponent <= float_info<T>::shorter_interval_tie_upper_threshold) {
1262 ret_value.significand = ret_value.significand % 2 == 0
1263 ? ret_value.significand
1264 : ret_value.significand - 1;
1265 } else if (ret_value.significand < xi) {
1266 ++ret_value.significand;
1267 }
1268 return ret_value;
1269}
1270
1271template <typename T> decimal_fp<T> to_decimal(T x) noexcept {
1272 // Step 1: integer promotion & Schubfach multiplier calculation.
1273
1274 using carrier_uint = typename float_info<T>::carrier_uint;
1275 using cache_entry_type = typename cache_accessor<T>::cache_entry_type;
1276 auto br = bit_cast<carrier_uint>(x);
1277
1278 // Extract significand bits and exponent bits.
1279 const carrier_uint significand_mask =
1280 (static_cast<carrier_uint>(1) << num_significand_bits<T>()) - 1;
1281 carrier_uint significand = (br & significand_mask);
1282 int exponent =
1283 static_cast<int>((br & exponent_mask<T>()) >> num_significand_bits<T>());
1284
1285 if (exponent != 0) { // Check if normal.
1286 exponent -= exponent_bias<T>() + num_significand_bits<T>();
1287
1288 // Shorter interval case; proceed like Schubfach.
1289 // In fact, when exponent == 1 and significand == 0, the interval is
1290 // regular. However, it can be shown that the end-results are anyway same.
1291 if (significand == 0) return shorter_interval_case<T>(exponent);
1292
1293 significand |= (static_cast<carrier_uint>(1) << num_significand_bits<T>());
1294 } else {
1295 // Subnormal case; the interval is always regular.
1296 if (significand == 0) return {0, 0};
1297 exponent =
1298 std::numeric_limits<T>::min_exponent - num_significand_bits<T>() - 1;
1299 }
1300
1301 const bool include_left_endpoint = (significand % 2 == 0);
1302 const bool include_right_endpoint = include_left_endpoint;
1303
1304 // Compute k and beta.
1305 const int minus_k = floor_log10_pow2(exponent) - float_info<T>::kappa;
1306 const cache_entry_type cache = cache_accessor<T>::get_cached_power(-minus_k);
1307 const int beta = exponent + floor_log2_pow10(-minus_k);
1308
1309 // Compute zi and deltai.
1310 // 10^kappa <= deltai < 10^(kappa + 1)
1311 const uint32_t deltai = cache_accessor<T>::compute_delta(cache, beta);
1312 const carrier_uint two_fc = significand << 1;
1313
1314 // For the case of binary32, the result of integer check is not correct for
1315 // 29711844 * 2^-82
1316 // = 6.1442653300000000008655037797566933477355632930994033813476... * 10^-18
1317 // and 29711844 * 2^-81
1318 // = 1.2288530660000000001731007559513386695471126586198806762695... * 10^-17,
1319 // and they are the unique counterexamples. However, since 29711844 is even,
1320 // this does not cause any problem for the endpoints calculations; it can only
1321 // cause a problem when we need to perform integer check for the center.
1322 // Fortunately, with these inputs, that branch is never executed, so we are
1323 // fine.
1324 const typename cache_accessor<T>::compute_mul_result z_mul =
1325 cache_accessor<T>::compute_mul((two_fc | 1) << beta, cache);
1326
1327 // Step 2: Try larger divisor; remove trailing zeros if necessary.
1328
1329 // Using an upper bound on zi, we might be able to optimize the division
1330 // better than the compiler; we are computing zi / big_divisor here.
1331 decimal_fp<T> ret_value;
1332 ret_value.significand = divide_by_10_to_kappa_plus_1(z_mul.result);
1333 uint32_t r = static_cast<uint32_t>(z_mul.result - float_info<T>::big_divisor *
1334 ret_value.significand);
1335
1336 if (r < deltai) {
1337 // Exclude the right endpoint if necessary.
1338 if (r == 0 && (z_mul.is_integer & !include_right_endpoint)) {
1339 --ret_value.significand;
1340 r = float_info<T>::big_divisor;
1341 goto small_divisor_case_label;
1342 }
1343 } else if (r > deltai) {
1344 goto small_divisor_case_label;
1345 } else {
1346 // r == deltai; compare fractional parts.
1348 cache_accessor<T>::compute_mul_parity(two_fc - 1, cache, beta);
1349
1350 if (!(x_mul.parity | (x_mul.is_integer & include_left_endpoint)))
1351 goto small_divisor_case_label;
1352 }
1353 ret_value.exponent = minus_k + float_info<T>::kappa + 1;
1354
1355 // We may need to remove trailing zeros.
1356 ret_value.exponent += remove_trailing_zeros(ret_value.significand);
1357 return ret_value;
1358
1359 // Step 3: Find the significand with the smaller divisor.
1360
1361small_divisor_case_label:
1362 ret_value.significand *= 10;
1363 ret_value.exponent = minus_k + float_info<T>::kappa;
1364
1365 uint32_t dist = r - (deltai / 2) + (float_info<T>::small_divisor / 2);
1366 const bool approx_y_parity =
1367 ((dist ^ (float_info<T>::small_divisor / 2)) & 1) != 0;
1368
1369 // Is dist divisible by 10^kappa?
1370 const bool divisible_by_small_divisor =
1371 check_divisibility_and_divide_by_pow10<float_info<T>::kappa>(dist);
1372
1373 // Add dist / 10^kappa to the significand.
1374 ret_value.significand += dist;
1375
1376 if (!divisible_by_small_divisor) return ret_value;
1377
1378 // Check z^(f) >= epsilon^(f).
1379 // We have either yi == zi - epsiloni or yi == (zi - epsiloni) - 1,
1380 // where yi == zi - epsiloni if and only if z^(f) >= epsilon^(f).
1381 // Since there are only 2 possibilities, we only need to care about the
1382 // parity. Also, zi and r should have the same parity since the divisor
1383 // is an even number.
1384 const auto y_mul = cache_accessor<T>::compute_mul_parity(two_fc, cache, beta);
1385
1386 // If z^(f) >= epsilon^(f), we might have a tie when z^(f) == epsilon^(f),
1387 // or equivalently, when y is an integer.
1388 if (y_mul.parity != approx_y_parity)
1389 --ret_value.significand;
1390 else if (y_mul.is_integer & (ret_value.significand % 2 != 0))
1391 --ret_value.significand;
1392 return ret_value;
1393}
1394} // namespace dragonbox
1395
1396#ifdef _MSC_VER
1397FMT_FUNC auto fmt_snprintf(char* buf, size_t size, const char* fmt, ...)
1398 -> int {
1399 auto args = va_list();
1400 va_start(args, fmt);
1401 int result = vsnprintf_s(buf, size, _TRUNCATE, fmt, args);
1402 va_end(args);
1403 return result;
1404}
1405#endif
1406} // namespace detail
1407
1408template <> struct formatter<detail::bigint> {
1411 return ctx.begin();
1412 }
1413
1414 template <typename FormatContext>
1415 auto format(const detail::bigint& n, FormatContext& ctx) const ->
1416 typename FormatContext::iterator {
1417 auto out = ctx.out();
1418 bool first = true;
1419 for (auto i = n.bigits_.size(); i > 0; --i) {
1420 auto value = n.bigits_[i - 1u];
1421 if (first) {
1422 out = format_to(out, FMT_STRING("{:x}"), value);
1423 first = false;
1424 continue;
1425 }
1426 out = format_to(out, FMT_STRING("{:08x}"), value);
1427 }
1428 if (n.exp_ > 0)
1429 out = format_to(out, FMT_STRING("p{}"),
1430 n.exp_ * detail::bigint::bigit_bits);
1431 return out;
1432 }
1433};
1434
1435FMT_FUNC detail::utf8_to_utf16::utf8_to_utf16(string_view s) {
1436 for_each_codepoint(s, [this](uint32_t cp, string_view) {
1437 if (cp == invalid_code_point) FMT_THROW(std::runtime_error("invalid utf8"));
1438 if (cp <= 0xFFFF) {
1439 buffer_.push_back(static_cast<wchar_t>(cp));
1440 } else {
1441 cp -= 0x10000;
1442 buffer_.push_back(static_cast<wchar_t>(0xD800 + (cp >> 10)));
1443 buffer_.push_back(static_cast<wchar_t>(0xDC00 + (cp & 0x3FF)));
1444 }
1445 return true;
1446 });
1447 buffer_.push_back(0);
1448}
1449
1450FMT_FUNC void format_system_error(detail::buffer<char>& out, int error_code,
1451 const char* message) noexcept {
1452 FMT_TRY {
1453 auto ec = std::error_code(error_code, std::generic_category());
1454 write(std::back_inserter(out), std::system_error(ec, message).what());
1455 return;
1456 }
1457 FMT_CATCH(...) {}
1458 format_error_code(out, error_code, message);
1459}
1460
1461FMT_FUNC void report_system_error(int error_code,
1462 const char* message) noexcept {
1463 report_error(format_system_error, error_code, message);
1464}
1465
1466FMT_FUNC std::string vformat(string_view fmt, format_args args) {
1467 // Don't optimize the "{}" case to keep the binary size small and because it
1468 // can be better optimized in fmt::format anyway.
1469 auto buffer = memory_buffer();
1470 detail::vformat_to(buffer, fmt, args);
1471 return to_string(buffer);
1472}
1473
1474namespace detail {
1475#ifdef _WIN32
1476using dword = conditional_t<sizeof(long) == 4, unsigned long, unsigned>;
1477extern "C" __declspec(dllimport) int __stdcall WriteConsoleW( //
1478 void*, const void*, dword, dword*, void*);
1479
1480FMT_FUNC bool write_console(std::FILE* f, string_view text) {
1481 auto fd = _fileno(f);
1482 if (_isatty(fd)) {
1483 detail::utf8_to_utf16 u16(string_view(text.data(), text.size()));
1484 auto written = detail::dword();
1485 if (detail::WriteConsoleW(reinterpret_cast<void*>(_get_osfhandle(fd)),
1486 u16.c_str(), static_cast<uint32_t>(u16.size()),
1487 &written, nullptr)) {
1488 return true;
1489 }
1490 }
1491 // We return false if the file descriptor was not TTY, or it was but
1492 // SetConsoleW failed which can happen if the output has been redirected to
1493 // NUL. In both cases when we return false, we should attempt to do regular
1494 // write via fwrite or std::ostream::write.
1495 return false;
1496}
1497#endif
1498
1499FMT_FUNC void print(std::FILE* f, string_view text) {
1500#ifdef _WIN32
1501 if (write_console(f, text)) return;
1502#endif
1503 detail::fwrite_fully(text.data(), 1, text.size(), f);
1504}
1505} // namespace detail
1506
1507FMT_FUNC void vprint(std::FILE* f, string_view format_str, format_args args) {
1509 detail::vformat_to(buffer, format_str, args);
1510 detail::print(f, {buffer.data(), buffer.size()});
1511}
1512
1513#ifdef _WIN32
1514// Print assuming legacy (non-Unicode) encoding.
1515FMT_FUNC void detail::vprint_mojibake(std::FILE* f, string_view format_str,
1516 format_args args) {
1518 detail::vformat_to(buffer, format_str,
1520 fwrite_fully(buffer.data(), 1, buffer.size(), f);
1521}
1522#endif
1523
1524FMT_FUNC void vprint(string_view format_str, format_args args) {
1525 vprint(stdout, format_str, args);
1526}
1527
1528namespace detail {
1529
1531 unsigned char upper;
1532 unsigned char lower_count;
1533};
1534
1535inline auto is_printable(uint16_t x, const singleton* singletons,
1536 size_t singletons_size,
1537 const unsigned char* singleton_lowers,
1538 const unsigned char* normal, size_t normal_size)
1539 -> bool {
1540 auto upper = x >> 8;
1541 auto lower_start = 0;
1542 for (size_t i = 0; i < singletons_size; ++i) {
1543 auto s = singletons[i];
1544 auto lower_end = lower_start + s.lower_count;
1545 if (upper < s.upper) break;
1546 if (upper == s.upper) {
1547 for (auto j = lower_start; j < lower_end; ++j) {
1548 if (singleton_lowers[j] == (x & 0xff)) return false;
1549 }
1550 }
1551 lower_start = lower_end;
1552 }
1553
1554 auto xsigned = static_cast<int>(x);
1555 auto current = true;
1556 for (size_t i = 0; i < normal_size; ++i) {
1557 auto v = static_cast<int>(normal[i]);
1558 auto len = (v & 0x80) != 0 ? (v & 0x7f) << 8 | normal[++i] : v;
1559 xsigned -= len;
1560 if (xsigned < 0) break;
1561 current = !current;
1562 }
1563 return current;
1564}
1565
1566// This code is generated by support/printable.py.
1568 static constexpr singleton singletons0[] = {
1569 {0x00, 1}, {0x03, 5}, {0x05, 6}, {0x06, 3}, {0x07, 6}, {0x08, 8},
1570 {0x09, 17}, {0x0a, 28}, {0x0b, 25}, {0x0c, 20}, {0x0d, 16}, {0x0e, 13},
1571 {0x0f, 4}, {0x10, 3}, {0x12, 18}, {0x13, 9}, {0x16, 1}, {0x17, 5},
1572 {0x18, 2}, {0x19, 3}, {0x1a, 7}, {0x1c, 2}, {0x1d, 1}, {0x1f, 22},
1573 {0x20, 3}, {0x2b, 3}, {0x2c, 2}, {0x2d, 11}, {0x2e, 1}, {0x30, 3},
1574 {0x31, 2}, {0x32, 1}, {0xa7, 2}, {0xa9, 2}, {0xaa, 4}, {0xab, 8},
1575 {0xfa, 2}, {0xfb, 5}, {0xfd, 4}, {0xfe, 3}, {0xff, 9},
1576 };
1577 static constexpr unsigned char singletons0_lower[] = {
1578 0xad, 0x78, 0x79, 0x8b, 0x8d, 0xa2, 0x30, 0x57, 0x58, 0x8b, 0x8c, 0x90,
1579 0x1c, 0x1d, 0xdd, 0x0e, 0x0f, 0x4b, 0x4c, 0xfb, 0xfc, 0x2e, 0x2f, 0x3f,
1580 0x5c, 0x5d, 0x5f, 0xb5, 0xe2, 0x84, 0x8d, 0x8e, 0x91, 0x92, 0xa9, 0xb1,
1581 0xba, 0xbb, 0xc5, 0xc6, 0xc9, 0xca, 0xde, 0xe4, 0xe5, 0xff, 0x00, 0x04,
1582 0x11, 0x12, 0x29, 0x31, 0x34, 0x37, 0x3a, 0x3b, 0x3d, 0x49, 0x4a, 0x5d,
1583 0x84, 0x8e, 0x92, 0xa9, 0xb1, 0xb4, 0xba, 0xbb, 0xc6, 0xca, 0xce, 0xcf,
1584 0xe4, 0xe5, 0x00, 0x04, 0x0d, 0x0e, 0x11, 0x12, 0x29, 0x31, 0x34, 0x3a,
1585 0x3b, 0x45, 0x46, 0x49, 0x4a, 0x5e, 0x64, 0x65, 0x84, 0x91, 0x9b, 0x9d,
1586 0xc9, 0xce, 0xcf, 0x0d, 0x11, 0x29, 0x45, 0x49, 0x57, 0x64, 0x65, 0x8d,
1587 0x91, 0xa9, 0xb4, 0xba, 0xbb, 0xc5, 0xc9, 0xdf, 0xe4, 0xe5, 0xf0, 0x0d,
1588 0x11, 0x45, 0x49, 0x64, 0x65, 0x80, 0x84, 0xb2, 0xbc, 0xbe, 0xbf, 0xd5,
1589 0xd7, 0xf0, 0xf1, 0x83, 0x85, 0x8b, 0xa4, 0xa6, 0xbe, 0xbf, 0xc5, 0xc7,
1590 0xce, 0xcf, 0xda, 0xdb, 0x48, 0x98, 0xbd, 0xcd, 0xc6, 0xce, 0xcf, 0x49,
1591 0x4e, 0x4f, 0x57, 0x59, 0x5e, 0x5f, 0x89, 0x8e, 0x8f, 0xb1, 0xb6, 0xb7,
1592 0xbf, 0xc1, 0xc6, 0xc7, 0xd7, 0x11, 0x16, 0x17, 0x5b, 0x5c, 0xf6, 0xf7,
1593 0xfe, 0xff, 0x80, 0x0d, 0x6d, 0x71, 0xde, 0xdf, 0x0e, 0x0f, 0x1f, 0x6e,
1594 0x6f, 0x1c, 0x1d, 0x5f, 0x7d, 0x7e, 0xae, 0xaf, 0xbb, 0xbc, 0xfa, 0x16,
1595 0x17, 0x1e, 0x1f, 0x46, 0x47, 0x4e, 0x4f, 0x58, 0x5a, 0x5c, 0x5e, 0x7e,
1596 0x7f, 0xb5, 0xc5, 0xd4, 0xd5, 0xdc, 0xf0, 0xf1, 0xf5, 0x72, 0x73, 0x8f,
1597 0x74, 0x75, 0x96, 0x2f, 0x5f, 0x26, 0x2e, 0x2f, 0xa7, 0xaf, 0xb7, 0xbf,
1598 0xc7, 0xcf, 0xd7, 0xdf, 0x9a, 0x40, 0x97, 0x98, 0x30, 0x8f, 0x1f, 0xc0,
1599 0xc1, 0xce, 0xff, 0x4e, 0x4f, 0x5a, 0x5b, 0x07, 0x08, 0x0f, 0x10, 0x27,
1600 0x2f, 0xee, 0xef, 0x6e, 0x6f, 0x37, 0x3d, 0x3f, 0x42, 0x45, 0x90, 0x91,
1601 0xfe, 0xff, 0x53, 0x67, 0x75, 0xc8, 0xc9, 0xd0, 0xd1, 0xd8, 0xd9, 0xe7,
1602 0xfe, 0xff,
1603 };
1604 static constexpr singleton singletons1[] = {
1605 {0x00, 6}, {0x01, 1}, {0x03, 1}, {0x04, 2}, {0x08, 8}, {0x09, 2},
1606 {0x0a, 5}, {0x0b, 2}, {0x0e, 4}, {0x10, 1}, {0x11, 2}, {0x12, 5},
1607 {0x13, 17}, {0x14, 1}, {0x15, 2}, {0x17, 2}, {0x19, 13}, {0x1c, 5},
1608 {0x1d, 8}, {0x24, 1}, {0x6a, 3}, {0x6b, 2}, {0xbc, 2}, {0xd1, 2},
1609 {0xd4, 12}, {0xd5, 9}, {0xd6, 2}, {0xd7, 2}, {0xda, 1}, {0xe0, 5},
1610 {0xe1, 2}, {0xe8, 2}, {0xee, 32}, {0xf0, 4}, {0xf8, 2}, {0xf9, 2},
1611 {0xfa, 2}, {0xfb, 1},
1612 };
1613 static constexpr unsigned char singletons1_lower[] = {
1614 0x0c, 0x27, 0x3b, 0x3e, 0x4e, 0x4f, 0x8f, 0x9e, 0x9e, 0x9f, 0x06, 0x07,
1615 0x09, 0x36, 0x3d, 0x3e, 0x56, 0xf3, 0xd0, 0xd1, 0x04, 0x14, 0x18, 0x36,
1616 0x37, 0x56, 0x57, 0x7f, 0xaa, 0xae, 0xaf, 0xbd, 0x35, 0xe0, 0x12, 0x87,
1617 0x89, 0x8e, 0x9e, 0x04, 0x0d, 0x0e, 0x11, 0x12, 0x29, 0x31, 0x34, 0x3a,
1618 0x45, 0x46, 0x49, 0x4a, 0x4e, 0x4f, 0x64, 0x65, 0x5c, 0xb6, 0xb7, 0x1b,
1619 0x1c, 0x07, 0x08, 0x0a, 0x0b, 0x14, 0x17, 0x36, 0x39, 0x3a, 0xa8, 0xa9,
1620 0xd8, 0xd9, 0x09, 0x37, 0x90, 0x91, 0xa8, 0x07, 0x0a, 0x3b, 0x3e, 0x66,
1621 0x69, 0x8f, 0x92, 0x6f, 0x5f, 0xee, 0xef, 0x5a, 0x62, 0x9a, 0x9b, 0x27,
1622 0x28, 0x55, 0x9d, 0xa0, 0xa1, 0xa3, 0xa4, 0xa7, 0xa8, 0xad, 0xba, 0xbc,
1623 0xc4, 0x06, 0x0b, 0x0c, 0x15, 0x1d, 0x3a, 0x3f, 0x45, 0x51, 0xa6, 0xa7,
1624 0xcc, 0xcd, 0xa0, 0x07, 0x19, 0x1a, 0x22, 0x25, 0x3e, 0x3f, 0xc5, 0xc6,
1625 0x04, 0x20, 0x23, 0x25, 0x26, 0x28, 0x33, 0x38, 0x3a, 0x48, 0x4a, 0x4c,
1626 0x50, 0x53, 0x55, 0x56, 0x58, 0x5a, 0x5c, 0x5e, 0x60, 0x63, 0x65, 0x66,
1627 0x6b, 0x73, 0x78, 0x7d, 0x7f, 0x8a, 0xa4, 0xaa, 0xaf, 0xb0, 0xc0, 0xd0,
1628 0xae, 0xaf, 0x79, 0xcc, 0x6e, 0x6f, 0x93,
1629 };
1630 static constexpr unsigned char normal0[] = {
1631 0x00, 0x20, 0x5f, 0x22, 0x82, 0xdf, 0x04, 0x82, 0x44, 0x08, 0x1b, 0x04,
1632 0x06, 0x11, 0x81, 0xac, 0x0e, 0x80, 0xab, 0x35, 0x28, 0x0b, 0x80, 0xe0,
1633 0x03, 0x19, 0x08, 0x01, 0x04, 0x2f, 0x04, 0x34, 0x04, 0x07, 0x03, 0x01,
1634 0x07, 0x06, 0x07, 0x11, 0x0a, 0x50, 0x0f, 0x12, 0x07, 0x55, 0x07, 0x03,
1635 0x04, 0x1c, 0x0a, 0x09, 0x03, 0x08, 0x03, 0x07, 0x03, 0x02, 0x03, 0x03,
1636 0x03, 0x0c, 0x04, 0x05, 0x03, 0x0b, 0x06, 0x01, 0x0e, 0x15, 0x05, 0x3a,
1637 0x03, 0x11, 0x07, 0x06, 0x05, 0x10, 0x07, 0x57, 0x07, 0x02, 0x07, 0x15,
1638 0x0d, 0x50, 0x04, 0x43, 0x03, 0x2d, 0x03, 0x01, 0x04, 0x11, 0x06, 0x0f,
1639 0x0c, 0x3a, 0x04, 0x1d, 0x25, 0x5f, 0x20, 0x6d, 0x04, 0x6a, 0x25, 0x80,
1640 0xc8, 0x05, 0x82, 0xb0, 0x03, 0x1a, 0x06, 0x82, 0xfd, 0x03, 0x59, 0x07,
1641 0x15, 0x0b, 0x17, 0x09, 0x14, 0x0c, 0x14, 0x0c, 0x6a, 0x06, 0x0a, 0x06,
1642 0x1a, 0x06, 0x59, 0x07, 0x2b, 0x05, 0x46, 0x0a, 0x2c, 0x04, 0x0c, 0x04,
1643 0x01, 0x03, 0x31, 0x0b, 0x2c, 0x04, 0x1a, 0x06, 0x0b, 0x03, 0x80, 0xac,
1644 0x06, 0x0a, 0x06, 0x21, 0x3f, 0x4c, 0x04, 0x2d, 0x03, 0x74, 0x08, 0x3c,
1645 0x03, 0x0f, 0x03, 0x3c, 0x07, 0x38, 0x08, 0x2b, 0x05, 0x82, 0xff, 0x11,
1646 0x18, 0x08, 0x2f, 0x11, 0x2d, 0x03, 0x20, 0x10, 0x21, 0x0f, 0x80, 0x8c,
1647 0x04, 0x82, 0x97, 0x19, 0x0b, 0x15, 0x88, 0x94, 0x05, 0x2f, 0x05, 0x3b,
1648 0x07, 0x02, 0x0e, 0x18, 0x09, 0x80, 0xb3, 0x2d, 0x74, 0x0c, 0x80, 0xd6,
1649 0x1a, 0x0c, 0x05, 0x80, 0xff, 0x05, 0x80, 0xdf, 0x0c, 0xee, 0x0d, 0x03,
1650 0x84, 0x8d, 0x03, 0x37, 0x09, 0x81, 0x5c, 0x14, 0x80, 0xb8, 0x08, 0x80,
1651 0xcb, 0x2a, 0x38, 0x03, 0x0a, 0x06, 0x38, 0x08, 0x46, 0x08, 0x0c, 0x06,
1652 0x74, 0x0b, 0x1e, 0x03, 0x5a, 0x04, 0x59, 0x09, 0x80, 0x83, 0x18, 0x1c,
1653 0x0a, 0x16, 0x09, 0x4c, 0x04, 0x80, 0x8a, 0x06, 0xab, 0xa4, 0x0c, 0x17,
1654 0x04, 0x31, 0xa1, 0x04, 0x81, 0xda, 0x26, 0x07, 0x0c, 0x05, 0x05, 0x80,
1655 0xa5, 0x11, 0x81, 0x6d, 0x10, 0x78, 0x28, 0x2a, 0x06, 0x4c, 0x04, 0x80,
1656 0x8d, 0x04, 0x80, 0xbe, 0x03, 0x1b, 0x03, 0x0f, 0x0d,
1657 };
1658 static constexpr unsigned char normal1[] = {
1659 0x5e, 0x22, 0x7b, 0x05, 0x03, 0x04, 0x2d, 0x03, 0x66, 0x03, 0x01, 0x2f,
1660 0x2e, 0x80, 0x82, 0x1d, 0x03, 0x31, 0x0f, 0x1c, 0x04, 0x24, 0x09, 0x1e,
1661 0x05, 0x2b, 0x05, 0x44, 0x04, 0x0e, 0x2a, 0x80, 0xaa, 0x06, 0x24, 0x04,
1662 0x24, 0x04, 0x28, 0x08, 0x34, 0x0b, 0x01, 0x80, 0x90, 0x81, 0x37, 0x09,
1663 0x16, 0x0a, 0x08, 0x80, 0x98, 0x39, 0x03, 0x63, 0x08, 0x09, 0x30, 0x16,
1664 0x05, 0x21, 0x03, 0x1b, 0x05, 0x01, 0x40, 0x38, 0x04, 0x4b, 0x05, 0x2f,
1665 0x04, 0x0a, 0x07, 0x09, 0x07, 0x40, 0x20, 0x27, 0x04, 0x0c, 0x09, 0x36,
1666 0x03, 0x3a, 0x05, 0x1a, 0x07, 0x04, 0x0c, 0x07, 0x50, 0x49, 0x37, 0x33,
1667 0x0d, 0x33, 0x07, 0x2e, 0x08, 0x0a, 0x81, 0x26, 0x52, 0x4e, 0x28, 0x08,
1668 0x2a, 0x56, 0x1c, 0x14, 0x17, 0x09, 0x4e, 0x04, 0x1e, 0x0f, 0x43, 0x0e,
1669 0x19, 0x07, 0x0a, 0x06, 0x48, 0x08, 0x27, 0x09, 0x75, 0x0b, 0x3f, 0x41,
1670 0x2a, 0x06, 0x3b, 0x05, 0x0a, 0x06, 0x51, 0x06, 0x01, 0x05, 0x10, 0x03,
1671 0x05, 0x80, 0x8b, 0x62, 0x1e, 0x48, 0x08, 0x0a, 0x80, 0xa6, 0x5e, 0x22,
1672 0x45, 0x0b, 0x0a, 0x06, 0x0d, 0x13, 0x39, 0x07, 0x0a, 0x36, 0x2c, 0x04,
1673 0x10, 0x80, 0xc0, 0x3c, 0x64, 0x53, 0x0c, 0x48, 0x09, 0x0a, 0x46, 0x45,
1674 0x1b, 0x48, 0x08, 0x53, 0x1d, 0x39, 0x81, 0x07, 0x46, 0x0a, 0x1d, 0x03,
1675 0x47, 0x49, 0x37, 0x03, 0x0e, 0x08, 0x0a, 0x06, 0x39, 0x07, 0x0a, 0x81,
1676 0x36, 0x19, 0x80, 0xb7, 0x01, 0x0f, 0x32, 0x0d, 0x83, 0x9b, 0x66, 0x75,
1677 0x0b, 0x80, 0xc4, 0x8a, 0xbc, 0x84, 0x2f, 0x8f, 0xd1, 0x82, 0x47, 0xa1,
1678 0xb9, 0x82, 0x39, 0x07, 0x2a, 0x04, 0x02, 0x60, 0x26, 0x0a, 0x46, 0x0a,
1679 0x28, 0x05, 0x13, 0x82, 0xb0, 0x5b, 0x65, 0x4b, 0x04, 0x39, 0x07, 0x11,
1680 0x40, 0x05, 0x0b, 0x02, 0x0e, 0x97, 0xf8, 0x08, 0x84, 0xd6, 0x2a, 0x09,
1681 0xa2, 0xf7, 0x81, 0x1f, 0x31, 0x03, 0x11, 0x04, 0x08, 0x81, 0x8c, 0x89,
1682 0x04, 0x6b, 0x05, 0x0d, 0x03, 0x09, 0x07, 0x10, 0x93, 0x60, 0x80, 0xf6,
1683 0x0a, 0x73, 0x08, 0x6e, 0x17, 0x46, 0x80, 0x9a, 0x14, 0x0c, 0x57, 0x09,
1684 0x19, 0x80, 0x87, 0x81, 0x47, 0x03, 0x85, 0x42, 0x0f, 0x15, 0x85, 0x50,
1685 0x2b, 0x80, 0xd5, 0x2d, 0x03, 0x1a, 0x04, 0x02, 0x81, 0x70, 0x3a, 0x05,
1686 0x01, 0x85, 0x00, 0x80, 0xd7, 0x29, 0x4c, 0x04, 0x0a, 0x04, 0x02, 0x83,
1687 0x11, 0x44, 0x4c, 0x3d, 0x80, 0xc2, 0x3c, 0x06, 0x01, 0x04, 0x55, 0x05,
1688 0x1b, 0x34, 0x02, 0x81, 0x0e, 0x2c, 0x04, 0x64, 0x0c, 0x56, 0x0a, 0x80,
1689 0xae, 0x38, 0x1d, 0x0d, 0x2c, 0x04, 0x09, 0x07, 0x02, 0x0e, 0x06, 0x80,
1690 0x9a, 0x83, 0xd8, 0x08, 0x0d, 0x03, 0x0d, 0x03, 0x74, 0x0c, 0x59, 0x07,
1691 0x0c, 0x14, 0x0c, 0x04, 0x38, 0x08, 0x0a, 0x06, 0x28, 0x08, 0x22, 0x4e,
1692 0x81, 0x54, 0x0c, 0x15, 0x03, 0x03, 0x05, 0x07, 0x09, 0x19, 0x07, 0x07,
1693 0x09, 0x03, 0x0d, 0x07, 0x29, 0x80, 0xcb, 0x25, 0x0a, 0x84, 0x06,
1694 };
1695 auto lower = static_cast<uint16_t>(cp);
1696 if (cp < 0x10000) {
1697 return is_printable(lower, singletons0,
1698 sizeof(singletons0) / sizeof(*singletons0),
1699 singletons0_lower, normal0, sizeof(normal0));
1700 }
1701 if (cp < 0x20000) {
1702 return is_printable(lower, singletons1,
1703 sizeof(singletons1) / sizeof(*singletons1),
1704 singletons1_lower, normal1, sizeof(normal1));
1705 }
1706 if (0x2a6de <= cp && cp < 0x2a700) return false;
1707 if (0x2b735 <= cp && cp < 0x2b740) return false;
1708 if (0x2b81e <= cp && cp < 0x2b820) return false;
1709 if (0x2cea2 <= cp && cp < 0x2ceb0) return false;
1710 if (0x2ebe1 <= cp && cp < 0x2f800) return false;
1711 if (0x2fa1e <= cp && cp < 0x30000) return false;
1712 if (0x3134b <= cp && cp < 0xe0100) return false;
1713 if (0xe01f0 <= cp && cp < 0x110000) return false;
1714 return cp < 0x110000;
1715}
1716
1717} // namespace detail
1718
1720
1721#endif // FMT_FORMAT_INL_H_
then any Derivative Works that You distribute must include a readable copy of the attribution notices contained within such NOTICE file
Definition: ThirdPartyNotices.txt:195
constexpr common_return_t< T1, T2 > beta(const T1 a, const T2 b) noexcept
Compile-time beta function.
Definition: beta.hpp:36
\rst A view of a collection of formatting arguments.
Definition: core.h:1948
Definition: core.h:1788
\rst Parsing context consisting of a format string range being parsed and an argument counter for aut...
Definition: core.h:654
typename basic_string_view< Char >::iterator iterator
Definition: core.h:663
\rst A dynamically growing memory buffer for trivially copyable/constructible types with the first SI...
Definition: format.h:819
constexpr auto size() const noexcept -> size_t
Returns the string size.
Definition: core.h:475
constexpr auto data() const noexcept -> const Char *
Returns a pointer to the string data.
Definition: core.h:472
Definition: format.h:2707
\rst A contiguous memory buffer with an optional growing ability.
Definition: core.h:862
FMT_CONSTEXPR auto data() noexcept -> T *
Returns a pointer to the buffer data.
Definition: core.h:908
constexpr auto size() const noexcept -> size_t
Returns the size of this buffer.
Definition: core.h:902
Definition: format.h:322
constexpr uint64_t low() const noexcept
Definition: format.h:333
constexpr uint64_t high() const noexcept
Definition: format.h:332
A formatting error such as invalid format string.
Definition: format.h:949
~format_error() noexcept override FMT_MSC_DEFAULT
Definition: core.h:1710
constexpr locale_ref()
Definition: core.h:1715
auto get() const -> Locale
Definition: core.h:1240
#define FMT_ASSERT(condition, message)
Definition: core.h:369
basic_string_view< char > string_view
Definition: core.h:520
uint128_opt
Definition: core.h:400
FMT_API void vprint_mojibake(std::FILE *, string_view, format_args)
Definition: core.h:3020
constexpr auto count() -> size_t
Definition: core.h:1204
#define FMT_CONSTEXPR
Definition: core.h:106
#define FMT_BEGIN_NAMESPACE
Definition: core.h:214
#define FMT_API
Definition: core.h:246
conditional_t< std::is_same< T, char >::value, appender, std::back_insert_iterator< buffer< T > > > buffer_appender
Definition: core.h:1106
#define FMT_INLINE
Definition: core.h:199
FMT_CONSTEXPR auto to_unsigned(Int value) -> typename std::make_unsigned< Int >::type
Definition: core.h:407
typename std::conditional< B, T, F >::type conditional_t
Definition: core.h:300
#define FMT_END_NAMESPACE
Definition: core.h:217
FMT_FUNC std::system_error vsystem_error(int error_code, string_view format_str, format_args args)
Definition: format-inl.h:122
FMT_FUNC void format_system_error(detail::buffer< char > &out, int error_code, const char *message) noexcept
\rst Formats an error message for an error returned by an operating system or a language runtime,...
Definition: format-inl.h:1450
FMT_FUNC void vprint(std::FILE *f, string_view format_str, format_args args)
Definition: format-inl.h:1507
FMT_FUNC std::string vformat(string_view fmt, format_args args)
Definition: format-inl.h:1466
FMT_FUNC void report_system_error(int error_code, const char *message) noexcept
Definition: format-inl.h:1461
#define FMT_FUNC
Definition: format.h:4214
auto system_error(int error_code, format_string< T... > fmt, T &&... args) -> std::system_error
\rst Constructs :class:std::system_error with a message formatted with fmt::format(fmt,...
Definition: format.h:3622
#define FMT_STRING(s)
\rst Constructs a compile-time format string from a string literal s.
Definition: format.h:1772
FMT_API void format_error_code(buffer< char > &out, int error_code, string_view message) noexcept
FMT_CONSTEXPR20 auto count_digits(uint64_t n) -> int
Definition: format.h:1093
#define FMT_TRY
Definition: format.h:106
void(*)(detail::buffer< char > &, int, const char *) format_func
Definition: format.h:3592
FMT_API auto thousands_sep_impl(locale_ref loc) -> thousands_sep_result< Char >
FMT_API void report_error(format_func func, int error_code, const char *message) noexcept
@ inline_buffer_size
Definition: format.h:794
constexpr auto is_negative(T value) -> bool
Definition: format.h:1001
conditional_t< num_bits< T >()<=32 &&!FMT_REDUCE_INT_INSTANTIATIONS, uint32_t, conditional_t< num_bits< T >()<=64, uint64_t, uint128_t > > uint32_or_64_or_128_t
Definition: format.h:1023
basic_memory_buffer< char > memory_buffer
Definition: format.h:934
#define FMT_CATCH(x)
Definition: format.h:107
auto thousands_sep(locale_ref loc) -> thousands_sep_result< Char >
Definition: format.h:1168
#define FMT_THROW(x)
Definition: format.h:95
auto ptr(T p) -> const void *
\rst Converts p to const void* for pointer formatting.
Definition: format.h:3808
FMT_CONSTEXPR fp get_cached_power(int min_exponent, int &pow10_exponent)
Definition: format.h:1548
const Scalar & y
Definition: MathFunctions.h:821
EIGEN_CONSTEXPR Index size(const T &x)
Definition: Meta.h:479
EIGEN_CONSTEXPR Index first(const T &x) EIGEN_NOEXCEPT
Definition: IndexedViewHelper.h:81
::uint64_t uint64_t
Definition: Meta.h:58
::uint16_t uint16_t
Definition: Meta.h:54
::uint32_t uint32_t
Definition: Meta.h:56
uint32_t divide_by_10_to_kappa_plus_1(uint32_t n) noexcept
Definition: format-inl.h:278
bool is_left_endpoint_integer_shorter_interval(int exponent) noexcept
Definition: format-inl.h:1141
uint32_t small_division_by_pow10(uint32_t n) noexcept
Definition: format-inl.h:269
FMT_INLINE int remove_trailing_zeros(uint32_t &n) noexcept
Definition: format-inl.h:1149
uint64_t umul96_upper64(uint32_t x, uint64_t y) noexcept
Definition: format-inl.h:198
int shift_amount
Definition: format-inl.h:237
uint32_t divisor
Definition: format-inl.h:236
int floor_log2_pow10(int e) noexcept
Definition: format-inl.h:226
uint64_t umul128_upper64(uint64_t x, uint64_t y) noexcept
Definition: format-inl.h:176
static constexpr struct detail::dragonbox::@783 div_small_pow10_infos[]
uint64_t umul96_lower64(uint32_t x, uint64_t y) noexcept
Definition: format-inl.h:213
FMT_INLINE decimal_fp< T > shorter_interval_case(int exponent) noexcept
Definition: format-inl.h:1225
int floor_log10_pow2_minus_log10_4_over_3(int e) noexcept
Definition: format-inl.h:230
uint128_fallback umul192_upper128(uint64_t x, uint128_fallback y) noexcept
Definition: format-inl.h:189
int floor_log10_pow2(int e) noexcept
Definition: format-inl.h:219
bool check_divisibility_and_divide_by_pow10(uint32_t &n) noexcept
Definition: format-inl.h:244
uint128_fallback umul192_lower128(uint64_t x, uint128_fallback y) noexcept
Definition: format-inl.h:204
decimal_fp< T > to_decimal(T x) noexcept
Definition: format-inl.h:1271
Definition: chrono.h:303
uint128_fallback umul128(uint64_t x, uint64_t y) noexcept
Definition: format-inl.h:145
FMT_FUNC void format_error_code(detail::buffer< char > &out, int error_code, string_view message) noexcept
Definition: format-inl.h:47
auto write(OutputIt out, const std::tm &time, const std::locale &loc, char format, char modifier=0) -> OutputIt
Definition: chrono.h:426
FMT_FUNC void print(std::FILE *f, string_view text)
Definition: format-inl.h:1499
FMT_CONSTEXPR uint32_t rotr(uint32_t n, uint32_t r) noexcept
Definition: format-inl.h:135
FMT_FUNC void report_error(format_func func, int error_code, const char *message) noexcept
Definition: format-inl.h:70
constexpr uint32_t invalid_code_point
Definition: format.h:639
FMT_FUNC void throw_format_error(const char *message)
Definition: format-inl.h:43
FMT_FUNC void assert_fail(const char *file, int line, const char *message)
Definition: format-inl.h:34
bool operator==(basic_fp< F > x, basic_fp< F > y)
Definition: format-inl.h:130
void fwrite_fully(const void *ptr, size_t size, size_t count, FILE *stream)
Definition: format-inl.h:80
FMT_FUNC Char decimal_point_impl(locale_ref loc)
Definition: format-inl.h:103
auto is_printable(uint16_t x, const singleton *singletons, size_t singletons_size, const unsigned char *singleton_lowers, const unsigned char *normal, size_t normal_size) -> bool
Definition: format-inl.h:1535
FMT_CONSTEXPR void for_each_codepoint(string_view s, F f)
Definition: format.h:644
result
Definition: format.h:2556
Definition: format.h:1286
static constexpr const charge::coulomb_t e(1.6021766208e-19)
elementary charge.
static constexpr const velocity::meters_per_second_t c(299792458.0)
Speed of light in vacuum.
std::string to_string(const T &t)
Definition: base.h:93
b
Definition: data.h:44
auto fprintf(std::FILE *f, const S &fmt, const T &... args) -> int
\rst Prints formatted data to the file f.
Definition: printf.h:607
Definition: format.h:1390
int e
Definition: format.h:1392
F f
Definition: format.h:1391
carrier_uint result
Definition: format-inl.h:1088
static compute_mul_result compute_mul(carrier_uint u, const cache_entry_type &cache) noexcept
Definition: format-inl.h:1096
static uint32_t compute_delta(cache_entry_type const &cache, int beta) noexcept
Definition: format-inl.h:1102
float_info< double >::carrier_uint carrier_uint
Definition: format-inl.h:383
static carrier_uint compute_right_endpoint_for_shorter_interval_case(const cache_entry_type &cache, int beta) noexcept
Definition: format-inl.h:1124
static compute_mul_parity_result compute_mul_parity(carrier_uint two_f, const cache_entry_type &cache, int beta) noexcept
Definition: format-inl.h:1107
static carrier_uint compute_round_up_for_shorter_interval_case(const cache_entry_type &cache, int beta) noexcept
Definition: format-inl.h:1131
static carrier_uint compute_left_endpoint_for_shorter_interval_case(const cache_entry_type &cache, int beta) noexcept
Definition: format-inl.h:1117
static uint128_fallback get_cached_power(int k) noexcept
Definition: format-inl.h:386
carrier_uint result
Definition: format-inl.h:329
float_info< float >::carrier_uint carrier_uint
Definition: format-inl.h:292
uint64_t cache_entry_type
Definition: format-inl.h:293
static uint64_t get_cached_power(int k) noexcept
Definition: format-inl.h:295
static carrier_uint compute_right_endpoint_for_shorter_interval_case(const cache_entry_type &cache, int beta) noexcept
Definition: format-inl.h:366
static carrier_uint compute_left_endpoint_for_shorter_interval_case(const cache_entry_type &cache, int beta) noexcept
Definition: format-inl.h:359
static carrier_uint compute_round_up_for_shorter_interval_case(const cache_entry_type &cache, int beta) noexcept
Definition: format-inl.h:373
static compute_mul_parity_result compute_mul_parity(carrier_uint two_f, const cache_entry_type &cache, int beta) noexcept
Definition: format-inl.h:349
static uint32_t compute_delta(const cache_entry_type &cache, int beta) noexcept
Definition: format-inl.h:344
static compute_mul_result compute_mul(carrier_uint u, const cache_entry_type &cache) noexcept
Definition: format-inl.h:337
Definition: format-inl.h:289
Definition: format-inl.h:1530
unsigned char lower_count
Definition: format-inl.h:1532
unsigned char upper
Definition: format-inl.h:1531
auto format(const detail::bigint &n, FormatContext &ctx) const -> typename FormatContext::iterator
Definition: format-inl.h:1415
FMT_CONSTEXPR auto parse(format_parse_context &ctx) -> format_parse_context::iterator
Definition: format-inl.h:1409
Definition: core.h:791
Definition: format.h:1160
auto vformat_to(OutputIt out, const S &format_str, basic_format_args< buffer_context< type_identity_t< Char > > > args) -> OutputIt
Definition: xchar.h:124
auto format_to(OutputIt out, const S &fmt, Args &&... args) -> OutputIt
Definition: xchar.h:136