8 #ifndef FMT_FORMAT_INL_H_
9 #define FMT_FORMAT_INL_H_
12 #pragma GCC system_header
16 #pragma clang system_header
29 #ifndef FMT_STATIC_THOUSANDS_SEPARATOR
42 FMT_FUNC
void assert_fail(
const char *file,
int line,
const char *message) {
45 std::fprintf(stderr,
"%s:%d: assertion failed: %s", file, line, message);
51 FMT_FUNC
void throw_format_error(
const char *message) {
55 FMT_FUNC
void format_error_code(detail::buffer<char> &out,
int error_code,
61 static const char SEP[] =
": ";
62 static const char ERROR_STR[] =
"error ";
64 size_t error_code_size =
sizeof(SEP) +
sizeof(ERROR_STR) - 2;
65 auto abs_value =
static_cast<uint32_or_64_or_128_t<int>
>(error_code);
66 if (detail::is_negative(error_code)) {
67 abs_value = 0 - abs_value;
70 error_code_size += detail::to_unsigned(detail::count_digits(abs_value));
71 auto it = buffer_appender<char>(out);
72 if (message.size() <= inline_buffer_size - error_code_size)
73 format_to(it, FMT_STRING(
"{}{}"), message, SEP);
74 format_to(it, FMT_STRING(
"{}{}"), ERROR_STR, error_code);
75 FMT_ASSERT(out.size() <= inline_buffer_size,
"");
78 FMT_FUNC
void report_error(format_func func,
int error_code,
79 const char *message) noexcept {
81 func(full_message, error_code, message);
83 if (std::fwrite(full_message.data(), full_message.size(), 1, stderr) > 0)
84 std::fputc(
'\n', stderr);
88 inline void fwrite_fully(
const void *ptr,
size_t size,
size_t count,
90 size_t written = std::fwrite(ptr, size, count, stream);
92 FMT_THROW(system_error(errno, FMT_STRING(
"cannot write to file")));
95 #ifndef FMT_STATIC_THOUSANDS_SEPARATOR
96 template <
typename Locale>
97 locale_ref::locale_ref(
const Locale &loc) : locale_(&loc) {
98 static_assert(std::is_same<Locale, std::locale>::value,
"");
101 template <
typename Locale> Locale locale_ref::get()
const {
102 static_assert(std::is_same<Locale, std::locale>::value,
"");
103 return locale_ ? *
static_cast<const std::locale *
>(locale_) : std::locale();
106 template <
typename Char>
107 FMT_FUNC
auto thousands_sep_impl(locale_ref loc) -> thousands_sep_result<Char> {
108 auto &facet = std::use_facet<std::numpunct<Char>>(loc.get<std::locale>());
109 auto grouping = facet.grouping();
110 auto thousands_sep = grouping.empty() ? Char() : facet.thousands_sep();
111 return {std::move(grouping), thousands_sep};
113 template <
typename Char> FMT_FUNC Char decimal_point_impl(locale_ref loc) {
114 return std::use_facet<std::numpunct<Char>>(loc.get<std::locale>())
118 template <
typename Char>
119 FMT_FUNC
auto thousands_sep_impl(locale_ref) -> thousands_sep_result<Char> {
120 return {
"\03", FMT_STATIC_THOUSANDS_SEPARATOR};
122 template <
typename Char> FMT_FUNC Char decimal_point_impl(locale_ref) {
127 FMT_FUNC
auto write_loc(appender out, loc_value value,
128 const format_specs<> &specs, locale_ref loc) ->
bool {
129 #ifndef FMT_STATIC_THOUSANDS_SEPARATOR
130 auto locale = loc.get<std::locale>();
133 using facet = format_facet<std::locale>;
134 if (std::has_facet<facet>(locale))
135 return std::use_facet<facet>(locale).put(out, value, specs);
136 return facet(locale).put(out, value, specs);
142 template <
typename Locale>
typename Locale::id format_facet<Locale>::id;
144 #ifndef FMT_STATIC_THOUSANDS_SEPARATOR
145 template <
typename Locale> format_facet<Locale>::format_facet(Locale &loc) {
146 auto &numpunct = std::use_facet<std::numpunct<char>>(loc);
147 grouping_ = numpunct.grouping();
148 if (!grouping_.empty())
149 separator_ = std::string(1, numpunct.thousands_sep());
153 FMT_API FMT_FUNC
auto
154 format_facet<std::locale>::do_put(appender out, loc_value val,
155 const format_specs<> &specs)
const ->
bool {
157 detail::loc_writer<>{out, specs, separator_, grouping_, decimal_point_});
162 FMT_API FMT_FUNC format_error::~format_error() noexcept = default;
165 FMT_FUNC std::system_error vsystem_error(
int error_code,
string_view format_str,
167 auto ec = std::error_code(error_code, std::generic_category());
168 return std::system_error(ec, vformat(format_str, args));
173 template <
typename F>
inline bool operator==(basic_fp<F> x, basic_fp<F> y) {
174 return x.f == y.f && x.e == y.e;
178 FMT_CONSTEXPR
inline uint32_t rotr(uint32_t n, uint32_t r) noexcept {
180 return (n >> r) | (n << (32 - r));
182 FMT_CONSTEXPR
inline uint64_t rotr(uint64_t n, uint32_t r) noexcept {
184 return (n >> r) | (n << (64 - r));
188 namespace dragonbox {
191 inline uint64_t umul96_upper64(uint32_t x, uint64_t y) noexcept {
192 return umul128_upper64(
static_cast<uint64_t
>(x) << 32, y);
197 inline uint128_fallback umul192_lower128(uint64_t x,
198 uint128_fallback y) noexcept {
199 uint64_t high = x * y.high();
200 uint128_fallback high_low = umul128(x, y.low());
201 return {high + high_low.high(), high_low.low()};
206 inline uint64_t umul96_lower64(uint32_t x, uint64_t y) noexcept {
211 inline int floor_log10_pow2_minus_log10_4_over_3(
int e) noexcept {
212 FMT_ASSERT(e <= 2936 && e >= -2985,
"too large exponent");
213 return (e * 631305 - 261663) >> 21;
216 static constexpr
struct {
219 } div_small_pow10_infos[] = {{10, 16}, {100, 16}};
225 bool check_divisibility_and_divide_by_pow10(uint32_t &n) noexcept {
237 constexpr
auto info = div_small_pow10_infos[N - 1];
238 FMT_ASSERT(n <= info.divisor * 10,
"n is too large");
239 constexpr uint32_t magic_number =
240 (1u << info.shift_amount) / info.divisor + 1;
242 const uint32_t comparison_mask = (1u << info.shift_amount) - 1;
243 bool result = (n & comparison_mask) < magic_number;
244 n >>= info.shift_amount;
250 template <
int N> uint32_t small_division_by_pow10(uint32_t n) noexcept {
251 constexpr
auto info = div_small_pow10_infos[N - 1];
252 FMT_ASSERT(n <= info.divisor * 10,
"n is too large");
253 constexpr uint32_t magic_number =
254 (1u << info.shift_amount) / info.divisor + 1;
255 return (n * magic_number) >> info.shift_amount;
259 inline uint32_t divide_by_10_to_kappa_plus_1(uint32_t n) noexcept {
261 return static_cast<uint32_t
>((
static_cast<uint64_t
>(n) * 1374389535) >> 37);
264 inline uint64_t divide_by_10_to_kappa_plus_1(uint64_t n) noexcept {
266 return umul128_upper64(n, 2361183241434822607ull) >> 7;
270 template <
class T>
struct cache_accessor;
272 template <>
struct cache_accessor<float> {
273 using carrier_uint = float_info<float>::carrier_uint;
274 using cache_entry_type = uint64_t;
276 static uint64_t get_cached_power(
int k) noexcept {
277 FMT_ASSERT(k >= float_info<float>::min_k && k <= float_info<float>::max_k,
278 "k is out of range");
279 static constexpr
const uint64_t pow10_significands[] = {
280 0x81ceb32c4b43fcf5, 0xa2425ff75e14fc32, 0xcad2f7f5359a3b3f,
281 0xfd87b5f28300ca0e, 0x9e74d1b791e07e49, 0xc612062576589ddb,
282 0xf79687aed3eec552, 0x9abe14cd44753b53, 0xc16d9a0095928a28,
283 0xf1c90080baf72cb2, 0x971da05074da7bef, 0xbce5086492111aeb,
284 0xec1e4a7db69561a6, 0x9392ee8e921d5d08, 0xb877aa3236a4b44a,
285 0xe69594bec44de15c, 0x901d7cf73ab0acda, 0xb424dc35095cd810,
286 0xe12e13424bb40e14, 0x8cbccc096f5088cc, 0xafebff0bcb24aaff,
287 0xdbe6fecebdedd5bf, 0x89705f4136b4a598, 0xabcc77118461cefd,
288 0xd6bf94d5e57a42bd, 0x8637bd05af6c69b6, 0xa7c5ac471b478424,
289 0xd1b71758e219652c, 0x83126e978d4fdf3c, 0xa3d70a3d70a3d70b,
290 0xcccccccccccccccd, 0x8000000000000000, 0xa000000000000000,
291 0xc800000000000000, 0xfa00000000000000, 0x9c40000000000000,
292 0xc350000000000000, 0xf424000000000000, 0x9896800000000000,
293 0xbebc200000000000, 0xee6b280000000000, 0x9502f90000000000,
294 0xba43b74000000000, 0xe8d4a51000000000, 0x9184e72a00000000,
295 0xb5e620f480000000, 0xe35fa931a0000000, 0x8e1bc9bf04000000,
296 0xb1a2bc2ec5000000, 0xde0b6b3a76400000, 0x8ac7230489e80000,
297 0xad78ebc5ac620000, 0xd8d726b7177a8000, 0x878678326eac9000,
298 0xa968163f0a57b400, 0xd3c21bcecceda100, 0x84595161401484a0,
299 0xa56fa5b99019a5c8, 0xcecb8f27f4200f3a, 0x813f3978f8940985,
300 0xa18f07d736b90be6, 0xc9f2c9cd04674edf, 0xfc6f7c4045812297,
301 0x9dc5ada82b70b59e, 0xc5371912364ce306, 0xf684df56c3e01bc7,
302 0x9a130b963a6c115d, 0xc097ce7bc90715b4, 0xf0bdc21abb48db21,
303 0x96769950b50d88f5, 0xbc143fa4e250eb32, 0xeb194f8e1ae525fe,
304 0x92efd1b8d0cf37bf, 0xb7abc627050305ae, 0xe596b7b0c643c71a,
305 0x8f7e32ce7bea5c70, 0xb35dbf821ae4f38c, 0xe0352f62a19e306f};
306 return pow10_significands[k - float_info<float>::min_k];
309 struct compute_mul_result {
313 struct compute_mul_parity_result {
318 static compute_mul_result
319 compute_mul(carrier_uint u,
const cache_entry_type &cache) noexcept {
320 auto r = umul96_upper64(u, cache);
321 return {
static_cast<carrier_uint
>(r >> 32),
322 static_cast<carrier_uint
>(r) == 0};
325 static uint32_t compute_delta(
const cache_entry_type &cache,
327 return static_cast<uint32_t
>(cache >> (64 - 1 - beta));
330 static compute_mul_parity_result
331 compute_mul_parity(carrier_uint two_f,
const cache_entry_type &cache,
333 FMT_ASSERT(beta >= 1,
"");
334 FMT_ASSERT(beta < 64,
"");
336 auto r = umul96_lower64(two_f, cache);
337 return {((r >> (64 - beta)) & 1) != 0,
338 static_cast<uint32_t
>(r >> (32 - beta)) == 0};
342 compute_left_endpoint_for_shorter_interval_case(
const cache_entry_type &cache,
344 return static_cast<carrier_uint
>(
345 (cache - (cache >> (num_significand_bits<float>() + 2))) >>
346 (64 - num_significand_bits<float>() - 1 - beta));
349 static carrier_uint compute_right_endpoint_for_shorter_interval_case(
350 const cache_entry_type &cache,
int beta) noexcept {
351 return static_cast<carrier_uint
>(
352 (cache + (cache >> (num_significand_bits<float>() + 1))) >>
353 (64 - num_significand_bits<float>() - 1 - beta));
357 compute_round_up_for_shorter_interval_case(
const cache_entry_type &cache,
359 return (
static_cast<carrier_uint
>(
360 cache >> (64 - num_significand_bits<float>() - 2 - beta)) +
366 template <>
struct cache_accessor<double> {
367 using carrier_uint = float_info<double>::carrier_uint;
368 using cache_entry_type = uint128_fallback;
370 static uint128_fallback get_cached_power(
int k) noexcept {
371 FMT_ASSERT(k >= float_info<double>::min_k && k <= float_info<double>::max_k,
372 "k is out of range");
374 static constexpr
const uint128_fallback pow10_significands[] = {
375 #if FMT_USE_FULL_CACHE_DRAGONBOX
376 {0xff77b1fcbebcdc4f, 0x25e8e89c13bb0f7b},
377 {0x9faacf3df73609b1, 0x77b191618c54e9ad},
378 {0xc795830d75038c1d, 0xd59df5b9ef6a2418},
379 {0xf97ae3d0d2446f25, 0x4b0573286b44ad1e},
380 {0x9becce62836ac577, 0x4ee367f9430aec33},
381 {0xc2e801fb244576d5, 0x229c41f793cda740},
382 {0xf3a20279ed56d48a, 0x6b43527578c11110},
383 {0x9845418c345644d6, 0x830a13896b78aaaa},
384 {0xbe5691ef416bd60c, 0x23cc986bc656d554},
385 {0xedec366b11c6cb8f, 0x2cbfbe86b7ec8aa9},
386 {0x94b3a202eb1c3f39, 0x7bf7d71432f3d6aa},
387 {0xb9e08a83a5e34f07, 0xdaf5ccd93fb0cc54},
388 {0xe858ad248f5c22c9, 0xd1b3400f8f9cff69},
389 {0x91376c36d99995be, 0x23100809b9c21fa2},
390 {0xb58547448ffffb2d, 0xabd40a0c2832a78b},
391 {0xe2e69915b3fff9f9, 0x16c90c8f323f516d},
392 {0x8dd01fad907ffc3b, 0xae3da7d97f6792e4},
393 {0xb1442798f49ffb4a, 0x99cd11cfdf41779d},
394 {0xdd95317f31c7fa1d, 0x40405643d711d584},
395 {0x8a7d3eef7f1cfc52, 0x482835ea666b2573},
396 {0xad1c8eab5ee43b66, 0xda3243650005eed0},
397 {0xd863b256369d4a40, 0x90bed43e40076a83},
398 {0x873e4f75e2224e68, 0x5a7744a6e804a292},
399 {0xa90de3535aaae202, 0x711515d0a205cb37},
400 {0xd3515c2831559a83, 0x0d5a5b44ca873e04},
401 {0x8412d9991ed58091, 0xe858790afe9486c3},
402 {0xa5178fff668ae0b6, 0x626e974dbe39a873},
403 {0xce5d73ff402d98e3, 0xfb0a3d212dc81290},
404 {0x80fa687f881c7f8e, 0x7ce66634bc9d0b9a},
405 {0xa139029f6a239f72, 0x1c1fffc1ebc44e81},
406 {0xc987434744ac874e, 0xa327ffb266b56221},
407 {0xfbe9141915d7a922, 0x4bf1ff9f0062baa9},
408 {0x9d71ac8fada6c9b5, 0x6f773fc3603db4aa},
409 {0xc4ce17b399107c22, 0xcb550fb4384d21d4},
410 {0xf6019da07f549b2b, 0x7e2a53a146606a49},
411 {0x99c102844f94e0fb, 0x2eda7444cbfc426e},
412 {0xc0314325637a1939, 0xfa911155fefb5309},
413 {0xf03d93eebc589f88, 0x793555ab7eba27cb},
414 {0x96267c7535b763b5, 0x4bc1558b2f3458df},
415 {0xbbb01b9283253ca2, 0x9eb1aaedfb016f17},
416 {0xea9c227723ee8bcb, 0x465e15a979c1cadd},
417 {0x92a1958a7675175f, 0x0bfacd89ec191eca},
418 {0xb749faed14125d36, 0xcef980ec671f667c},
419 {0xe51c79a85916f484, 0x82b7e12780e7401b},
420 {0x8f31cc0937ae58d2, 0xd1b2ecb8b0908811},
421 {0xb2fe3f0b8599ef07, 0x861fa7e6dcb4aa16},
422 {0xdfbdcece67006ac9, 0x67a791e093e1d49b},
423 {0x8bd6a141006042bd, 0xe0c8bb2c5c6d24e1},
424 {0xaecc49914078536d, 0x58fae9f773886e19},
425 {0xda7f5bf590966848, 0xaf39a475506a899f},
426 {0x888f99797a5e012d, 0x6d8406c952429604},
427 {0xaab37fd7d8f58178, 0xc8e5087ba6d33b84},
428 {0xd5605fcdcf32e1d6, 0xfb1e4a9a90880a65},
429 {0x855c3be0a17fcd26, 0x5cf2eea09a550680},
430 {0xa6b34ad8c9dfc06f, 0xf42faa48c0ea481f},
431 {0xd0601d8efc57b08b, 0xf13b94daf124da27},
432 {0x823c12795db6ce57, 0x76c53d08d6b70859},
433 {0xa2cb1717b52481ed, 0x54768c4b0c64ca6f},
434 {0xcb7ddcdda26da268, 0xa9942f5dcf7dfd0a},
435 {0xfe5d54150b090b02, 0xd3f93b35435d7c4d},
436 {0x9efa548d26e5a6e1, 0xc47bc5014a1a6db0},
437 {0xc6b8e9b0709f109a, 0x359ab6419ca1091c},
438 {0xf867241c8cc6d4c0, 0xc30163d203c94b63},
439 {0x9b407691d7fc44f8, 0x79e0de63425dcf1e},
440 {0xc21094364dfb5636, 0x985915fc12f542e5},
441 {0xf294b943e17a2bc4, 0x3e6f5b7b17b2939e},
442 {0x979cf3ca6cec5b5a, 0xa705992ceecf9c43},
443 {0xbd8430bd08277231, 0x50c6ff782a838354},
444 {0xece53cec4a314ebd, 0xa4f8bf5635246429},
445 {0x940f4613ae5ed136, 0x871b7795e136be9a},
446 {0xb913179899f68584, 0x28e2557b59846e40},
447 {0xe757dd7ec07426e5, 0x331aeada2fe589d0},
448 {0x9096ea6f3848984f, 0x3ff0d2c85def7622},
449 {0xb4bca50b065abe63, 0x0fed077a756b53aa},
450 {0xe1ebce4dc7f16dfb, 0xd3e8495912c62895},
451 {0x8d3360f09cf6e4bd, 0x64712dd7abbbd95d},
452 {0xb080392cc4349dec, 0xbd8d794d96aacfb4},
453 {0xdca04777f541c567, 0xecf0d7a0fc5583a1},
454 {0x89e42caaf9491b60, 0xf41686c49db57245},
455 {0xac5d37d5b79b6239, 0x311c2875c522ced6},
456 {0xd77485cb25823ac7, 0x7d633293366b828c},
457 {0x86a8d39ef77164bc, 0xae5dff9c02033198},
458 {0xa8530886b54dbdeb, 0xd9f57f830283fdfd},
459 {0xd267caa862a12d66, 0xd072df63c324fd7c},
460 {0x8380dea93da4bc60, 0x4247cb9e59f71e6e},
461 {0xa46116538d0deb78, 0x52d9be85f074e609},
462 {0xcd795be870516656, 0x67902e276c921f8c},
463 {0x806bd9714632dff6, 0x00ba1cd8a3db53b7},
464 {0xa086cfcd97bf97f3, 0x80e8a40eccd228a5},
465 {0xc8a883c0fdaf7df0, 0x6122cd128006b2ce},
466 {0xfad2a4b13d1b5d6c, 0x796b805720085f82},
467 {0x9cc3a6eec6311a63, 0xcbe3303674053bb1},
468 {0xc3f490aa77bd60fc, 0xbedbfc4411068a9d},
469 {0xf4f1b4d515acb93b, 0xee92fb5515482d45},
470 {0x991711052d8bf3c5, 0x751bdd152d4d1c4b},
471 {0xbf5cd54678eef0b6, 0xd262d45a78a0635e},
472 {0xef340a98172aace4, 0x86fb897116c87c35},
473 {0x9580869f0e7aac0e, 0xd45d35e6ae3d4da1},
474 {0xbae0a846d2195712, 0x8974836059cca10a},
475 {0xe998d258869facd7, 0x2bd1a438703fc94c},
476 {0x91ff83775423cc06, 0x7b6306a34627ddd0},
477 {0xb67f6455292cbf08, 0x1a3bc84c17b1d543},
478 {0xe41f3d6a7377eeca, 0x20caba5f1d9e4a94},
479 {0x8e938662882af53e, 0x547eb47b7282ee9d},
480 {0xb23867fb2a35b28d, 0xe99e619a4f23aa44},
481 {0xdec681f9f4c31f31, 0x6405fa00e2ec94d5},
482 {0x8b3c113c38f9f37e, 0xde83bc408dd3dd05},
483 {0xae0b158b4738705e, 0x9624ab50b148d446},
484 {0xd98ddaee19068c76, 0x3badd624dd9b0958},
485 {0x87f8a8d4cfa417c9, 0xe54ca5d70a80e5d7},
486 {0xa9f6d30a038d1dbc, 0x5e9fcf4ccd211f4d},
487 {0xd47487cc8470652b, 0x7647c32000696720},
488 {0x84c8d4dfd2c63f3b, 0x29ecd9f40041e074},
489 {0xa5fb0a17c777cf09, 0xf468107100525891},
490 {0xcf79cc9db955c2cc, 0x7182148d4066eeb5},
491 {0x81ac1fe293d599bf, 0xc6f14cd848405531},
492 {0xa21727db38cb002f, 0xb8ada00e5a506a7d},
493 {0xca9cf1d206fdc03b, 0xa6d90811f0e4851d},
494 {0xfd442e4688bd304a, 0x908f4a166d1da664},
495 {0x9e4a9cec15763e2e, 0x9a598e4e043287ff},
496 {0xc5dd44271ad3cdba, 0x40eff1e1853f29fe},
497 {0xf7549530e188c128, 0xd12bee59e68ef47d},
498 {0x9a94dd3e8cf578b9, 0x82bb74f8301958cf},
499 {0xc13a148e3032d6e7, 0xe36a52363c1faf02},
500 {0xf18899b1bc3f8ca1, 0xdc44e6c3cb279ac2},
501 {0x96f5600f15a7b7e5, 0x29ab103a5ef8c0ba},
502 {0xbcb2b812db11a5de, 0x7415d448f6b6f0e8},
503 {0xebdf661791d60f56, 0x111b495b3464ad22},
504 {0x936b9fcebb25c995, 0xcab10dd900beec35},
505 {0xb84687c269ef3bfb, 0x3d5d514f40eea743},
506 {0xe65829b3046b0afa, 0x0cb4a5a3112a5113},
507 {0x8ff71a0fe2c2e6dc, 0x47f0e785eaba72ac},
508 {0xb3f4e093db73a093, 0x59ed216765690f57},
509 {0xe0f218b8d25088b8, 0x306869c13ec3532d},
510 {0x8c974f7383725573, 0x1e414218c73a13fc},
511 {0xafbd2350644eeacf, 0xe5d1929ef90898fb},
512 {0xdbac6c247d62a583, 0xdf45f746b74abf3a},
513 {0x894bc396ce5da772, 0x6b8bba8c328eb784},
514 {0xab9eb47c81f5114f, 0x066ea92f3f326565},
515 {0xd686619ba27255a2, 0xc80a537b0efefebe},
516 {0x8613fd0145877585, 0xbd06742ce95f5f37},
517 {0xa798fc4196e952e7, 0x2c48113823b73705},
518 {0xd17f3b51fca3a7a0, 0xf75a15862ca504c6},
519 {0x82ef85133de648c4, 0x9a984d73dbe722fc},
520 {0xa3ab66580d5fdaf5, 0xc13e60d0d2e0ebbb},
521 {0xcc963fee10b7d1b3, 0x318df905079926a9},
522 {0xffbbcfe994e5c61f, 0xfdf17746497f7053},
523 {0x9fd561f1fd0f9bd3, 0xfeb6ea8bedefa634},
524 {0xc7caba6e7c5382c8, 0xfe64a52ee96b8fc1},
525 {0xf9bd690a1b68637b, 0x3dfdce7aa3c673b1},
526 {0x9c1661a651213e2d, 0x06bea10ca65c084f},
527 {0xc31bfa0fe5698db8, 0x486e494fcff30a63},
528 {0xf3e2f893dec3f126, 0x5a89dba3c3efccfb},
529 {0x986ddb5c6b3a76b7, 0xf89629465a75e01d},
530 {0xbe89523386091465, 0xf6bbb397f1135824},
531 {0xee2ba6c0678b597f, 0x746aa07ded582e2d},
532 {0x94db483840b717ef, 0xa8c2a44eb4571cdd},
533 {0xba121a4650e4ddeb, 0x92f34d62616ce414},
534 {0xe896a0d7e51e1566, 0x77b020baf9c81d18},
535 {0x915e2486ef32cd60, 0x0ace1474dc1d122f},
536 {0xb5b5ada8aaff80b8, 0x0d819992132456bb},
537 {0xe3231912d5bf60e6, 0x10e1fff697ed6c6a},
538 {0x8df5efabc5979c8f, 0xca8d3ffa1ef463c2},
539 {0xb1736b96b6fd83b3, 0xbd308ff8a6b17cb3},
540 {0xddd0467c64bce4a0, 0xac7cb3f6d05ddbdf},
541 {0x8aa22c0dbef60ee4, 0x6bcdf07a423aa96c},
542 {0xad4ab7112eb3929d, 0x86c16c98d2c953c7},
543 {0xd89d64d57a607744, 0xe871c7bf077ba8b8},
544 {0x87625f056c7c4a8b, 0x11471cd764ad4973},
545 {0xa93af6c6c79b5d2d, 0xd598e40d3dd89bd0},
546 {0xd389b47879823479, 0x4aff1d108d4ec2c4},
547 {0x843610cb4bf160cb, 0xcedf722a585139bb},
548 {0xa54394fe1eedb8fe, 0xc2974eb4ee658829},
549 {0xce947a3da6a9273e, 0x733d226229feea33},
550 {0x811ccc668829b887, 0x0806357d5a3f5260},
551 {0xa163ff802a3426a8, 0xca07c2dcb0cf26f8},
552 {0xc9bcff6034c13052, 0xfc89b393dd02f0b6},
553 {0xfc2c3f3841f17c67, 0xbbac2078d443ace3},
554 {0x9d9ba7832936edc0, 0xd54b944b84aa4c0e},
555 {0xc5029163f384a931, 0x0a9e795e65d4df12},
556 {0xf64335bcf065d37d, 0x4d4617b5ff4a16d6},
557 {0x99ea0196163fa42e, 0x504bced1bf8e4e46},
558 {0xc06481fb9bcf8d39, 0xe45ec2862f71e1d7},
559 {0xf07da27a82c37088, 0x5d767327bb4e5a4d},
560 {0x964e858c91ba2655, 0x3a6a07f8d510f870},
561 {0xbbe226efb628afea, 0x890489f70a55368c},
562 {0xeadab0aba3b2dbe5, 0x2b45ac74ccea842f},
563 {0x92c8ae6b464fc96f, 0x3b0b8bc90012929e},
564 {0xb77ada0617e3bbcb, 0x09ce6ebb40173745},
565 {0xe55990879ddcaabd, 0xcc420a6a101d0516},
566 {0x8f57fa54c2a9eab6, 0x9fa946824a12232e},
567 {0xb32df8e9f3546564, 0x47939822dc96abfa},
568 {0xdff9772470297ebd, 0x59787e2b93bc56f8},
569 {0x8bfbea76c619ef36, 0x57eb4edb3c55b65b},
570 {0xaefae51477a06b03, 0xede622920b6b23f2},
571 {0xdab99e59958885c4, 0xe95fab368e45ecee},
572 {0x88b402f7fd75539b, 0x11dbcb0218ebb415},
573 {0xaae103b5fcd2a881, 0xd652bdc29f26a11a},
574 {0xd59944a37c0752a2, 0x4be76d3346f04960},
575 {0x857fcae62d8493a5, 0x6f70a4400c562ddc},
576 {0xa6dfbd9fb8e5b88e, 0xcb4ccd500f6bb953},
577 {0xd097ad07a71f26b2, 0x7e2000a41346a7a8},
578 {0x825ecc24c873782f, 0x8ed400668c0c28c9},
579 {0xa2f67f2dfa90563b, 0x728900802f0f32fb},
580 {0xcbb41ef979346bca, 0x4f2b40a03ad2ffba},
581 {0xfea126b7d78186bc, 0xe2f610c84987bfa9},
582 {0x9f24b832e6b0f436, 0x0dd9ca7d2df4d7ca},
583 {0xc6ede63fa05d3143, 0x91503d1c79720dbc},
584 {0xf8a95fcf88747d94, 0x75a44c6397ce912b},
585 {0x9b69dbe1b548ce7c, 0xc986afbe3ee11abb},
586 {0xc24452da229b021b, 0xfbe85badce996169},
587 {0xf2d56790ab41c2a2, 0xfae27299423fb9c4},
588 {0x97c560ba6b0919a5, 0xdccd879fc967d41b},
589 {0xbdb6b8e905cb600f, 0x5400e987bbc1c921},
590 {0xed246723473e3813, 0x290123e9aab23b69},
591 {0x9436c0760c86e30b, 0xf9a0b6720aaf6522},
592 {0xb94470938fa89bce, 0xf808e40e8d5b3e6a},
593 {0xe7958cb87392c2c2, 0xb60b1d1230b20e05},
594 {0x90bd77f3483bb9b9, 0xb1c6f22b5e6f48c3},
595 {0xb4ecd5f01a4aa828, 0x1e38aeb6360b1af4},
596 {0xe2280b6c20dd5232, 0x25c6da63c38de1b1},
597 {0x8d590723948a535f, 0x579c487e5a38ad0f},
598 {0xb0af48ec79ace837, 0x2d835a9df0c6d852},
599 {0xdcdb1b2798182244, 0xf8e431456cf88e66},
600 {0x8a08f0f8bf0f156b, 0x1b8e9ecb641b5900},
601 {0xac8b2d36eed2dac5, 0xe272467e3d222f40},
602 {0xd7adf884aa879177, 0x5b0ed81dcc6abb10},
603 {0x86ccbb52ea94baea, 0x98e947129fc2b4ea},
604 {0xa87fea27a539e9a5, 0x3f2398d747b36225},
605 {0xd29fe4b18e88640e, 0x8eec7f0d19a03aae},
606 {0x83a3eeeef9153e89, 0x1953cf68300424ad},
607 {0xa48ceaaab75a8e2b, 0x5fa8c3423c052dd8},
608 {0xcdb02555653131b6, 0x3792f412cb06794e},
609 {0x808e17555f3ebf11, 0xe2bbd88bbee40bd1},
610 {0xa0b19d2ab70e6ed6, 0x5b6aceaeae9d0ec5},
611 {0xc8de047564d20a8b, 0xf245825a5a445276},
612 {0xfb158592be068d2e, 0xeed6e2f0f0d56713},
613 {0x9ced737bb6c4183d, 0x55464dd69685606c},
614 {0xc428d05aa4751e4c, 0xaa97e14c3c26b887},
615 {0xf53304714d9265df, 0xd53dd99f4b3066a9},
616 {0x993fe2c6d07b7fab, 0xe546a8038efe402a},
617 {0xbf8fdb78849a5f96, 0xde98520472bdd034},
618 {0xef73d256a5c0f77c, 0x963e66858f6d4441},
619 {0x95a8637627989aad, 0xdde7001379a44aa9},
620 {0xbb127c53b17ec159, 0x5560c018580d5d53},
621 {0xe9d71b689dde71af, 0xaab8f01e6e10b4a7},
622 {0x9226712162ab070d, 0xcab3961304ca70e9},
623 {0xb6b00d69bb55c8d1, 0x3d607b97c5fd0d23},
624 {0xe45c10c42a2b3b05, 0x8cb89a7db77c506b},
625 {0x8eb98a7a9a5b04e3, 0x77f3608e92adb243},
626 {0xb267ed1940f1c61c, 0x55f038b237591ed4},
627 {0xdf01e85f912e37a3, 0x6b6c46dec52f6689},
628 {0x8b61313bbabce2c6, 0x2323ac4b3b3da016},
629 {0xae397d8aa96c1b77, 0xabec975e0a0d081b},
630 {0xd9c7dced53c72255, 0x96e7bd358c904a22},
631 {0x881cea14545c7575, 0x7e50d64177da2e55},
632 {0xaa242499697392d2, 0xdde50bd1d5d0b9ea},
633 {0xd4ad2dbfc3d07787, 0x955e4ec64b44e865},
634 {0x84ec3c97da624ab4, 0xbd5af13bef0b113f},
635 {0xa6274bbdd0fadd61, 0xecb1ad8aeacdd58f},
636 {0xcfb11ead453994ba, 0x67de18eda5814af3},
637 {0x81ceb32c4b43fcf4, 0x80eacf948770ced8},
638 {0xa2425ff75e14fc31, 0xa1258379a94d028e},
639 {0xcad2f7f5359a3b3e, 0x096ee45813a04331},
640 {0xfd87b5f28300ca0d, 0x8bca9d6e188853fd},
641 {0x9e74d1b791e07e48, 0x775ea264cf55347e},
642 {0xc612062576589dda, 0x95364afe032a819e},
643 {0xf79687aed3eec551, 0x3a83ddbd83f52205},
644 {0x9abe14cd44753b52, 0xc4926a9672793543},
645 {0xc16d9a0095928a27, 0x75b7053c0f178294},
646 {0xf1c90080baf72cb1, 0x5324c68b12dd6339},
647 {0x971da05074da7bee, 0xd3f6fc16ebca5e04},
648 {0xbce5086492111aea, 0x88f4bb1ca6bcf585},
649 {0xec1e4a7db69561a5, 0x2b31e9e3d06c32e6},
650 {0x9392ee8e921d5d07, 0x3aff322e62439fd0},
651 {0xb877aa3236a4b449, 0x09befeb9fad487c3},
652 {0xe69594bec44de15b, 0x4c2ebe687989a9b4},
653 {0x901d7cf73ab0acd9, 0x0f9d37014bf60a11},
654 {0xb424dc35095cd80f, 0x538484c19ef38c95},
655 {0xe12e13424bb40e13, 0x2865a5f206b06fba},
656 {0x8cbccc096f5088cb, 0xf93f87b7442e45d4},
657 {0xafebff0bcb24aafe, 0xf78f69a51539d749},
658 {0xdbe6fecebdedd5be, 0xb573440e5a884d1c},
659 {0x89705f4136b4a597, 0x31680a88f8953031},
660 {0xabcc77118461cefc, 0xfdc20d2b36ba7c3e},
661 {0xd6bf94d5e57a42bc, 0x3d32907604691b4d},
662 {0x8637bd05af6c69b5, 0xa63f9a49c2c1b110},
663 {0xa7c5ac471b478423, 0x0fcf80dc33721d54},
664 {0xd1b71758e219652b, 0xd3c36113404ea4a9},
665 {0x83126e978d4fdf3b, 0x645a1cac083126ea},
666 {0xa3d70a3d70a3d70a, 0x3d70a3d70a3d70a4},
667 {0xcccccccccccccccc, 0xcccccccccccccccd},
668 {0x8000000000000000, 0x0000000000000000},
669 {0xa000000000000000, 0x0000000000000000},
670 {0xc800000000000000, 0x0000000000000000},
671 {0xfa00000000000000, 0x0000000000000000},
672 {0x9c40000000000000, 0x0000000000000000},
673 {0xc350000000000000, 0x0000000000000000},
674 {0xf424000000000000, 0x0000000000000000},
675 {0x9896800000000000, 0x0000000000000000},
676 {0xbebc200000000000, 0x0000000000000000},
677 {0xee6b280000000000, 0x0000000000000000},
678 {0x9502f90000000000, 0x0000000000000000},
679 {0xba43b74000000000, 0x0000000000000000},
680 {0xe8d4a51000000000, 0x0000000000000000},
681 {0x9184e72a00000000, 0x0000000000000000},
682 {0xb5e620f480000000, 0x0000000000000000},
683 {0xe35fa931a0000000, 0x0000000000000000},
684 {0x8e1bc9bf04000000, 0x0000000000000000},
685 {0xb1a2bc2ec5000000, 0x0000000000000000},
686 {0xde0b6b3a76400000, 0x0000000000000000},
687 {0x8ac7230489e80000, 0x0000000000000000},
688 {0xad78ebc5ac620000, 0x0000000000000000},
689 {0xd8d726b7177a8000, 0x0000000000000000},
690 {0x878678326eac9000, 0x0000000000000000},
691 {0xa968163f0a57b400, 0x0000000000000000},
692 {0xd3c21bcecceda100, 0x0000000000000000},
693 {0x84595161401484a0, 0x0000000000000000},
694 {0xa56fa5b99019a5c8, 0x0000000000000000},
695 {0xcecb8f27f4200f3a, 0x0000000000000000},
696 {0x813f3978f8940984, 0x4000000000000000},
697 {0xa18f07d736b90be5, 0x5000000000000000},
698 {0xc9f2c9cd04674ede, 0xa400000000000000},
699 {0xfc6f7c4045812296, 0x4d00000000000000},
700 {0x9dc5ada82b70b59d, 0xf020000000000000},
701 {0xc5371912364ce305, 0x6c28000000000000},
702 {0xf684df56c3e01bc6, 0xc732000000000000},
703 {0x9a130b963a6c115c, 0x3c7f400000000000},
704 {0xc097ce7bc90715b3, 0x4b9f100000000000},
705 {0xf0bdc21abb48db20, 0x1e86d40000000000},
706 {0x96769950b50d88f4, 0x1314448000000000},
707 {0xbc143fa4e250eb31, 0x17d955a000000000},
708 {0xeb194f8e1ae525fd, 0x5dcfab0800000000},
709 {0x92efd1b8d0cf37be, 0x5aa1cae500000000},
710 {0xb7abc627050305ad, 0xf14a3d9e40000000},
711 {0xe596b7b0c643c719, 0x6d9ccd05d0000000},
712 {0x8f7e32ce7bea5c6f, 0xe4820023a2000000},
713 {0xb35dbf821ae4f38b, 0xdda2802c8a800000},
714 {0xe0352f62a19e306e, 0xd50b2037ad200000},
715 {0x8c213d9da502de45, 0x4526f422cc340000},
716 {0xaf298d050e4395d6, 0x9670b12b7f410000},
717 {0xdaf3f04651d47b4c, 0x3c0cdd765f114000},
718 {0x88d8762bf324cd0f, 0xa5880a69fb6ac800},
719 {0xab0e93b6efee0053, 0x8eea0d047a457a00},
720 {0xd5d238a4abe98068, 0x72a4904598d6d880},
721 {0x85a36366eb71f041, 0x47a6da2b7f864750},
722 {0xa70c3c40a64e6c51, 0x999090b65f67d924},
723 {0xd0cf4b50cfe20765, 0xfff4b4e3f741cf6d},
724 {0x82818f1281ed449f, 0xbff8f10e7a8921a5},
725 {0xa321f2d7226895c7, 0xaff72d52192b6a0e},
726 {0xcbea6f8ceb02bb39, 0x9bf4f8a69f764491},
727 {0xfee50b7025c36a08, 0x02f236d04753d5b5},
728 {0x9f4f2726179a2245, 0x01d762422c946591},
729 {0xc722f0ef9d80aad6, 0x424d3ad2b7b97ef6},
730 {0xf8ebad2b84e0d58b, 0xd2e0898765a7deb3},
731 {0x9b934c3b330c8577, 0x63cc55f49f88eb30},
732 {0xc2781f49ffcfa6d5, 0x3cbf6b71c76b25fc},
733 {0xf316271c7fc3908a, 0x8bef464e3945ef7b},
734 {0x97edd871cfda3a56, 0x97758bf0e3cbb5ad},
735 {0xbde94e8e43d0c8ec, 0x3d52eeed1cbea318},
736 {0xed63a231d4c4fb27, 0x4ca7aaa863ee4bde},
737 {0x945e455f24fb1cf8, 0x8fe8caa93e74ef6b},
738 {0xb975d6b6ee39e436, 0xb3e2fd538e122b45},
739 {0xe7d34c64a9c85d44, 0x60dbbca87196b617},
740 {0x90e40fbeea1d3a4a, 0xbc8955e946fe31ce},
741 {0xb51d13aea4a488dd, 0x6babab6398bdbe42},
742 {0xe264589a4dcdab14, 0xc696963c7eed2dd2},
743 {0x8d7eb76070a08aec, 0xfc1e1de5cf543ca3},
744 {0xb0de65388cc8ada8, 0x3b25a55f43294bcc},
745 {0xdd15fe86affad912, 0x49ef0eb713f39ebf},
746 {0x8a2dbf142dfcc7ab, 0x6e3569326c784338},
747 {0xacb92ed9397bf996, 0x49c2c37f07965405},
748 {0xd7e77a8f87daf7fb, 0xdc33745ec97be907},
749 {0x86f0ac99b4e8dafd, 0x69a028bb3ded71a4},
750 {0xa8acd7c0222311bc, 0xc40832ea0d68ce0d},
751 {0xd2d80db02aabd62b, 0xf50a3fa490c30191},
752 {0x83c7088e1aab65db, 0x792667c6da79e0fb},
753 {0xa4b8cab1a1563f52, 0x577001b891185939},
754 {0xcde6fd5e09abcf26, 0xed4c0226b55e6f87},
755 {0x80b05e5ac60b6178, 0x544f8158315b05b5},
756 {0xa0dc75f1778e39d6, 0x696361ae3db1c722},
757 {0xc913936dd571c84c, 0x03bc3a19cd1e38ea},
758 {0xfb5878494ace3a5f, 0x04ab48a04065c724},
759 {0x9d174b2dcec0e47b, 0x62eb0d64283f9c77},
760 {0xc45d1df942711d9a, 0x3ba5d0bd324f8395},
761 {0xf5746577930d6500, 0xca8f44ec7ee3647a},
762 {0x9968bf6abbe85f20, 0x7e998b13cf4e1ecc},
763 {0xbfc2ef456ae276e8, 0x9e3fedd8c321a67f},
764 {0xefb3ab16c59b14a2, 0xc5cfe94ef3ea101f},
765 {0x95d04aee3b80ece5, 0xbba1f1d158724a13},
766 {0xbb445da9ca61281f, 0x2a8a6e45ae8edc98},
767 {0xea1575143cf97226, 0xf52d09d71a3293be},
768 {0x924d692ca61be758, 0x593c2626705f9c57},
769 {0xb6e0c377cfa2e12e, 0x6f8b2fb00c77836d},
770 {0xe498f455c38b997a, 0x0b6dfb9c0f956448},
771 {0x8edf98b59a373fec, 0x4724bd4189bd5ead},
772 {0xb2977ee300c50fe7, 0x58edec91ec2cb658},
773 {0xdf3d5e9bc0f653e1, 0x2f2967b66737e3ee},
774 {0x8b865b215899f46c, 0xbd79e0d20082ee75},
775 {0xae67f1e9aec07187, 0xecd8590680a3aa12},
776 {0xda01ee641a708de9, 0xe80e6f4820cc9496},
777 {0x884134fe908658b2, 0x3109058d147fdcde},
778 {0xaa51823e34a7eede, 0xbd4b46f0599fd416},
779 {0xd4e5e2cdc1d1ea96, 0x6c9e18ac7007c91b},
780 {0x850fadc09923329e, 0x03e2cf6bc604ddb1},
781 {0xa6539930bf6bff45, 0x84db8346b786151d},
782 {0xcfe87f7cef46ff16, 0xe612641865679a64},
783 {0x81f14fae158c5f6e, 0x4fcb7e8f3f60c07f},
784 {0xa26da3999aef7749, 0xe3be5e330f38f09e},
785 {0xcb090c8001ab551c, 0x5cadf5bfd3072cc6},
786 {0xfdcb4fa002162a63, 0x73d9732fc7c8f7f7},
787 {0x9e9f11c4014dda7e, 0x2867e7fddcdd9afb},
788 {0xc646d63501a1511d, 0xb281e1fd541501b9},
789 {0xf7d88bc24209a565, 0x1f225a7ca91a4227},
790 {0x9ae757596946075f, 0x3375788de9b06959},
791 {0xc1a12d2fc3978937, 0x0052d6b1641c83af},
792 {0xf209787bb47d6b84, 0xc0678c5dbd23a49b},
793 {0x9745eb4d50ce6332, 0xf840b7ba963646e1},
794 {0xbd176620a501fbff, 0xb650e5a93bc3d899},
795 {0xec5d3fa8ce427aff, 0xa3e51f138ab4cebf},
796 {0x93ba47c980e98cdf, 0xc66f336c36b10138},
797 {0xb8a8d9bbe123f017, 0xb80b0047445d4185},
798 {0xe6d3102ad96cec1d, 0xa60dc059157491e6},
799 {0x9043ea1ac7e41392, 0x87c89837ad68db30},
800 {0xb454e4a179dd1877, 0x29babe4598c311fc},
801 {0xe16a1dc9d8545e94, 0xf4296dd6fef3d67b},
802 {0x8ce2529e2734bb1d, 0x1899e4a65f58660d},
803 {0xb01ae745b101e9e4, 0x5ec05dcff72e7f90},
804 {0xdc21a1171d42645d, 0x76707543f4fa1f74},
805 {0x899504ae72497eba, 0x6a06494a791c53a9},
806 {0xabfa45da0edbde69, 0x0487db9d17636893},
807 {0xd6f8d7509292d603, 0x45a9d2845d3c42b7},
808 {0x865b86925b9bc5c2, 0x0b8a2392ba45a9b3},
809 {0xa7f26836f282b732, 0x8e6cac7768d7141f},
810 {0xd1ef0244af2364ff, 0x3207d795430cd927},
811 {0x8335616aed761f1f, 0x7f44e6bd49e807b9},
812 {0xa402b9c5a8d3a6e7, 0x5f16206c9c6209a7},
813 {0xcd036837130890a1, 0x36dba887c37a8c10},
814 {0x802221226be55a64, 0xc2494954da2c978a},
815 {0xa02aa96b06deb0fd, 0xf2db9baa10b7bd6d},
816 {0xc83553c5c8965d3d, 0x6f92829494e5acc8},
817 {0xfa42a8b73abbf48c, 0xcb772339ba1f17fa},
818 {0x9c69a97284b578d7, 0xff2a760414536efc},
819 {0xc38413cf25e2d70d, 0xfef5138519684abb},
820 {0xf46518c2ef5b8cd1, 0x7eb258665fc25d6a},
821 {0x98bf2f79d5993802, 0xef2f773ffbd97a62},
822 {0xbeeefb584aff8603, 0xaafb550ffacfd8fb},
823 {0xeeaaba2e5dbf6784, 0x95ba2a53f983cf39},
824 {0x952ab45cfa97a0b2, 0xdd945a747bf26184},
825 {0xba756174393d88df, 0x94f971119aeef9e5},
826 {0xe912b9d1478ceb17, 0x7a37cd5601aab85e},
827 {0x91abb422ccb812ee, 0xac62e055c10ab33b},
828 {0xb616a12b7fe617aa, 0x577b986b314d600a},
829 {0xe39c49765fdf9d94, 0xed5a7e85fda0b80c},
830 {0x8e41ade9fbebc27d, 0x14588f13be847308},
831 {0xb1d219647ae6b31c, 0x596eb2d8ae258fc9},
832 {0xde469fbd99a05fe3, 0x6fca5f8ed9aef3bc},
833 {0x8aec23d680043bee, 0x25de7bb9480d5855},
834 {0xada72ccc20054ae9, 0xaf561aa79a10ae6b},
835 {0xd910f7ff28069da4, 0x1b2ba1518094da05},
836 {0x87aa9aff79042286, 0x90fb44d2f05d0843},
837 {0xa99541bf57452b28, 0x353a1607ac744a54},
838 {0xd3fa922f2d1675f2, 0x42889b8997915ce9},
839 {0x847c9b5d7c2e09b7, 0x69956135febada12},
840 {0xa59bc234db398c25, 0x43fab9837e699096},
841 {0xcf02b2c21207ef2e, 0x94f967e45e03f4bc},
842 {0x8161afb94b44f57d, 0x1d1be0eebac278f6},
843 {0xa1ba1ba79e1632dc, 0x6462d92a69731733},
844 {0xca28a291859bbf93, 0x7d7b8f7503cfdcff},
845 {0xfcb2cb35e702af78, 0x5cda735244c3d43f},
846 {0x9defbf01b061adab, 0x3a0888136afa64a8},
847 {0xc56baec21c7a1916, 0x088aaa1845b8fdd1},
848 {0xf6c69a72a3989f5b, 0x8aad549e57273d46},
849 {0x9a3c2087a63f6399, 0x36ac54e2f678864c},
850 {0xc0cb28a98fcf3c7f, 0x84576a1bb416a7de},
851 {0xf0fdf2d3f3c30b9f, 0x656d44a2a11c51d6},
852 {0x969eb7c47859e743, 0x9f644ae5a4b1b326},
853 {0xbc4665b596706114, 0x873d5d9f0dde1fef},
854 {0xeb57ff22fc0c7959, 0xa90cb506d155a7eb},
855 {0x9316ff75dd87cbd8, 0x09a7f12442d588f3},
856 {0xb7dcbf5354e9bece, 0x0c11ed6d538aeb30},
857 {0xe5d3ef282a242e81, 0x8f1668c8a86da5fb},
858 {0x8fa475791a569d10, 0xf96e017d694487bd},
859 {0xb38d92d760ec4455, 0x37c981dcc395a9ad},
860 {0xe070f78d3927556a, 0x85bbe253f47b1418},
861 {0x8c469ab843b89562, 0x93956d7478ccec8f},
862 {0xaf58416654a6babb, 0x387ac8d1970027b3},
863 {0xdb2e51bfe9d0696a, 0x06997b05fcc0319f},
864 {0x88fcf317f22241e2, 0x441fece3bdf81f04},
865 {0xab3c2fddeeaad25a, 0xd527e81cad7626c4},
866 {0xd60b3bd56a5586f1, 0x8a71e223d8d3b075},
867 {0x85c7056562757456, 0xf6872d5667844e4a},
868 {0xa738c6bebb12d16c, 0xb428f8ac016561dc},
869 {0xd106f86e69d785c7, 0xe13336d701beba53},
870 {0x82a45b450226b39c, 0xecc0024661173474},
871 {0xa34d721642b06084, 0x27f002d7f95d0191},
872 {0xcc20ce9bd35c78a5, 0x31ec038df7b441f5},
873 {0xff290242c83396ce, 0x7e67047175a15272},
874 {0x9f79a169bd203e41, 0x0f0062c6e984d387},
875 {0xc75809c42c684dd1, 0x52c07b78a3e60869},
876 {0xf92e0c3537826145, 0xa7709a56ccdf8a83},
877 {0x9bbcc7a142b17ccb, 0x88a66076400bb692},
878 {0xc2abf989935ddbfe, 0x6acff893d00ea436},
879 {0xf356f7ebf83552fe, 0x0583f6b8c4124d44},
880 {0x98165af37b2153de, 0xc3727a337a8b704b},
881 {0xbe1bf1b059e9a8d6, 0x744f18c0592e4c5d},
882 {0xeda2ee1c7064130c, 0x1162def06f79df74},
883 {0x9485d4d1c63e8be7, 0x8addcb5645ac2ba9},
884 {0xb9a74a0637ce2ee1, 0x6d953e2bd7173693},
885 {0xe8111c87c5c1ba99, 0xc8fa8db6ccdd0438},
886 {0x910ab1d4db9914a0, 0x1d9c9892400a22a3},
887 {0xb54d5e4a127f59c8, 0x2503beb6d00cab4c},
888 {0xe2a0b5dc971f303a, 0x2e44ae64840fd61e},
889 {0x8da471a9de737e24, 0x5ceaecfed289e5d3},
890 {0xb10d8e1456105dad, 0x7425a83e872c5f48},
891 {0xdd50f1996b947518, 0xd12f124e28f7771a},
892 {0x8a5296ffe33cc92f, 0x82bd6b70d99aaa70},
893 {0xace73cbfdc0bfb7b, 0x636cc64d1001550c},
894 {0xd8210befd30efa5a, 0x3c47f7e05401aa4f},
895 {0x8714a775e3e95c78, 0x65acfaec34810a72},
896 {0xa8d9d1535ce3b396, 0x7f1839a741a14d0e},
897 {0xd31045a8341ca07c, 0x1ede48111209a051},
898 {0x83ea2b892091e44d, 0x934aed0aab460433},
899 {0xa4e4b66b68b65d60, 0xf81da84d56178540},
900 {0xce1de40642e3f4b9, 0x36251260ab9d668f},
901 {0x80d2ae83e9ce78f3, 0xc1d72b7c6b42601a},
902 {0xa1075a24e4421730, 0xb24cf65b8612f820},
903 {0xc94930ae1d529cfc, 0xdee033f26797b628},
904 {0xfb9b7cd9a4a7443c, 0x169840ef017da3b2},
905 {0x9d412e0806e88aa5, 0x8e1f289560ee864f},
906 {0xc491798a08a2ad4e, 0xf1a6f2bab92a27e3},
907 {0xf5b5d7ec8acb58a2, 0xae10af696774b1dc},
908 {0x9991a6f3d6bf1765, 0xacca6da1e0a8ef2a},
909 {0xbff610b0cc6edd3f, 0x17fd090a58d32af4},
910 {0xeff394dcff8a948e, 0xddfc4b4cef07f5b1},
911 {0x95f83d0a1fb69cd9, 0x4abdaf101564f98f},
912 {0xbb764c4ca7a4440f, 0x9d6d1ad41abe37f2},
913 {0xea53df5fd18d5513, 0x84c86189216dc5ee},
914 {0x92746b9be2f8552c, 0x32fd3cf5b4e49bb5},
915 {0xb7118682dbb66a77, 0x3fbc8c33221dc2a2},
916 {0xe4d5e82392a40515, 0x0fabaf3feaa5334b},
917 {0x8f05b1163ba6832d, 0x29cb4d87f2a7400f},
918 {0xb2c71d5bca9023f8, 0x743e20e9ef511013},
919 {0xdf78e4b2bd342cf6, 0x914da9246b255417},
920 {0x8bab8eefb6409c1a, 0x1ad089b6c2f7548f},
921 {0xae9672aba3d0c320, 0xa184ac2473b529b2},
922 {0xda3c0f568cc4f3e8, 0xc9e5d72d90a2741f},
923 {0x8865899617fb1871, 0x7e2fa67c7a658893},
924 {0xaa7eebfb9df9de8d, 0xddbb901b98feeab8},
925 {0xd51ea6fa85785631, 0x552a74227f3ea566},
926 {0x8533285c936b35de, 0xd53a88958f872760},
927 {0xa67ff273b8460356, 0x8a892abaf368f138},
928 {0xd01fef10a657842c, 0x2d2b7569b0432d86},
929 {0x8213f56a67f6b29b, 0x9c3b29620e29fc74},
930 {0xa298f2c501f45f42, 0x8349f3ba91b47b90},
931 {0xcb3f2f7642717713, 0x241c70a936219a74},
932 {0xfe0efb53d30dd4d7, 0xed238cd383aa0111},
933 {0x9ec95d1463e8a506, 0xf4363804324a40ab},
934 {0xc67bb4597ce2ce48, 0xb143c6053edcd0d6},
935 {0xf81aa16fdc1b81da, 0xdd94b7868e94050b},
936 {0x9b10a4e5e9913128, 0xca7cf2b4191c8327},
937 {0xc1d4ce1f63f57d72, 0xfd1c2f611f63a3f1},
938 {0xf24a01a73cf2dccf, 0xbc633b39673c8ced},
939 {0x976e41088617ca01, 0xd5be0503e085d814},
940 {0xbd49d14aa79dbc82, 0x4b2d8644d8a74e19},
941 {0xec9c459d51852ba2, 0xddf8e7d60ed1219f},
942 {0x93e1ab8252f33b45, 0xcabb90e5c942b504},
943 {0xb8da1662e7b00a17, 0x3d6a751f3b936244},
944 {0xe7109bfba19c0c9d, 0x0cc512670a783ad5},
945 {0x906a617d450187e2, 0x27fb2b80668b24c6},
946 {0xb484f9dc9641e9da, 0xb1f9f660802dedf7},
947 {0xe1a63853bbd26451, 0x5e7873f8a0396974},
948 {0x8d07e33455637eb2, 0xdb0b487b6423e1e9},
949 {0xb049dc016abc5e5f, 0x91ce1a9a3d2cda63},
950 {0xdc5c5301c56b75f7, 0x7641a140cc7810fc},
951 {0x89b9b3e11b6329ba, 0xa9e904c87fcb0a9e},
952 {0xac2820d9623bf429, 0x546345fa9fbdcd45},
953 {0xd732290fbacaf133, 0xa97c177947ad4096},
954 {0x867f59a9d4bed6c0, 0x49ed8eabcccc485e},
955 {0xa81f301449ee8c70, 0x5c68f256bfff5a75},
956 {0xd226fc195c6a2f8c, 0x73832eec6fff3112},
957 {0x83585d8fd9c25db7, 0xc831fd53c5ff7eac},
958 {0xa42e74f3d032f525, 0xba3e7ca8b77f5e56},
959 {0xcd3a1230c43fb26f, 0x28ce1bd2e55f35ec},
960 {0x80444b5e7aa7cf85, 0x7980d163cf5b81b4},
961 {0xa0555e361951c366, 0xd7e105bcc3326220},
962 {0xc86ab5c39fa63440, 0x8dd9472bf3fefaa8},
963 {0xfa856334878fc150, 0xb14f98f6f0feb952},
964 {0x9c935e00d4b9d8d2, 0x6ed1bf9a569f33d4},
965 {0xc3b8358109e84f07, 0x0a862f80ec4700c9},
966 {0xf4a642e14c6262c8, 0xcd27bb612758c0fb},
967 {0x98e7e9cccfbd7dbd, 0x8038d51cb897789d},
968 {0xbf21e44003acdd2c, 0xe0470a63e6bd56c4},
969 {0xeeea5d5004981478, 0x1858ccfce06cac75},
970 {0x95527a5202df0ccb, 0x0f37801e0c43ebc9},
971 {0xbaa718e68396cffd, 0xd30560258f54e6bb},
972 {0xe950df20247c83fd, 0x47c6b82ef32a206a},
973 {0x91d28b7416cdd27e, 0x4cdc331d57fa5442},
974 {0xb6472e511c81471d, 0xe0133fe4adf8e953},
975 {0xe3d8f9e563a198e5, 0x58180fddd97723a7},
976 {0x8e679c2f5e44ff8f, 0x570f09eaa7ea7649},
977 {0xb201833b35d63f73, 0x2cd2cc6551e513db},
978 {0xde81e40a034bcf4f, 0xf8077f7ea65e58d2},
979 {0x8b112e86420f6191, 0xfb04afaf27faf783},
980 {0xadd57a27d29339f6, 0x79c5db9af1f9b564},
981 {0xd94ad8b1c7380874, 0x18375281ae7822bd},
982 {0x87cec76f1c830548, 0x8f2293910d0b15b6},
983 {0xa9c2794ae3a3c69a, 0xb2eb3875504ddb23},
984 {0xd433179d9c8cb841, 0x5fa60692a46151ec},
985 {0x849feec281d7f328, 0xdbc7c41ba6bcd334},
986 {0xa5c7ea73224deff3, 0x12b9b522906c0801},
987 {0xcf39e50feae16bef, 0xd768226b34870a01},
988 {0x81842f29f2cce375, 0xe6a1158300d46641},
989 {0xa1e53af46f801c53, 0x60495ae3c1097fd1},
990 {0xca5e89b18b602368, 0x385bb19cb14bdfc5},
991 {0xfcf62c1dee382c42, 0x46729e03dd9ed7b6},
992 {0x9e19db92b4e31ba9, 0x6c07a2c26a8346d2},
993 {0xc5a05277621be293, 0xc7098b7305241886},
994 {0xf70867153aa2db38, 0xb8cbee4fc66d1ea8},
995 {0x9a65406d44a5c903, 0x737f74f1dc043329},
996 {0xc0fe908895cf3b44, 0x505f522e53053ff3},
997 {0xf13e34aabb430a15, 0x647726b9e7c68ff0},
998 {0x96c6e0eab509e64d, 0x5eca783430dc19f6},
999 {0xbc789925624c5fe0, 0xb67d16413d132073},
1000 {0xeb96bf6ebadf77d8, 0xe41c5bd18c57e890},
1001 {0x933e37a534cbaae7, 0x8e91b962f7b6f15a},
1002 {0xb80dc58e81fe95a1, 0x723627bbb5a4adb1},
1003 {0xe61136f2227e3b09, 0xcec3b1aaa30dd91d},
1004 {0x8fcac257558ee4e6, 0x213a4f0aa5e8a7b2},
1005 {0xb3bd72ed2af29e1f, 0xa988e2cd4f62d19e},
1006 {0xe0accfa875af45a7, 0x93eb1b80a33b8606},
1007 {0x8c6c01c9498d8b88, 0xbc72f130660533c4},
1008 {0xaf87023b9bf0ee6a, 0xeb8fad7c7f8680b5},
1009 {0xdb68c2ca82ed2a05, 0xa67398db9f6820e2}
1011 {0xff77b1fcbebcdc4f, 0x25e8e89c13bb0f7b},
1012 {0xce5d73ff402d98e3, 0xfb0a3d212dc81290},
1013 {0xa6b34ad8c9dfc06f, 0xf42faa48c0ea481f},
1014 {0x86a8d39ef77164bc, 0xae5dff9c02033198},
1015 {0xd98ddaee19068c76, 0x3badd624dd9b0958},
1016 {0xafbd2350644eeacf, 0xe5d1929ef90898fb},
1017 {0x8df5efabc5979c8f, 0xca8d3ffa1ef463c2},
1018 {0xe55990879ddcaabd, 0xcc420a6a101d0516},
1019 {0xb94470938fa89bce, 0xf808e40e8d5b3e6a},
1020 {0x95a8637627989aad, 0xdde7001379a44aa9},
1021 {0xf1c90080baf72cb1, 0x5324c68b12dd6339},
1022 {0xc350000000000000, 0x0000000000000000},
1023 {0x9dc5ada82b70b59d, 0xf020000000000000},
1024 {0xfee50b7025c36a08, 0x02f236d04753d5b5},
1025 {0xcde6fd5e09abcf26, 0xed4c0226b55e6f87},
1026 {0xa6539930bf6bff45, 0x84db8346b786151d},
1027 {0x865b86925b9bc5c2, 0x0b8a2392ba45a9b3},
1028 {0xd910f7ff28069da4, 0x1b2ba1518094da05},
1029 {0xaf58416654a6babb, 0x387ac8d1970027b3},
1030 {0x8da471a9de737e24, 0x5ceaecfed289e5d3},
1031 {0xe4d5e82392a40515, 0x0fabaf3feaa5334b},
1032 {0xb8da1662e7b00a17, 0x3d6a751f3b936244},
1033 {0x95527a5202df0ccb, 0x0f37801e0c43ebc9},
1034 {0xf13e34aabb430a15, 0x647726b9e7c68ff0}
1038 #if FMT_USE_FULL_CACHE_DRAGONBOX
1039 return pow10_significands[k - float_info<double>::min_k];
1041 static constexpr
const uint64_t powers_of_5_64[] = {
1042 0x0000000000000001, 0x0000000000000005, 0x0000000000000019,
1043 0x000000000000007d, 0x0000000000000271, 0x0000000000000c35,
1044 0x0000000000003d09, 0x000000000001312d, 0x000000000005f5e1,
1045 0x00000000001dcd65, 0x00000000009502f9, 0x0000000002e90edd,
1046 0x000000000e8d4a51, 0x0000000048c27395, 0x000000016bcc41e9,
1047 0x000000071afd498d, 0x0000002386f26fc1, 0x000000b1a2bc2ec5,
1048 0x000003782dace9d9, 0x00001158e460913d, 0x000056bc75e2d631,
1049 0x0001b1ae4d6e2ef5, 0x000878678326eac9, 0x002a5a058fc295ed,
1050 0x00d3c21bcecceda1, 0x0422ca8b0a00a425, 0x14adf4b7320334b9};
1052 static const int compression_ratio = 27;
1055 int cache_index = (k - float_info<double>::min_k) / compression_ratio;
1056 int kb = cache_index * compression_ratio + float_info<double>::min_k;
1057 int offset = k - kb;
1060 uint128_fallback base_cache = pow10_significands[cache_index];
1065 int alpha = floor_log2_pow10(kb + offset) - floor_log2_pow10(kb) - offset;
1066 FMT_ASSERT(alpha > 0 && alpha < 64,
"shifting error detected");
1069 uint64_t pow5 = powers_of_5_64[offset];
1070 uint128_fallback recovered_cache = umul128(base_cache.high(), pow5);
1071 uint128_fallback middle_low = umul128(base_cache.low(), pow5);
1073 recovered_cache += middle_low.high();
1075 uint64_t high_to_middle = recovered_cache.high() << (64 - alpha);
1076 uint64_t middle_to_low = recovered_cache.low() << (64 - alpha);
1079 uint128_fallback{(recovered_cache.low() >> alpha) | high_to_middle,
1080 ((middle_low.low() >> alpha) | middle_to_low)};
1081 FMT_ASSERT(recovered_cache.low() + 1 != 0,
"");
1082 return {recovered_cache.high(), recovered_cache.low() + 1};
1086 struct compute_mul_result {
1087 carrier_uint result;
1090 struct compute_mul_parity_result {
1095 static compute_mul_result
1096 compute_mul(carrier_uint u,
const cache_entry_type &cache) noexcept {
1097 auto r = umul192_upper128(u, cache);
1098 return {r.high(), r.low() == 0};
1101 static uint32_t compute_delta(cache_entry_type
const &cache,
1102 int beta) noexcept {
1103 return static_cast<uint32_t
>(cache.high() >> (64 - 1 - beta));
1106 static compute_mul_parity_result
1107 compute_mul_parity(carrier_uint two_f,
const cache_entry_type &cache,
1108 int beta) noexcept {
1109 FMT_ASSERT(beta >= 1,
"");
1110 FMT_ASSERT(beta < 64,
"");
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};
1118 compute_left_endpoint_for_shorter_interval_case(
const cache_entry_type &cache,
1119 int beta) noexcept {
1120 return (cache.high() -
1121 (cache.high() >> (num_significand_bits<double>() + 2))) >>
1122 (64 - num_significand_bits<double>() - 1 - beta);
1125 static carrier_uint compute_right_endpoint_for_shorter_interval_case(
1126 const cache_entry_type &cache,
int beta) noexcept {
1127 return (cache.high() +
1128 (cache.high() >> (num_significand_bits<double>() + 1))) >>
1129 (64 - num_significand_bits<double>() - 1 - beta);
1133 compute_round_up_for_shorter_interval_case(
const cache_entry_type &cache,
1134 int beta) noexcept {
1135 return ((cache.high() >> (64 - num_significand_bits<double>() - 2 - beta)) +
1141 FMT_FUNC uint128_fallback get_cached_power(
int k) noexcept {
1142 return cache_accessor<double>::get_cached_power(k);
1147 bool is_left_endpoint_integer_shorter_interval(
int exponent) noexcept {
1148 const int case_shorter_interval_left_endpoint_lower_threshold = 2;
1149 const int case_shorter_interval_left_endpoint_upper_threshold = 3;
1150 return exponent >= case_shorter_interval_left_endpoint_lower_threshold &&
1151 exponent <= case_shorter_interval_left_endpoint_upper_threshold;
1155 FMT_INLINE
int remove_trailing_zeros(uint32_t &n) noexcept {
1156 FMT_ASSERT(n != 0,
"");
1159 const uint32_t mod_inv_5 = 0xcccccccd;
1161 const uint32_t mod_inv_25 =
1162 static_cast<uint32_t
>(uint64_t(mod_inv_5) * mod_inv_5);
1166 auto q = rotr(n * mod_inv_25, 2);
1167 if (q > max_value<uint32_t>() / 100)
1172 auto q = rotr(n * mod_inv_5, 1);
1173 if (q <= max_value<uint32_t>() / 10) {
1181 FMT_INLINE
int remove_trailing_zeros(uint64_t &n) noexcept {
1182 FMT_ASSERT(n != 0,
"");
1185 constexpr uint64_t magic_number = 12379400392853802749ull;
1186 auto nm = umul128(n, magic_number);
1189 if ((nm.high() & ((1ull << (90 - 64)) - 1)) == 0 && nm.low() < magic_number) {
1191 auto n32 =
static_cast<uint32_t
>(nm.high() >> (90 - 64));
1193 const uint32_t mod_inv_5 = 0xcccccccd;
1194 const uint32_t mod_inv_25 = mod_inv_5 * mod_inv_5;
1198 auto q = rotr(n32 * mod_inv_25, 2);
1199 if (q > max_value<uint32_t>() / 100)
1204 auto q = rotr(n32 * mod_inv_5, 1);
1205 if (q <= max_value<uint32_t>() / 10) {
1215 const uint64_t mod_inv_5 = 0xcccccccccccccccd;
1216 const uint64_t mod_inv_25 = mod_inv_5 * mod_inv_5;
1220 auto q = rotr(n * mod_inv_25, 2);
1221 if (q > max_value<uint64_t>() / 100)
1226 auto q = rotr(n * mod_inv_5, 1);
1227 if (q <= max_value<uint64_t>() / 10) {
1237 FMT_INLINE decimal_fp<T> shorter_interval_case(
int exponent) noexcept {
1238 decimal_fp<T> ret_value;
1240 const int minus_k = floor_log10_pow2_minus_log10_4_over_3(exponent);
1241 const int beta = exponent + floor_log2_pow10(-minus_k);
1244 using cache_entry_type =
typename cache_accessor<T>::cache_entry_type;
1245 const cache_entry_type cache = cache_accessor<T>::get_cached_power(-minus_k);
1247 auto xi = cache_accessor<T>::compute_left_endpoint_for_shorter_interval_case(
1249 auto zi = cache_accessor<T>::compute_right_endpoint_for_shorter_interval_case(
1253 if (!is_left_endpoint_integer_shorter_interval<T>(exponent))
1257 ret_value.significand = zi / 10;
1260 if (ret_value.significand * 10 >= xi) {
1261 ret_value.exponent = minus_k + 1;
1262 ret_value.exponent += remove_trailing_zeros(ret_value.significand);
1267 ret_value.significand =
1268 cache_accessor<T>::compute_round_up_for_shorter_interval_case(cache,
1270 ret_value.exponent = minus_k;
1273 if (exponent >= float_info<T>::shorter_interval_tie_lower_threshold &&
1274 exponent <= float_info<T>::shorter_interval_tie_upper_threshold) {
1275 ret_value.significand = ret_value.significand % 2 == 0 ?
1276 ret_value.significand :
1277 ret_value.significand - 1;
1278 }
else if (ret_value.significand < xi) {
1279 ++ret_value.significand;
1284 template <
typename T> decimal_fp<T> to_decimal(T x) noexcept {
1287 using carrier_uint =
typename float_info<T>::carrier_uint;
1288 using cache_entry_type =
typename cache_accessor<T>::cache_entry_type;
1289 auto br = bit_cast<carrier_uint>(x);
1292 const carrier_uint significand_mask =
1293 (
static_cast<carrier_uint
>(1) << num_significand_bits<T>()) - 1;
1294 carrier_uint significand = (br & significand_mask);
1296 static_cast<int>((br & exponent_mask<T>()) >> num_significand_bits<T>());
1298 if (exponent != 0) {
1299 exponent -= exponent_bias<T>() + num_significand_bits<T>();
1304 if (significand == 0)
1305 return shorter_interval_case<T>(exponent);
1307 significand |= (
static_cast<carrier_uint
>(1) << num_significand_bits<T>());
1310 if (significand == 0)
1313 std::numeric_limits<T>::min_exponent - num_significand_bits<T>() - 1;
1316 const bool include_left_endpoint = (significand % 2 == 0);
1317 const bool include_right_endpoint = include_left_endpoint;
1320 const int minus_k = floor_log10_pow2(exponent) - float_info<T>::kappa;
1321 const cache_entry_type cache = cache_accessor<T>::get_cached_power(-minus_k);
1322 const int beta = exponent + floor_log2_pow10(-minus_k);
1326 const uint32_t deltai = cache_accessor<T>::compute_delta(cache, beta);
1327 const carrier_uint two_fc = significand << 1;
1339 const typename cache_accessor<T>::compute_mul_result z_mul =
1340 cache_accessor<T>::compute_mul((two_fc | 1) << beta, cache);
1346 decimal_fp<T> ret_value;
1347 ret_value.significand = divide_by_10_to_kappa_plus_1(z_mul.result);
1348 uint32_t r =
static_cast<uint32_t
>(z_mul.result - float_info<T>::big_divisor *
1349 ret_value.significand);
1353 if (r == 0 && (z_mul.is_integer & !include_right_endpoint)) {
1354 --ret_value.significand;
1355 r = float_info<T>::big_divisor;
1356 goto small_divisor_case_label;
1358 }
else if (r > deltai) {
1359 goto small_divisor_case_label;
1362 const typename cache_accessor<T>::compute_mul_parity_result x_mul =
1363 cache_accessor<T>::compute_mul_parity(two_fc - 1, cache, beta);
1365 if (!(x_mul.parity | (x_mul.is_integer & include_left_endpoint)))
1366 goto small_divisor_case_label;
1368 ret_value.exponent = minus_k + float_info<T>::kappa + 1;
1371 ret_value.exponent += remove_trailing_zeros(ret_value.significand);
1376 small_divisor_case_label:
1377 ret_value.significand *= 10;
1378 ret_value.exponent = minus_k + float_info<T>::kappa;
1380 uint32_t dist = r - (deltai / 2) + (float_info<T>::small_divisor / 2);
1381 const bool approx_y_parity =
1382 ((dist ^ (float_info<T>::small_divisor / 2)) & 1) != 0;
1385 const bool divisible_by_small_divisor =
1386 check_divisibility_and_divide_by_pow10<float_info<T>::kappa>(dist);
1389 ret_value.significand += dist;
1391 if (!divisible_by_small_divisor)
1400 const auto y_mul = cache_accessor<T>::compute_mul_parity(two_fc, cache, beta);
1404 if (y_mul.parity != approx_y_parity)
1405 --ret_value.significand;
1406 else if (y_mul.is_integer & (ret_value.significand % 2 != 0))
1407 --ret_value.significand;
1413 template <>
struct formatter<detail::bigint> {
1415 -> format_parse_context::iterator {
1419 auto format(
const detail::bigint &n, format_context &ctx)
const
1420 -> format_context::iterator {
1421 auto out = ctx.out();
1423 for (
auto i = n.bigits_.size(); i > 0; --i) {
1424 auto value = n.bigits_[i - 1u];
1426 out = format_to(out, FMT_STRING(
"{:x}"), value);
1430 out = format_to(out, FMT_STRING(
"{:08x}"), value);
1433 out = format_to(out, FMT_STRING(
"p{}"),
1434 n.exp_ * detail::bigint::bigit_bits);
1439 FMT_FUNC detail::utf8_to_utf16::utf8_to_utf16(
string_view s) {
1440 for_each_codepoint(s, [
this](uint32_t cp,
string_view) {
1441 if (cp == invalid_code_point)
1442 FMT_THROW(std::runtime_error(
"invalid utf8"));
1444 buffer_.push_back(
static_cast<wchar_t>(cp));
1447 buffer_.push_back(
static_cast<wchar_t>(0xD800 + (cp >> 10)));
1448 buffer_.push_back(
static_cast<wchar_t>(0xDC00 + (cp & 0x3FF)));
1452 buffer_.push_back(0);
1455 FMT_FUNC
void format_system_error(detail::buffer<char> &out,
int error_code,
1456 const char *message) noexcept {
1458 auto ec = std::error_code(error_code, std::generic_category());
1459 write(std::back_inserter(out), std::system_error(ec, message).what());
1463 format_error_code(out, error_code, message);
1466 FMT_FUNC
void report_system_error(
int error_code,
1467 const char *message) noexcept {
1468 report_error(format_system_error, error_code, message);
1475 detail::vformat_to(
buffer, fmt, args);
1476 return to_string(
buffer);
1481 using dword = conditional_t<
sizeof(long) == 4,
unsigned long,
unsigned>;
1482 extern "C" __declspec(dllimport)
int __stdcall WriteConsoleW(
1483 void *,
const void *, dword, dword *,
void *);
1485 FMT_FUNC
bool write_console(std::FILE *f,
string_view text) {
1486 auto fd = _fileno(f);
1489 auto written = detail::dword();
1490 if (detail::WriteConsoleW(
reinterpret_cast<void *
>(_get_osfhandle(fd)),
1491 u16.c_str(),
static_cast<uint32_t
>(u16.size()),
1492 &written,
nullptr)) {
1504 FMT_FUNC
void print(std::FILE *f,
string_view text) {
1506 if (write_console(f, text))
1509 detail::fwrite_fully(text.
data(), 1, text.
size(), f);
1515 detail::vformat_to(
buffer, format_str, args);
1521 FMT_FUNC
void detail::vprint_mojibake(std::FILE *f,
string_view format_str,
1524 detail::vformat_to(
buffer, format_str,
1531 vprint(stdout, format_str, args);
1537 unsigned char upper;
1538 unsigned char lower_count;
1541 inline auto is_printable(uint16_t x,
const singleton *singletons,
1542 size_t singletons_size,
1543 const unsigned char *singleton_lowers,
1544 const unsigned char *normal,
size_t normal_size)
1546 auto upper = x >> 8;
1547 auto lower_start = 0;
1548 for (
size_t i = 0; i < singletons_size; ++i) {
1549 auto s = singletons[i];
1550 auto lower_end = lower_start + s.lower_count;
1551 if (upper < s.upper)
1553 if (upper == s.upper) {
1554 for (
auto j = lower_start; j < lower_end; ++j) {
1555 if (singleton_lowers[j] == (x & 0xff))
1559 lower_start = lower_end;
1562 auto xsigned =
static_cast<int>(x);
1563 auto current =
true;
1564 for (
size_t i = 0; i < normal_size; ++i) {
1565 auto v =
static_cast<int>(normal[i]);
1566 auto len = (v & 0x80) != 0 ? (v & 0x7f) << 8 | normal[++i] : v;
1576 FMT_FUNC
auto is_printable(uint32_t cp) ->
bool {
1577 static constexpr singleton singletons0[] = {
1578 {0x00, 1}, {0x03, 5}, {0x05, 6}, {0x06, 3}, {0x07, 6}, {0x08, 8},
1579 {0x09, 17}, {0x0a, 28}, {0x0b, 25}, {0x0c, 20}, {0x0d, 16}, {0x0e, 13},
1580 {0x0f, 4}, {0x10, 3}, {0x12, 18}, {0x13, 9}, {0x16, 1}, {0x17, 5},
1581 {0x18, 2}, {0x19, 3}, {0x1a, 7}, {0x1c, 2}, {0x1d, 1}, {0x1f, 22},
1582 {0x20, 3}, {0x2b, 3}, {0x2c, 2}, {0x2d, 11}, {0x2e, 1}, {0x30, 3},
1583 {0x31, 2}, {0x32, 1}, {0xa7, 2}, {0xa9, 2}, {0xaa, 4}, {0xab, 8},
1584 {0xfa, 2}, {0xfb, 5}, {0xfd, 4}, {0xfe, 3}, {0xff, 9},
1586 static constexpr
unsigned char singletons0_lower[] = {
1587 0xad, 0x78, 0x79, 0x8b, 0x8d, 0xa2, 0x30, 0x57, 0x58, 0x8b, 0x8c, 0x90,
1588 0x1c, 0x1d, 0xdd, 0x0e, 0x0f, 0x4b, 0x4c, 0xfb, 0xfc, 0x2e, 0x2f, 0x3f,
1589 0x5c, 0x5d, 0x5f, 0xb5, 0xe2, 0x84, 0x8d, 0x8e, 0x91, 0x92, 0xa9, 0xb1,
1590 0xba, 0xbb, 0xc5, 0xc6, 0xc9, 0xca, 0xde, 0xe4, 0xe5, 0xff, 0x00, 0x04,
1591 0x11, 0x12, 0x29, 0x31, 0x34, 0x37, 0x3a, 0x3b, 0x3d, 0x49, 0x4a, 0x5d,
1592 0x84, 0x8e, 0x92, 0xa9, 0xb1, 0xb4, 0xba, 0xbb, 0xc6, 0xca, 0xce, 0xcf,
1593 0xe4, 0xe5, 0x00, 0x04, 0x0d, 0x0e, 0x11, 0x12, 0x29, 0x31, 0x34, 0x3a,
1594 0x3b, 0x45, 0x46, 0x49, 0x4a, 0x5e, 0x64, 0x65, 0x84, 0x91, 0x9b, 0x9d,
1595 0xc9, 0xce, 0xcf, 0x0d, 0x11, 0x29, 0x45, 0x49, 0x57, 0x64, 0x65, 0x8d,
1596 0x91, 0xa9, 0xb4, 0xba, 0xbb, 0xc5, 0xc9, 0xdf, 0xe4, 0xe5, 0xf0, 0x0d,
1597 0x11, 0x45, 0x49, 0x64, 0x65, 0x80, 0x84, 0xb2, 0xbc, 0xbe, 0xbf, 0xd5,
1598 0xd7, 0xf0, 0xf1, 0x83, 0x85, 0x8b, 0xa4, 0xa6, 0xbe, 0xbf, 0xc5, 0xc7,
1599 0xce, 0xcf, 0xda, 0xdb, 0x48, 0x98, 0xbd, 0xcd, 0xc6, 0xce, 0xcf, 0x49,
1600 0x4e, 0x4f, 0x57, 0x59, 0x5e, 0x5f, 0x89, 0x8e, 0x8f, 0xb1, 0xb6, 0xb7,
1601 0xbf, 0xc1, 0xc6, 0xc7, 0xd7, 0x11, 0x16, 0x17, 0x5b, 0x5c, 0xf6, 0xf7,
1602 0xfe, 0xff, 0x80, 0x0d, 0x6d, 0x71, 0xde, 0xdf, 0x0e, 0x0f, 0x1f, 0x6e,
1603 0x6f, 0x1c, 0x1d, 0x5f, 0x7d, 0x7e, 0xae, 0xaf, 0xbb, 0xbc, 0xfa, 0x16,
1604 0x17, 0x1e, 0x1f, 0x46, 0x47, 0x4e, 0x4f, 0x58, 0x5a, 0x5c, 0x5e, 0x7e,
1605 0x7f, 0xb5, 0xc5, 0xd4, 0xd5, 0xdc, 0xf0, 0xf1, 0xf5, 0x72, 0x73, 0x8f,
1606 0x74, 0x75, 0x96, 0x2f, 0x5f, 0x26, 0x2e, 0x2f, 0xa7, 0xaf, 0xb7, 0xbf,
1607 0xc7, 0xcf, 0xd7, 0xdf, 0x9a, 0x40, 0x97, 0x98, 0x30, 0x8f, 0x1f, 0xc0,
1608 0xc1, 0xce, 0xff, 0x4e, 0x4f, 0x5a, 0x5b, 0x07, 0x08, 0x0f, 0x10, 0x27,
1609 0x2f, 0xee, 0xef, 0x6e, 0x6f, 0x37, 0x3d, 0x3f, 0x42, 0x45, 0x90, 0x91,
1610 0xfe, 0xff, 0x53, 0x67, 0x75, 0xc8, 0xc9, 0xd0, 0xd1, 0xd8, 0xd9, 0xe7,
1613 static constexpr singleton singletons1[] = {
1614 {0x00, 6}, {0x01, 1}, {0x03, 1}, {0x04, 2}, {0x08, 8}, {0x09, 2},
1615 {0x0a, 5}, {0x0b, 2}, {0x0e, 4}, {0x10, 1}, {0x11, 2}, {0x12, 5},
1616 {0x13, 17}, {0x14, 1}, {0x15, 2}, {0x17, 2}, {0x19, 13}, {0x1c, 5},
1617 {0x1d, 8}, {0x24, 1}, {0x6a, 3}, {0x6b, 2}, {0xbc, 2}, {0xd1, 2},
1618 {0xd4, 12}, {0xd5, 9}, {0xd6, 2}, {0xd7, 2}, {0xda, 1}, {0xe0, 5},
1619 {0xe1, 2}, {0xe8, 2}, {0xee, 32}, {0xf0, 4}, {0xf8, 2}, {0xf9, 2},
1620 {0xfa, 2}, {0xfb, 1},
1622 static constexpr
unsigned char singletons1_lower[] = {
1623 0x0c, 0x27, 0x3b, 0x3e, 0x4e, 0x4f, 0x8f, 0x9e, 0x9e, 0x9f, 0x06, 0x07,
1624 0x09, 0x36, 0x3d, 0x3e, 0x56, 0xf3, 0xd0, 0xd1, 0x04, 0x14, 0x18, 0x36,
1625 0x37, 0x56, 0x57, 0x7f, 0xaa, 0xae, 0xaf, 0xbd, 0x35, 0xe0, 0x12, 0x87,
1626 0x89, 0x8e, 0x9e, 0x04, 0x0d, 0x0e, 0x11, 0x12, 0x29, 0x31, 0x34, 0x3a,
1627 0x45, 0x46, 0x49, 0x4a, 0x4e, 0x4f, 0x64, 0x65, 0x5c, 0xb6, 0xb7, 0x1b,
1628 0x1c, 0x07, 0x08, 0x0a, 0x0b, 0x14, 0x17, 0x36, 0x39, 0x3a, 0xa8, 0xa9,
1629 0xd8, 0xd9, 0x09, 0x37, 0x90, 0x91, 0xa8, 0x07, 0x0a, 0x3b, 0x3e, 0x66,
1630 0x69, 0x8f, 0x92, 0x6f, 0x5f, 0xee, 0xef, 0x5a, 0x62, 0x9a, 0x9b, 0x27,
1631 0x28, 0x55, 0x9d, 0xa0, 0xa1, 0xa3, 0xa4, 0xa7, 0xa8, 0xad, 0xba, 0xbc,
1632 0xc4, 0x06, 0x0b, 0x0c, 0x15, 0x1d, 0x3a, 0x3f, 0x45, 0x51, 0xa6, 0xa7,
1633 0xcc, 0xcd, 0xa0, 0x07, 0x19, 0x1a, 0x22, 0x25, 0x3e, 0x3f, 0xc5, 0xc6,
1634 0x04, 0x20, 0x23, 0x25, 0x26, 0x28, 0x33, 0x38, 0x3a, 0x48, 0x4a, 0x4c,
1635 0x50, 0x53, 0x55, 0x56, 0x58, 0x5a, 0x5c, 0x5e, 0x60, 0x63, 0x65, 0x66,
1636 0x6b, 0x73, 0x78, 0x7d, 0x7f, 0x8a, 0xa4, 0xaa, 0xaf, 0xb0, 0xc0, 0xd0,
1637 0xae, 0xaf, 0x79, 0xcc, 0x6e, 0x6f, 0x93,
1639 static constexpr
unsigned char normal0[] = {
1640 0x00, 0x20, 0x5f, 0x22, 0x82, 0xdf, 0x04, 0x82, 0x44, 0x08, 0x1b, 0x04,
1641 0x06, 0x11, 0x81, 0xac, 0x0e, 0x80, 0xab, 0x35, 0x28, 0x0b, 0x80, 0xe0,
1642 0x03, 0x19, 0x08, 0x01, 0x04, 0x2f, 0x04, 0x34, 0x04, 0x07, 0x03, 0x01,
1643 0x07, 0x06, 0x07, 0x11, 0x0a, 0x50, 0x0f, 0x12, 0x07, 0x55, 0x07, 0x03,
1644 0x04, 0x1c, 0x0a, 0x09, 0x03, 0x08, 0x03, 0x07, 0x03, 0x02, 0x03, 0x03,
1645 0x03, 0x0c, 0x04, 0x05, 0x03, 0x0b, 0x06, 0x01, 0x0e, 0x15, 0x05, 0x3a,
1646 0x03, 0x11, 0x07, 0x06, 0x05, 0x10, 0x07, 0x57, 0x07, 0x02, 0x07, 0x15,
1647 0x0d, 0x50, 0x04, 0x43, 0x03, 0x2d, 0x03, 0x01, 0x04, 0x11, 0x06, 0x0f,
1648 0x0c, 0x3a, 0x04, 0x1d, 0x25, 0x5f, 0x20, 0x6d, 0x04, 0x6a, 0x25, 0x80,
1649 0xc8, 0x05, 0x82, 0xb0, 0x03, 0x1a, 0x06, 0x82, 0xfd, 0x03, 0x59, 0x07,
1650 0x15, 0x0b, 0x17, 0x09, 0x14, 0x0c, 0x14, 0x0c, 0x6a, 0x06, 0x0a, 0x06,
1651 0x1a, 0x06, 0x59, 0x07, 0x2b, 0x05, 0x46, 0x0a, 0x2c, 0x04, 0x0c, 0x04,
1652 0x01, 0x03, 0x31, 0x0b, 0x2c, 0x04, 0x1a, 0x06, 0x0b, 0x03, 0x80, 0xac,
1653 0x06, 0x0a, 0x06, 0x21, 0x3f, 0x4c, 0x04, 0x2d, 0x03, 0x74, 0x08, 0x3c,
1654 0x03, 0x0f, 0x03, 0x3c, 0x07, 0x38, 0x08, 0x2b, 0x05, 0x82, 0xff, 0x11,
1655 0x18, 0x08, 0x2f, 0x11, 0x2d, 0x03, 0x20, 0x10, 0x21, 0x0f, 0x80, 0x8c,
1656 0x04, 0x82, 0x97, 0x19, 0x0b, 0x15, 0x88, 0x94, 0x05, 0x2f, 0x05, 0x3b,
1657 0x07, 0x02, 0x0e, 0x18, 0x09, 0x80, 0xb3, 0x2d, 0x74, 0x0c, 0x80, 0xd6,
1658 0x1a, 0x0c, 0x05, 0x80, 0xff, 0x05, 0x80, 0xdf, 0x0c, 0xee, 0x0d, 0x03,
1659 0x84, 0x8d, 0x03, 0x37, 0x09, 0x81, 0x5c, 0x14, 0x80, 0xb8, 0x08, 0x80,
1660 0xcb, 0x2a, 0x38, 0x03, 0x0a, 0x06, 0x38, 0x08, 0x46, 0x08, 0x0c, 0x06,
1661 0x74, 0x0b, 0x1e, 0x03, 0x5a, 0x04, 0x59, 0x09, 0x80, 0x83, 0x18, 0x1c,
1662 0x0a, 0x16, 0x09, 0x4c, 0x04, 0x80, 0x8a, 0x06, 0xab, 0xa4, 0x0c, 0x17,
1663 0x04, 0x31, 0xa1, 0x04, 0x81, 0xda, 0x26, 0x07, 0x0c, 0x05, 0x05, 0x80,
1664 0xa5, 0x11, 0x81, 0x6d, 0x10, 0x78, 0x28, 0x2a, 0x06, 0x4c, 0x04, 0x80,
1665 0x8d, 0x04, 0x80, 0xbe, 0x03, 0x1b, 0x03, 0x0f, 0x0d,
1667 static constexpr
unsigned char normal1[] = {
1668 0x5e, 0x22, 0x7b, 0x05, 0x03, 0x04, 0x2d, 0x03, 0x66, 0x03, 0x01, 0x2f,
1669 0x2e, 0x80, 0x82, 0x1d, 0x03, 0x31, 0x0f, 0x1c, 0x04, 0x24, 0x09, 0x1e,
1670 0x05, 0x2b, 0x05, 0x44, 0x04, 0x0e, 0x2a, 0x80, 0xaa, 0x06, 0x24, 0x04,
1671 0x24, 0x04, 0x28, 0x08, 0x34, 0x0b, 0x01, 0x80, 0x90, 0x81, 0x37, 0x09,
1672 0x16, 0x0a, 0x08, 0x80, 0x98, 0x39, 0x03, 0x63, 0x08, 0x09, 0x30, 0x16,
1673 0x05, 0x21, 0x03, 0x1b, 0x05, 0x01, 0x40, 0x38, 0x04, 0x4b, 0x05, 0x2f,
1674 0x04, 0x0a, 0x07, 0x09, 0x07, 0x40, 0x20, 0x27, 0x04, 0x0c, 0x09, 0x36,
1675 0x03, 0x3a, 0x05, 0x1a, 0x07, 0x04, 0x0c, 0x07, 0x50, 0x49, 0x37, 0x33,
1676 0x0d, 0x33, 0x07, 0x2e, 0x08, 0x0a, 0x81, 0x26, 0x52, 0x4e, 0x28, 0x08,
1677 0x2a, 0x56, 0x1c, 0x14, 0x17, 0x09, 0x4e, 0x04, 0x1e, 0x0f, 0x43, 0x0e,
1678 0x19, 0x07, 0x0a, 0x06, 0x48, 0x08, 0x27, 0x09, 0x75, 0x0b, 0x3f, 0x41,
1679 0x2a, 0x06, 0x3b, 0x05, 0x0a, 0x06, 0x51, 0x06, 0x01, 0x05, 0x10, 0x03,
1680 0x05, 0x80, 0x8b, 0x62, 0x1e, 0x48, 0x08, 0x0a, 0x80, 0xa6, 0x5e, 0x22,
1681 0x45, 0x0b, 0x0a, 0x06, 0x0d, 0x13, 0x39, 0x07, 0x0a, 0x36, 0x2c, 0x04,
1682 0x10, 0x80, 0xc0, 0x3c, 0x64, 0x53, 0x0c, 0x48, 0x09, 0x0a, 0x46, 0x45,
1683 0x1b, 0x48, 0x08, 0x53, 0x1d, 0x39, 0x81, 0x07, 0x46, 0x0a, 0x1d, 0x03,
1684 0x47, 0x49, 0x37, 0x03, 0x0e, 0x08, 0x0a, 0x06, 0x39, 0x07, 0x0a, 0x81,
1685 0x36, 0x19, 0x80, 0xb7, 0x01, 0x0f, 0x32, 0x0d, 0x83, 0x9b, 0x66, 0x75,
1686 0x0b, 0x80, 0xc4, 0x8a, 0xbc, 0x84, 0x2f, 0x8f, 0xd1, 0x82, 0x47, 0xa1,
1687 0xb9, 0x82, 0x39, 0x07, 0x2a, 0x04, 0x02, 0x60, 0x26, 0x0a, 0x46, 0x0a,
1688 0x28, 0x05, 0x13, 0x82, 0xb0, 0x5b, 0x65, 0x4b, 0x04, 0x39, 0x07, 0x11,
1689 0x40, 0x05, 0x0b, 0x02, 0x0e, 0x97, 0xf8, 0x08, 0x84, 0xd6, 0x2a, 0x09,
1690 0xa2, 0xf7, 0x81, 0x1f, 0x31, 0x03, 0x11, 0x04, 0x08, 0x81, 0x8c, 0x89,
1691 0x04, 0x6b, 0x05, 0x0d, 0x03, 0x09, 0x07, 0x10, 0x93, 0x60, 0x80, 0xf6,
1692 0x0a, 0x73, 0x08, 0x6e, 0x17, 0x46, 0x80, 0x9a, 0x14, 0x0c, 0x57, 0x09,
1693 0x19, 0x80, 0x87, 0x81, 0x47, 0x03, 0x85, 0x42, 0x0f, 0x15, 0x85, 0x50,
1694 0x2b, 0x80, 0xd5, 0x2d, 0x03, 0x1a, 0x04, 0x02, 0x81, 0x70, 0x3a, 0x05,
1695 0x01, 0x85, 0x00, 0x80, 0xd7, 0x29, 0x4c, 0x04, 0x0a, 0x04, 0x02, 0x83,
1696 0x11, 0x44, 0x4c, 0x3d, 0x80, 0xc2, 0x3c, 0x06, 0x01, 0x04, 0x55, 0x05,
1697 0x1b, 0x34, 0x02, 0x81, 0x0e, 0x2c, 0x04, 0x64, 0x0c, 0x56, 0x0a, 0x80,
1698 0xae, 0x38, 0x1d, 0x0d, 0x2c, 0x04, 0x09, 0x07, 0x02, 0x0e, 0x06, 0x80,
1699 0x9a, 0x83, 0xd8, 0x08, 0x0d, 0x03, 0x0d, 0x03, 0x74, 0x0c, 0x59, 0x07,
1700 0x0c, 0x14, 0x0c, 0x04, 0x38, 0x08, 0x0a, 0x06, 0x28, 0x08, 0x22, 0x4e,
1701 0x81, 0x54, 0x0c, 0x15, 0x03, 0x03, 0x05, 0x07, 0x09, 0x19, 0x07, 0x07,
1702 0x09, 0x03, 0x0d, 0x07, 0x29, 0x80, 0xcb, 0x25, 0x0a, 0x84, 0x06,
1704 auto lower =
static_cast<uint16_t
>(cp);
1706 return is_printable(lower, singletons0,
1707 sizeof(singletons0) /
sizeof(*singletons0),
1708 singletons0_lower, normal0,
sizeof(normal0));
1711 return is_printable(lower, singletons1,
1712 sizeof(singletons1) /
sizeof(*singletons1),
1713 singletons1_lower, normal1,
sizeof(normal1));
1715 if (0x2a6de <= cp && cp < 0x2a700)
1717 if (0x2b735 <= cp && cp < 0x2b740)
1719 if (0x2b81e <= cp && cp < 0x2b820)
1721 if (0x2cea2 <= cp && cp < 0x2ceb0)
1723 if (0x2ebe1 <= cp && cp < 0x2f800)
1725 if (0x2fa1e <= cp && cp < 0x30000)
1727 if (0x3134b <= cp && cp < 0xe0100)
1729 if (0xe01f0 <= cp && cp < 0x110000)
1731 return cp < 0x110000;
constexpr auto size() const noexcept -> size_t
Definition: core.h:480
constexpr auto data() const noexcept -> const Char *
Definition: core.h:477
FMT_CONSTEXPR auto data() noexcept -> T *
Definition: core.h:945
constexpr auto size() const noexcept -> size_t
Definition: core.h:939
constexpr int parity(int la, int lb, int k)
Parity rule. Returns 1 only if la+lb+k is even.
Definition: Wigner369j.hpp:125