8 #ifndef FMT_FORMAT_INL_H_ 9 #define FMT_FORMAT_INL_H_ 20 #ifndef FMT_STATIC_THOUSANDS_SEPARATOR 32 inline fmt::detail::null<>
strerror_r(
int,
char*, ...) {
return {}; }
33 inline fmt::detail::null<>
strerror_s(
char*,
size_t, ...) {
return {}; }
41 std::fprintf(stderr,
"%s:%d: assertion failed: %s", file, line, message);
48 # define FMT_SNPRINTF snprintf 50 inline int fmt_snprintf(
char*
buffer,
size_t size,
const char*
format, ...) {
52 va_start(args, format);
53 int result = vsnprintf_s(buffer, size, _TRUNCATE, format, args);
57 # define FMT_SNPRINTF fmt_snprintf 80 void operator=(
const dispatcher&) {}
85 return result == -1 ? errno : result;
90 int handle(
char* message) {
92 if (message == buffer_ && strlen(buffer_) == buffer_size_ - 1)
101 return fallback(
strerror_s(buffer_, buffer_size_, error_code_));
106 int fallback(
int result) {
108 return result == 0 && strlen(buffer_) == buffer_size_ - 1 ? ERANGE
116 buffer_ = strerror(error_code_);
122 dispatcher(
int err_code,
char*& buf,
size_t buf_size)
123 : error_code_(err_code), buffer_(buf), buffer_size_(buf_size) {}
125 int run() {
return handle(
strerror_r(error_code_, buffer_, buffer_size_)); }
136 static const char SEP[] =
": ";
137 static const char ERROR_STR[] =
"error ";
139 size_t error_code_size =
sizeof(SEP) +
sizeof(ERROR_STR) - 2;
142 abs_value = 0 - abs_value;
156 func(full_message, error_code, message);
158 (
void)std::fwrite(full_message.
data(), full_message.
size(), 1, stderr);
159 std::fputc(
'\n', stderr);
165 size_t written = std::fwrite(ptr, size, count, stream);
170 #if !defined(FMT_STATIC_THOUSANDS_SEPARATOR) 173 template <
typename Locale>
175 static_assert(std::is_same<Locale, std::locale>::value,
"");
179 static_assert(std::is_same<Locale, std::locale>::value,
"");
180 return locale_ ? *
static_cast<const std::locale*
>(
locale_) : std::locale();
184 return std::use_facet<std::numpunct<Char>>(loc.
get<std::locale>()).grouping();
187 return std::use_facet<std::numpunct<Char>>(loc.
get<std::locale>())
191 return std::use_facet<std::numpunct<Char>>(loc.
get<std::locale>())
196 template <
typename Char>
201 return FMT_STATIC_THOUSANDS_SEPARATOR;
213 error_code_ = err_code;
216 std::runtime_error&
base = *
this;
217 base = std::runtime_error(
to_string(buffer));
224 int i =
static_cast<int>(
sizeof(
void*)) - 1;
225 while (i > 0 && n.value[i] == 0) --i;
226 auto char_digits = std::numeric_limits<unsigned char>::digits / 4;
227 return i >= 0 ? i * char_digits + count_digits<4, unsigned>(n.value[i]) : 1;
230 template <
typename T>
232 {
'0',
'0'}, {
'0',
'1'}, {
'0',
'2'}, {
'0',
'3'}, {
'0',
'4'}, {
'0',
'5'},
233 {
'0',
'6'}, {
'0',
'7'}, {
'0',
'8'}, {
'0',
'9'}, {
'1',
'0'}, {
'1',
'1'},
234 {
'1',
'2'}, {
'1',
'3'}, {
'1',
'4'}, {
'1',
'5'}, {
'1',
'6'}, {
'1',
'7'},
235 {
'1',
'8'}, {
'1',
'9'}, {
'2',
'0'}, {
'2',
'1'}, {
'2',
'2'}, {
'2',
'3'},
236 {
'2',
'4'}, {
'2',
'5'}, {
'2',
'6'}, {
'2',
'7'}, {
'2',
'8'}, {
'2',
'9'},
237 {
'3',
'0'}, {
'3',
'1'}, {
'3',
'2'}, {
'3',
'3'}, {
'3',
'4'}, {
'3',
'5'},
238 {
'3',
'6'}, {
'3',
'7'}, {
'3',
'8'}, {
'3',
'9'}, {
'4',
'0'}, {
'4',
'1'},
239 {
'4',
'2'}, {
'4',
'3'}, {
'4',
'4'}, {
'4',
'5'}, {
'4',
'6'}, {
'4',
'7'},
240 {
'4',
'8'}, {
'4',
'9'}, {
'5',
'0'}, {
'5',
'1'}, {
'5',
'2'}, {
'5',
'3'},
241 {
'5',
'4'}, {
'5',
'5'}, {
'5',
'6'}, {
'5',
'7'}, {
'5',
'8'}, {
'5',
'9'},
242 {
'6',
'0'}, {
'6',
'1'}, {
'6',
'2'}, {
'6',
'3'}, {
'6',
'4'}, {
'6',
'5'},
243 {
'6',
'6'}, {
'6',
'7'}, {
'6',
'8'}, {
'6',
'9'}, {
'7',
'0'}, {
'7',
'1'},
244 {
'7',
'2'}, {
'7',
'3'}, {
'7',
'4'}, {
'7',
'5'}, {
'7',
'6'}, {
'7',
'7'},
245 {
'7',
'8'}, {
'7',
'9'}, {
'8',
'0'}, {
'8',
'1'}, {
'8',
'2'}, {
'8',
'3'},
246 {
'8',
'4'}, {
'8',
'5'}, {
'8',
'6'}, {
'8',
'7'}, {
'8',
'8'}, {
'8',
'9'},
247 {
'9',
'0'}, {
'9',
'1'}, {
'9',
'2'}, {
'9',
'3'}, {
'9',
'4'}, {
'9',
'5'},
248 {
'9',
'6'}, {
'9',
'7'}, {
'9',
'8'}, {
'9',
'9'}};
250 template <
typename T>
253 #define FMT_POWERS_OF_10(factor) \ 254 factor * 10, (factor)*100, (factor)*1000, (factor)*10000, (factor)*100000, \ 255 (factor)*1000000, (factor)*10000000, (factor)*100000000, \ 258 template <
typename T>
261 10000000000000000000ULL};
263 template <
typename T>
267 template <
typename T>
270 10000000000000000000ULL};
274 template <
typename T>
276 0xfa8fd5a0081c0288, 0xbaaee17fa23ebf76, 0x8b16fb203055ac76,
277 0xcf42894a5dce35ea, 0x9a6bb0aa55653b2d, 0xe61acf033d1a45df,
278 0xab70fe17c79ac6ca, 0xff77b1fcbebcdc4f, 0xbe5691ef416bd60c,
279 0x8dd01fad907ffc3c, 0xd3515c2831559a83, 0x9d71ac8fada6c9b5,
280 0xea9c227723ee8bcb, 0xaecc49914078536d, 0x823c12795db6ce57,
281 0xc21094364dfb5637, 0x9096ea6f3848984f, 0xd77485cb25823ac7,
282 0xa086cfcd97bf97f4, 0xef340a98172aace5, 0xb23867fb2a35b28e,
283 0x84c8d4dfd2c63f3b, 0xc5dd44271ad3cdba, 0x936b9fcebb25c996,
284 0xdbac6c247d62a584, 0xa3ab66580d5fdaf6, 0xf3e2f893dec3f126,
285 0xb5b5ada8aaff80b8, 0x87625f056c7c4a8b, 0xc9bcff6034c13053,
286 0x964e858c91ba2655, 0xdff9772470297ebd, 0xa6dfbd9fb8e5b88f,
287 0xf8a95fcf88747d94, 0xb94470938fa89bcf, 0x8a08f0f8bf0f156b,
288 0xcdb02555653131b6, 0x993fe2c6d07b7fac, 0xe45c10c42a2b3b06,
289 0xaa242499697392d3, 0xfd87b5f28300ca0e, 0xbce5086492111aeb,
290 0x8cbccc096f5088cc, 0xd1b71758e219652c, 0x9c40000000000000,
291 0xe8d4a51000000000, 0xad78ebc5ac620000, 0x813f3978f8940984,
292 0xc097ce7bc90715b3, 0x8f7e32ce7bea5c70, 0xd5d238a4abe98068,
293 0x9f4f2726179a2245, 0xed63a231d4c4fb27, 0xb0de65388cc8ada8,
294 0x83c7088e1aab65db, 0xc45d1df942711d9a, 0x924d692ca61be758,
295 0xda01ee641a708dea, 0xa26da3999aef774a, 0xf209787bb47d6b85,
296 0xb454e4a179dd1877, 0x865b86925b9bc5c2, 0xc83553c5c8965d3d,
297 0x952ab45cfa97a0b3, 0xde469fbd99a05fe3, 0xa59bc234db398c25,
298 0xf6c69a72a3989f5c, 0xb7dcbf5354e9bece, 0x88fcf317f22241e2,
299 0xcc20ce9bd35c78a5, 0x98165af37b2153df, 0xe2a0b5dc971f303a,
300 0xa8d9d1535ce3b396, 0xfb9b7cd9a4a7443c, 0xbb764c4ca7a44410,
301 0x8bab8eefb6409c1a, 0xd01fef10a657842c, 0x9b10a4e5e9913129,
302 0xe7109bfba19c0c9d, 0xac2820d9623bf429, 0x80444b5e7aa7cf85,
303 0xbf21e44003acdd2d, 0x8e679c2f5e44ff8f, 0xd433179d9c8cb841,
304 0x9e19db92b4e31ba9, 0xeb96bf6ebadf77d9, 0xaf87023b9bf0ee6b,
309 template <
typename T>
311 -1220, -1193, -1166, -1140, -1113, -1087, -1060, -1034, -1007, -980, -954,
312 -927, -901, -874, -847, -821, -794, -768, -741, -715, -688, -661,
313 -635, -608, -582, -555, -529, -502, -475, -449, -422, -396, -369,
314 -343, -316, -289, -263, -236, -210, -183, -157, -130, -103, -77,
315 -50, -24, 3, 30, 56, 83, 109, 136, 162, 189, 216,
316 242, 269, 295, 322, 348, 375, 402, 428, 455, 481, 508,
317 534, 561, 588, 614, 641, 667, 694, 720, 747, 774, 800,
318 827, 853, 880, 907, 933, 960, 986, 1013, 1039, 1066};
320 template <
typename T>
322 {{0x00000001, 0xffffffff}, {0xcccccccd, 0x33333333},
323 {0xc28f5c29, 0x0a3d70a3}, {0x26e978d5, 0x020c49ba},
324 {0x3afb7e91, 0x0068db8b}, {0x0bcbe61d, 0x0014f8b5},
325 {0x68c26139, 0x000431bd}, {0xae8d46a5, 0x0000d6bf},
326 {0x22e90e21, 0x00002af3}, {0x3a2e9c6d, 0x00000897},
327 {0x3ed61f49, 0x000001b7}};
329 template <
typename T>
331 {{0x0000000000000001, 0xffffffffffffffff},
332 {0xcccccccccccccccd, 0x3333333333333333},
333 {0x8f5c28f5c28f5c29, 0x0a3d70a3d70a3d70},
334 {0x1cac083126e978d5, 0x020c49ba5e353f7c},
335 {0xd288ce703afb7e91, 0x0068db8bac710cb2},
336 {0x5d4e8fb00bcbe61d, 0x0014f8b588e368f0},
337 {0x790fb65668c26139, 0x000431bde82d7b63},
338 {0xe5032477ae8d46a5, 0x0000d6bf94d5e57a},
339 {0xc767074b22e90e21, 0x00002af31dc46118},
340 {0x8e47ce423a2e9c6d, 0x0000089705f4136b},
341 {0x4fa7f60d3ed61f49, 0x000001b7cdfd9d7b},
342 {0x0fee64690c913975, 0x00000057f5ff85e5},
343 {0x3662e0e1cf503eb1, 0x000000119799812d},
344 {0xa47a2cf9f6433fbd, 0x0000000384b84d09},
345 {0x54186f653140a659, 0x00000000b424dc35},
346 {0x7738164770402145, 0x0000000024075f3d},
347 {0xe4a4d1417cd9a041, 0x000000000734aca5},
348 {0xc75429d9e5c5200d, 0x000000000170ef54},
349 {0xc1773b91fac10669, 0x000000000049c977},
350 {0x26b172506559ce15, 0x00000000000ec1e4},
351 {0xd489e3a9addec2d1, 0x000000000002f394},
352 {0x90e860bb892c8d5d, 0x000000000000971d},
353 {0x502e79bf1b6f4f79, 0x0000000000001e39},
354 {0xdcd618596be30fe5, 0x000000000000060b}};
356 template <
typename T>
358 0x81ceb32c4b43fcf5, 0xa2425ff75e14fc32, 0xcad2f7f5359a3b3f,
359 0xfd87b5f28300ca0e, 0x9e74d1b791e07e49, 0xc612062576589ddb,
360 0xf79687aed3eec552, 0x9abe14cd44753b53, 0xc16d9a0095928a28,
361 0xf1c90080baf72cb2, 0x971da05074da7bef, 0xbce5086492111aeb,
362 0xec1e4a7db69561a6, 0x9392ee8e921d5d08, 0xb877aa3236a4b44a,
363 0xe69594bec44de15c, 0x901d7cf73ab0acda, 0xb424dc35095cd810,
364 0xe12e13424bb40e14, 0x8cbccc096f5088cc, 0xafebff0bcb24aaff,
365 0xdbe6fecebdedd5bf, 0x89705f4136b4a598, 0xabcc77118461cefd,
366 0xd6bf94d5e57a42bd, 0x8637bd05af6c69b6, 0xa7c5ac471b478424,
367 0xd1b71758e219652c, 0x83126e978d4fdf3c, 0xa3d70a3d70a3d70b,
368 0xcccccccccccccccd, 0x8000000000000000, 0xa000000000000000,
369 0xc800000000000000, 0xfa00000000000000, 0x9c40000000000000,
370 0xc350000000000000, 0xf424000000000000, 0x9896800000000000,
371 0xbebc200000000000, 0xee6b280000000000, 0x9502f90000000000,
372 0xba43b74000000000, 0xe8d4a51000000000, 0x9184e72a00000000,
373 0xb5e620f480000000, 0xe35fa931a0000000, 0x8e1bc9bf04000000,
374 0xb1a2bc2ec5000000, 0xde0b6b3a76400000, 0x8ac7230489e80000,
375 0xad78ebc5ac620000, 0xd8d726b7177a8000, 0x878678326eac9000,
376 0xa968163f0a57b400, 0xd3c21bcecceda100, 0x84595161401484a0,
377 0xa56fa5b99019a5c8, 0xcecb8f27f4200f3a, 0x813f3978f8940984,
378 0xa18f07d736b90be5, 0xc9f2c9cd04674ede, 0xfc6f7c4045812296,
379 0x9dc5ada82b70b59d, 0xc5371912364ce305, 0xf684df56c3e01bc6,
380 0x9a130b963a6c115c, 0xc097ce7bc90715b3, 0xf0bdc21abb48db20,
381 0x96769950b50d88f4, 0xbc143fa4e250eb31, 0xeb194f8e1ae525fd,
382 0x92efd1b8d0cf37be, 0xb7abc627050305ad, 0xe596b7b0c643c719,
383 0x8f7e32ce7bea5c6f, 0xb35dbf821ae4f38b, 0xe0352f62a19e306e};
385 template <
typename T>
387 #if FMT_USE_FULL_CACHE_DRAGONBOX 388 {0xff77b1fcbebcdc4f, 0x25e8e89c13bb0f7b},
389 {0x9faacf3df73609b1, 0x77b191618c54e9ad},
390 {0xc795830d75038c1d, 0xd59df5b9ef6a2418},
391 {0xf97ae3d0d2446f25, 0x4b0573286b44ad1e},
392 {0x9becce62836ac577, 0x4ee367f9430aec33},
393 {0xc2e801fb244576d5, 0x229c41f793cda740},
394 {0xf3a20279ed56d48a, 0x6b43527578c11110},
395 {0x9845418c345644d6, 0x830a13896b78aaaa},
396 {0xbe5691ef416bd60c, 0x23cc986bc656d554},
397 {0xedec366b11c6cb8f, 0x2cbfbe86b7ec8aa9},
398 {0x94b3a202eb1c3f39, 0x7bf7d71432f3d6aa},
399 {0xb9e08a83a5e34f07, 0xdaf5ccd93fb0cc54},
400 {0xe858ad248f5c22c9, 0xd1b3400f8f9cff69},
401 {0x91376c36d99995be, 0x23100809b9c21fa2},
402 {0xb58547448ffffb2d, 0xabd40a0c2832a78b},
403 {0xe2e69915b3fff9f9, 0x16c90c8f323f516d},
404 {0x8dd01fad907ffc3b, 0xae3da7d97f6792e4},
405 {0xb1442798f49ffb4a, 0x99cd11cfdf41779d},
406 {0xdd95317f31c7fa1d, 0x40405643d711d584},
407 {0x8a7d3eef7f1cfc52, 0x482835ea666b2573},
408 {0xad1c8eab5ee43b66, 0xda3243650005eed0},
409 {0xd863b256369d4a40, 0x90bed43e40076a83},
410 {0x873e4f75e2224e68, 0x5a7744a6e804a292},
411 {0xa90de3535aaae202, 0x711515d0a205cb37},
412 {0xd3515c2831559a83, 0x0d5a5b44ca873e04},
413 {0x8412d9991ed58091, 0xe858790afe9486c3},
414 {0xa5178fff668ae0b6, 0x626e974dbe39a873},
415 {0xce5d73ff402d98e3, 0xfb0a3d212dc81290},
416 {0x80fa687f881c7f8e, 0x7ce66634bc9d0b9a},
417 {0xa139029f6a239f72, 0x1c1fffc1ebc44e81},
418 {0xc987434744ac874e, 0xa327ffb266b56221},
419 {0xfbe9141915d7a922, 0x4bf1ff9f0062baa9},
420 {0x9d71ac8fada6c9b5, 0x6f773fc3603db4aa},
421 {0xc4ce17b399107c22, 0xcb550fb4384d21d4},
422 {0xf6019da07f549b2b, 0x7e2a53a146606a49},
423 {0x99c102844f94e0fb, 0x2eda7444cbfc426e},
424 {0xc0314325637a1939, 0xfa911155fefb5309},
425 {0xf03d93eebc589f88, 0x793555ab7eba27cb},
426 {0x96267c7535b763b5, 0x4bc1558b2f3458df},
427 {0xbbb01b9283253ca2, 0x9eb1aaedfb016f17},
428 {0xea9c227723ee8bcb, 0x465e15a979c1cadd},
429 {0x92a1958a7675175f, 0x0bfacd89ec191eca},
430 {0xb749faed14125d36, 0xcef980ec671f667c},
431 {0xe51c79a85916f484, 0x82b7e12780e7401b},
432 {0x8f31cc0937ae58d2, 0xd1b2ecb8b0908811},
433 {0xb2fe3f0b8599ef07, 0x861fa7e6dcb4aa16},
434 {0xdfbdcece67006ac9, 0x67a791e093e1d49b},
435 {0x8bd6a141006042bd, 0xe0c8bb2c5c6d24e1},
436 {0xaecc49914078536d, 0x58fae9f773886e19},
437 {0xda7f5bf590966848, 0xaf39a475506a899f},
438 {0x888f99797a5e012d, 0x6d8406c952429604},
439 {0xaab37fd7d8f58178, 0xc8e5087ba6d33b84},
440 {0xd5605fcdcf32e1d6, 0xfb1e4a9a90880a65},
441 {0x855c3be0a17fcd26, 0x5cf2eea09a550680},
442 {0xa6b34ad8c9dfc06f, 0xf42faa48c0ea481f},
443 {0xd0601d8efc57b08b, 0xf13b94daf124da27},
444 {0x823c12795db6ce57, 0x76c53d08d6b70859},
445 {0xa2cb1717b52481ed, 0x54768c4b0c64ca6f},
446 {0xcb7ddcdda26da268, 0xa9942f5dcf7dfd0a},
447 {0xfe5d54150b090b02, 0xd3f93b35435d7c4d},
448 {0x9efa548d26e5a6e1, 0xc47bc5014a1a6db0},
449 {0xc6b8e9b0709f109a, 0x359ab6419ca1091c},
450 {0xf867241c8cc6d4c0, 0xc30163d203c94b63},
451 {0x9b407691d7fc44f8, 0x79e0de63425dcf1e},
452 {0xc21094364dfb5636, 0x985915fc12f542e5},
453 {0xf294b943e17a2bc4, 0x3e6f5b7b17b2939e},
454 {0x979cf3ca6cec5b5a, 0xa705992ceecf9c43},
455 {0xbd8430bd08277231, 0x50c6ff782a838354},
456 {0xece53cec4a314ebd, 0xa4f8bf5635246429},
457 {0x940f4613ae5ed136, 0x871b7795e136be9a},
458 {0xb913179899f68584, 0x28e2557b59846e40},
459 {0xe757dd7ec07426e5, 0x331aeada2fe589d0},
460 {0x9096ea6f3848984f, 0x3ff0d2c85def7622},
461 {0xb4bca50b065abe63, 0x0fed077a756b53aa},
462 {0xe1ebce4dc7f16dfb, 0xd3e8495912c62895},
463 {0x8d3360f09cf6e4bd, 0x64712dd7abbbd95d},
464 {0xb080392cc4349dec, 0xbd8d794d96aacfb4},
465 {0xdca04777f541c567, 0xecf0d7a0fc5583a1},
466 {0x89e42caaf9491b60, 0xf41686c49db57245},
467 {0xac5d37d5b79b6239, 0x311c2875c522ced6},
468 {0xd77485cb25823ac7, 0x7d633293366b828c},
469 {0x86a8d39ef77164bc, 0xae5dff9c02033198},
470 {0xa8530886b54dbdeb, 0xd9f57f830283fdfd},
471 {0xd267caa862a12d66, 0xd072df63c324fd7c},
472 {0x8380dea93da4bc60, 0x4247cb9e59f71e6e},
473 {0xa46116538d0deb78, 0x52d9be85f074e609},
474 {0xcd795be870516656, 0x67902e276c921f8c},
475 {0x806bd9714632dff6, 0x00ba1cd8a3db53b7},
476 {0xa086cfcd97bf97f3, 0x80e8a40eccd228a5},
477 {0xc8a883c0fdaf7df0, 0x6122cd128006b2ce},
478 {0xfad2a4b13d1b5d6c, 0x796b805720085f82},
479 {0x9cc3a6eec6311a63, 0xcbe3303674053bb1},
480 {0xc3f490aa77bd60fc, 0xbedbfc4411068a9d},
481 {0xf4f1b4d515acb93b, 0xee92fb5515482d45},
482 {0x991711052d8bf3c5, 0x751bdd152d4d1c4b},
483 {0xbf5cd54678eef0b6, 0xd262d45a78a0635e},
484 {0xef340a98172aace4, 0x86fb897116c87c35},
485 {0x9580869f0e7aac0e, 0xd45d35e6ae3d4da1},
486 {0xbae0a846d2195712, 0x8974836059cca10a},
487 {0xe998d258869facd7, 0x2bd1a438703fc94c},
488 {0x91ff83775423cc06, 0x7b6306a34627ddd0},
489 {0xb67f6455292cbf08, 0x1a3bc84c17b1d543},
490 {0xe41f3d6a7377eeca, 0x20caba5f1d9e4a94},
491 {0x8e938662882af53e, 0x547eb47b7282ee9d},
492 {0xb23867fb2a35b28d, 0xe99e619a4f23aa44},
493 {0xdec681f9f4c31f31, 0x6405fa00e2ec94d5},
494 {0x8b3c113c38f9f37e, 0xde83bc408dd3dd05},
495 {0xae0b158b4738705e, 0x9624ab50b148d446},
496 {0xd98ddaee19068c76, 0x3badd624dd9b0958},
497 {0x87f8a8d4cfa417c9, 0xe54ca5d70a80e5d7},
498 {0xa9f6d30a038d1dbc, 0x5e9fcf4ccd211f4d},
499 {0xd47487cc8470652b, 0x7647c32000696720},
500 {0x84c8d4dfd2c63f3b, 0x29ecd9f40041e074},
501 {0xa5fb0a17c777cf09, 0xf468107100525891},
502 {0xcf79cc9db955c2cc, 0x7182148d4066eeb5},
503 {0x81ac1fe293d599bf, 0xc6f14cd848405531},
504 {0xa21727db38cb002f, 0xb8ada00e5a506a7d},
505 {0xca9cf1d206fdc03b, 0xa6d90811f0e4851d},
506 {0xfd442e4688bd304a, 0x908f4a166d1da664},
507 {0x9e4a9cec15763e2e, 0x9a598e4e043287ff},
508 {0xc5dd44271ad3cdba, 0x40eff1e1853f29fe},
509 {0xf7549530e188c128, 0xd12bee59e68ef47d},
510 {0x9a94dd3e8cf578b9, 0x82bb74f8301958cf},
511 {0xc13a148e3032d6e7, 0xe36a52363c1faf02},
512 {0xf18899b1bc3f8ca1, 0xdc44e6c3cb279ac2},
513 {0x96f5600f15a7b7e5, 0x29ab103a5ef8c0ba},
514 {0xbcb2b812db11a5de, 0x7415d448f6b6f0e8},
515 {0xebdf661791d60f56, 0x111b495b3464ad22},
516 {0x936b9fcebb25c995, 0xcab10dd900beec35},
517 {0xb84687c269ef3bfb, 0x3d5d514f40eea743},
518 {0xe65829b3046b0afa, 0x0cb4a5a3112a5113},
519 {0x8ff71a0fe2c2e6dc, 0x47f0e785eaba72ac},
520 {0xb3f4e093db73a093, 0x59ed216765690f57},
521 {0xe0f218b8d25088b8, 0x306869c13ec3532d},
522 {0x8c974f7383725573, 0x1e414218c73a13fc},
523 {0xafbd2350644eeacf, 0xe5d1929ef90898fb},
524 {0xdbac6c247d62a583, 0xdf45f746b74abf3a},
525 {0x894bc396ce5da772, 0x6b8bba8c328eb784},
526 {0xab9eb47c81f5114f, 0x066ea92f3f326565},
527 {0xd686619ba27255a2, 0xc80a537b0efefebe},
528 {0x8613fd0145877585, 0xbd06742ce95f5f37},
529 {0xa798fc4196e952e7, 0x2c48113823b73705},
530 {0xd17f3b51fca3a7a0, 0xf75a15862ca504c6},
531 {0x82ef85133de648c4, 0x9a984d73dbe722fc},
532 {0xa3ab66580d5fdaf5, 0xc13e60d0d2e0ebbb},
533 {0xcc963fee10b7d1b3, 0x318df905079926a9},
534 {0xffbbcfe994e5c61f, 0xfdf17746497f7053},
535 {0x9fd561f1fd0f9bd3, 0xfeb6ea8bedefa634},
536 {0xc7caba6e7c5382c8, 0xfe64a52ee96b8fc1},
537 {0xf9bd690a1b68637b, 0x3dfdce7aa3c673b1},
538 {0x9c1661a651213e2d, 0x06bea10ca65c084f},
539 {0xc31bfa0fe5698db8, 0x486e494fcff30a63},
540 {0xf3e2f893dec3f126, 0x5a89dba3c3efccfb},
541 {0x986ddb5c6b3a76b7, 0xf89629465a75e01d},
542 {0xbe89523386091465, 0xf6bbb397f1135824},
543 {0xee2ba6c0678b597f, 0x746aa07ded582e2d},
544 {0x94db483840b717ef, 0xa8c2a44eb4571cdd},
545 {0xba121a4650e4ddeb, 0x92f34d62616ce414},
546 {0xe896a0d7e51e1566, 0x77b020baf9c81d18},
547 {0x915e2486ef32cd60, 0x0ace1474dc1d122f},
548 {0xb5b5ada8aaff80b8, 0x0d819992132456bb},
549 {0xe3231912d5bf60e6, 0x10e1fff697ed6c6a},
550 {0x8df5efabc5979c8f, 0xca8d3ffa1ef463c2},
551 {0xb1736b96b6fd83b3, 0xbd308ff8a6b17cb3},
552 {0xddd0467c64bce4a0, 0xac7cb3f6d05ddbdf},
553 {0x8aa22c0dbef60ee4, 0x6bcdf07a423aa96c},
554 {0xad4ab7112eb3929d, 0x86c16c98d2c953c7},
555 {0xd89d64d57a607744, 0xe871c7bf077ba8b8},
556 {0x87625f056c7c4a8b, 0x11471cd764ad4973},
557 {0xa93af6c6c79b5d2d, 0xd598e40d3dd89bd0},
558 {0xd389b47879823479, 0x4aff1d108d4ec2c4},
559 {0x843610cb4bf160cb, 0xcedf722a585139bb},
560 {0xa54394fe1eedb8fe, 0xc2974eb4ee658829},
561 {0xce947a3da6a9273e, 0x733d226229feea33},
562 {0x811ccc668829b887, 0x0806357d5a3f5260},
563 {0xa163ff802a3426a8, 0xca07c2dcb0cf26f8},
564 {0xc9bcff6034c13052, 0xfc89b393dd02f0b6},
565 {0xfc2c3f3841f17c67, 0xbbac2078d443ace3},
566 {0x9d9ba7832936edc0, 0xd54b944b84aa4c0e},
567 {0xc5029163f384a931, 0x0a9e795e65d4df12},
568 {0xf64335bcf065d37d, 0x4d4617b5ff4a16d6},
569 {0x99ea0196163fa42e, 0x504bced1bf8e4e46},
570 {0xc06481fb9bcf8d39, 0xe45ec2862f71e1d7},
571 {0xf07da27a82c37088, 0x5d767327bb4e5a4d},
572 {0x964e858c91ba2655, 0x3a6a07f8d510f870},
573 {0xbbe226efb628afea, 0x890489f70a55368c},
574 {0xeadab0aba3b2dbe5, 0x2b45ac74ccea842f},
575 {0x92c8ae6b464fc96f, 0x3b0b8bc90012929e},
576 {0xb77ada0617e3bbcb, 0x09ce6ebb40173745},
577 {0xe55990879ddcaabd, 0xcc420a6a101d0516},
578 {0x8f57fa54c2a9eab6, 0x9fa946824a12232e},
579 {0xb32df8e9f3546564, 0x47939822dc96abfa},
580 {0xdff9772470297ebd, 0x59787e2b93bc56f8},
581 {0x8bfbea76c619ef36, 0x57eb4edb3c55b65b},
582 {0xaefae51477a06b03, 0xede622920b6b23f2},
583 {0xdab99e59958885c4, 0xe95fab368e45ecee},
584 {0x88b402f7fd75539b, 0x11dbcb0218ebb415},
585 {0xaae103b5fcd2a881, 0xd652bdc29f26a11a},
586 {0xd59944a37c0752a2, 0x4be76d3346f04960},
587 {0x857fcae62d8493a5, 0x6f70a4400c562ddc},
588 {0xa6dfbd9fb8e5b88e, 0xcb4ccd500f6bb953},
589 {0xd097ad07a71f26b2, 0x7e2000a41346a7a8},
590 {0x825ecc24c873782f, 0x8ed400668c0c28c9},
591 {0xa2f67f2dfa90563b, 0x728900802f0f32fb},
592 {0xcbb41ef979346bca, 0x4f2b40a03ad2ffba},
593 {0xfea126b7d78186bc, 0xe2f610c84987bfa9},
594 {0x9f24b832e6b0f436, 0x0dd9ca7d2df4d7ca},
595 {0xc6ede63fa05d3143, 0x91503d1c79720dbc},
596 {0xf8a95fcf88747d94, 0x75a44c6397ce912b},
597 {0x9b69dbe1b548ce7c, 0xc986afbe3ee11abb},
598 {0xc24452da229b021b, 0xfbe85badce996169},
599 {0xf2d56790ab41c2a2, 0xfae27299423fb9c4},
600 {0x97c560ba6b0919a5, 0xdccd879fc967d41b},
601 {0xbdb6b8e905cb600f, 0x5400e987bbc1c921},
602 {0xed246723473e3813, 0x290123e9aab23b69},
603 {0x9436c0760c86e30b, 0xf9a0b6720aaf6522},
604 {0xb94470938fa89bce, 0xf808e40e8d5b3e6a},
605 {0xe7958cb87392c2c2, 0xb60b1d1230b20e05},
606 {0x90bd77f3483bb9b9, 0xb1c6f22b5e6f48c3},
607 {0xb4ecd5f01a4aa828, 0x1e38aeb6360b1af4},
608 {0xe2280b6c20dd5232, 0x25c6da63c38de1b1},
609 {0x8d590723948a535f, 0x579c487e5a38ad0f},
610 {0xb0af48ec79ace837, 0x2d835a9df0c6d852},
611 {0xdcdb1b2798182244, 0xf8e431456cf88e66},
612 {0x8a08f0f8bf0f156b, 0x1b8e9ecb641b5900},
613 {0xac8b2d36eed2dac5, 0xe272467e3d222f40},
614 {0xd7adf884aa879177, 0x5b0ed81dcc6abb10},
615 {0x86ccbb52ea94baea, 0x98e947129fc2b4ea},
616 {0xa87fea27a539e9a5, 0x3f2398d747b36225},
617 {0xd29fe4b18e88640e, 0x8eec7f0d19a03aae},
618 {0x83a3eeeef9153e89, 0x1953cf68300424ad},
619 {0xa48ceaaab75a8e2b, 0x5fa8c3423c052dd8},
620 {0xcdb02555653131b6, 0x3792f412cb06794e},
621 {0x808e17555f3ebf11, 0xe2bbd88bbee40bd1},
622 {0xa0b19d2ab70e6ed6, 0x5b6aceaeae9d0ec5},
623 {0xc8de047564d20a8b, 0xf245825a5a445276},
624 {0xfb158592be068d2e, 0xeed6e2f0f0d56713},
625 {0x9ced737bb6c4183d, 0x55464dd69685606c},
626 {0xc428d05aa4751e4c, 0xaa97e14c3c26b887},
627 {0xf53304714d9265df, 0xd53dd99f4b3066a9},
628 {0x993fe2c6d07b7fab, 0xe546a8038efe402a},
629 {0xbf8fdb78849a5f96, 0xde98520472bdd034},
630 {0xef73d256a5c0f77c, 0x963e66858f6d4441},
631 {0x95a8637627989aad, 0xdde7001379a44aa9},
632 {0xbb127c53b17ec159, 0x5560c018580d5d53},
633 {0xe9d71b689dde71af, 0xaab8f01e6e10b4a7},
634 {0x9226712162ab070d, 0xcab3961304ca70e9},
635 {0xb6b00d69bb55c8d1, 0x3d607b97c5fd0d23},
636 {0xe45c10c42a2b3b05, 0x8cb89a7db77c506b},
637 {0x8eb98a7a9a5b04e3, 0x77f3608e92adb243},
638 {0xb267ed1940f1c61c, 0x55f038b237591ed4},
639 {0xdf01e85f912e37a3, 0x6b6c46dec52f6689},
640 {0x8b61313bbabce2c6, 0x2323ac4b3b3da016},
641 {0xae397d8aa96c1b77, 0xabec975e0a0d081b},
642 {0xd9c7dced53c72255, 0x96e7bd358c904a22},
643 {0x881cea14545c7575, 0x7e50d64177da2e55},
644 {0xaa242499697392d2, 0xdde50bd1d5d0b9ea},
645 {0xd4ad2dbfc3d07787, 0x955e4ec64b44e865},
646 {0x84ec3c97da624ab4, 0xbd5af13bef0b113f},
647 {0xa6274bbdd0fadd61, 0xecb1ad8aeacdd58f},
648 {0xcfb11ead453994ba, 0x67de18eda5814af3},
649 {0x81ceb32c4b43fcf4, 0x80eacf948770ced8},
650 {0xa2425ff75e14fc31, 0xa1258379a94d028e},
651 {0xcad2f7f5359a3b3e, 0x096ee45813a04331},
652 {0xfd87b5f28300ca0d, 0x8bca9d6e188853fd},
653 {0x9e74d1b791e07e48, 0x775ea264cf55347e},
654 {0xc612062576589dda, 0x95364afe032a819e},
655 {0xf79687aed3eec551, 0x3a83ddbd83f52205},
656 {0x9abe14cd44753b52, 0xc4926a9672793543},
657 {0xc16d9a0095928a27, 0x75b7053c0f178294},
658 {0xf1c90080baf72cb1, 0x5324c68b12dd6339},
659 {0x971da05074da7bee, 0xd3f6fc16ebca5e04},
660 {0xbce5086492111aea, 0x88f4bb1ca6bcf585},
661 {0xec1e4a7db69561a5, 0x2b31e9e3d06c32e6},
662 {0x9392ee8e921d5d07, 0x3aff322e62439fd0},
663 {0xb877aa3236a4b449, 0x09befeb9fad487c3},
664 {0xe69594bec44de15b, 0x4c2ebe687989a9b4},
665 {0x901d7cf73ab0acd9, 0x0f9d37014bf60a11},
666 {0xb424dc35095cd80f, 0x538484c19ef38c95},
667 {0xe12e13424bb40e13, 0x2865a5f206b06fba},
668 {0x8cbccc096f5088cb, 0xf93f87b7442e45d4},
669 {0xafebff0bcb24aafe, 0xf78f69a51539d749},
670 {0xdbe6fecebdedd5be, 0xb573440e5a884d1c},
671 {0x89705f4136b4a597, 0x31680a88f8953031},
672 {0xabcc77118461cefc, 0xfdc20d2b36ba7c3e},
673 {0xd6bf94d5e57a42bc, 0x3d32907604691b4d},
674 {0x8637bd05af6c69b5, 0xa63f9a49c2c1b110},
675 {0xa7c5ac471b478423, 0x0fcf80dc33721d54},
676 {0xd1b71758e219652b, 0xd3c36113404ea4a9},
677 {0x83126e978d4fdf3b, 0x645a1cac083126ea},
678 {0xa3d70a3d70a3d70a, 0x3d70a3d70a3d70a4},
679 {0xcccccccccccccccc, 0xcccccccccccccccd},
680 {0x8000000000000000, 0x0000000000000000},
681 {0xa000000000000000, 0x0000000000000000},
682 {0xc800000000000000, 0x0000000000000000},
683 {0xfa00000000000000, 0x0000000000000000},
684 {0x9c40000000000000, 0x0000000000000000},
685 {0xc350000000000000, 0x0000000000000000},
686 {0xf424000000000000, 0x0000000000000000},
687 {0x9896800000000000, 0x0000000000000000},
688 {0xbebc200000000000, 0x0000000000000000},
689 {0xee6b280000000000, 0x0000000000000000},
690 {0x9502f90000000000, 0x0000000000000000},
691 {0xba43b74000000000, 0x0000000000000000},
692 {0xe8d4a51000000000, 0x0000000000000000},
693 {0x9184e72a00000000, 0x0000000000000000},
694 {0xb5e620f480000000, 0x0000000000000000},
695 {0xe35fa931a0000000, 0x0000000000000000},
696 {0x8e1bc9bf04000000, 0x0000000000000000},
697 {0xb1a2bc2ec5000000, 0x0000000000000000},
698 {0xde0b6b3a76400000, 0x0000000000000000},
699 {0x8ac7230489e80000, 0x0000000000000000},
700 {0xad78ebc5ac620000, 0x0000000000000000},
701 {0xd8d726b7177a8000, 0x0000000000000000},
702 {0x878678326eac9000, 0x0000000000000000},
703 {0xa968163f0a57b400, 0x0000000000000000},
704 {0xd3c21bcecceda100, 0x0000000000000000},
705 {0x84595161401484a0, 0x0000000000000000},
706 {0xa56fa5b99019a5c8, 0x0000000000000000},
707 {0xcecb8f27f4200f3a, 0x0000000000000000},
708 {0x813f3978f8940984, 0x4000000000000000},
709 {0xa18f07d736b90be5, 0x5000000000000000},
710 {0xc9f2c9cd04674ede, 0xa400000000000000},
711 {0xfc6f7c4045812296, 0x4d00000000000000},
712 {0x9dc5ada82b70b59d, 0xf020000000000000},
713 {0xc5371912364ce305, 0x6c28000000000000},
714 {0xf684df56c3e01bc6, 0xc732000000000000},
715 {0x9a130b963a6c115c, 0x3c7f400000000000},
716 {0xc097ce7bc90715b3, 0x4b9f100000000000},
717 {0xf0bdc21abb48db20, 0x1e86d40000000000},
718 {0x96769950b50d88f4, 0x1314448000000000},
719 {0xbc143fa4e250eb31, 0x17d955a000000000},
720 {0xeb194f8e1ae525fd, 0x5dcfab0800000000},
721 {0x92efd1b8d0cf37be, 0x5aa1cae500000000},
722 {0xb7abc627050305ad, 0xf14a3d9e40000000},
723 {0xe596b7b0c643c719, 0x6d9ccd05d0000000},
724 {0x8f7e32ce7bea5c6f, 0xe4820023a2000000},
725 {0xb35dbf821ae4f38b, 0xdda2802c8a800000},
726 {0xe0352f62a19e306e, 0xd50b2037ad200000},
727 {0x8c213d9da502de45, 0x4526f422cc340000},
728 {0xaf298d050e4395d6, 0x9670b12b7f410000},
729 {0xdaf3f04651d47b4c, 0x3c0cdd765f114000},
730 {0x88d8762bf324cd0f, 0xa5880a69fb6ac800},
731 {0xab0e93b6efee0053, 0x8eea0d047a457a00},
732 {0xd5d238a4abe98068, 0x72a4904598d6d880},
733 {0x85a36366eb71f041, 0x47a6da2b7f864750},
734 {0xa70c3c40a64e6c51, 0x999090b65f67d924},
735 {0xd0cf4b50cfe20765, 0xfff4b4e3f741cf6d},
736 {0x82818f1281ed449f, 0xbff8f10e7a8921a4},
737 {0xa321f2d7226895c7, 0xaff72d52192b6a0d},
738 {0xcbea6f8ceb02bb39, 0x9bf4f8a69f764490},
739 {0xfee50b7025c36a08, 0x02f236d04753d5b4},
740 {0x9f4f2726179a2245, 0x01d762422c946590},
741 {0xc722f0ef9d80aad6, 0x424d3ad2b7b97ef5},
742 {0xf8ebad2b84e0d58b, 0xd2e0898765a7deb2},
743 {0x9b934c3b330c8577, 0x63cc55f49f88eb2f},
744 {0xc2781f49ffcfa6d5, 0x3cbf6b71c76b25fb},
745 {0xf316271c7fc3908a, 0x8bef464e3945ef7a},
746 {0x97edd871cfda3a56, 0x97758bf0e3cbb5ac},
747 {0xbde94e8e43d0c8ec, 0x3d52eeed1cbea317},
748 {0xed63a231d4c4fb27, 0x4ca7aaa863ee4bdd},
749 {0x945e455f24fb1cf8, 0x8fe8caa93e74ef6a},
750 {0xb975d6b6ee39e436, 0xb3e2fd538e122b44},
751 {0xe7d34c64a9c85d44, 0x60dbbca87196b616},
752 {0x90e40fbeea1d3a4a, 0xbc8955e946fe31cd},
753 {0xb51d13aea4a488dd, 0x6babab6398bdbe41},
754 {0xe264589a4dcdab14, 0xc696963c7eed2dd1},
755 {0x8d7eb76070a08aec, 0xfc1e1de5cf543ca2},
756 {0xb0de65388cc8ada8, 0x3b25a55f43294bcb},
757 {0xdd15fe86affad912, 0x49ef0eb713f39ebe},
758 {0x8a2dbf142dfcc7ab, 0x6e3569326c784337},
759 {0xacb92ed9397bf996, 0x49c2c37f07965404},
760 {0xd7e77a8f87daf7fb, 0xdc33745ec97be906},
761 {0x86f0ac99b4e8dafd, 0x69a028bb3ded71a3},
762 {0xa8acd7c0222311bc, 0xc40832ea0d68ce0c},
763 {0xd2d80db02aabd62b, 0xf50a3fa490c30190},
764 {0x83c7088e1aab65db, 0x792667c6da79e0fa},
765 {0xa4b8cab1a1563f52, 0x577001b891185938},
766 {0xcde6fd5e09abcf26, 0xed4c0226b55e6f86},
767 {0x80b05e5ac60b6178, 0x544f8158315b05b4},
768 {0xa0dc75f1778e39d6, 0x696361ae3db1c721},
769 {0xc913936dd571c84c, 0x03bc3a19cd1e38e9},
770 {0xfb5878494ace3a5f, 0x04ab48a04065c723},
771 {0x9d174b2dcec0e47b, 0x62eb0d64283f9c76},
772 {0xc45d1df942711d9a, 0x3ba5d0bd324f8394},
773 {0xf5746577930d6500, 0xca8f44ec7ee36479},
774 {0x9968bf6abbe85f20, 0x7e998b13cf4e1ecb},
775 {0xbfc2ef456ae276e8, 0x9e3fedd8c321a67e},
776 {0xefb3ab16c59b14a2, 0xc5cfe94ef3ea101e},
777 {0x95d04aee3b80ece5, 0xbba1f1d158724a12},
778 {0xbb445da9ca61281f, 0x2a8a6e45ae8edc97},
779 {0xea1575143cf97226, 0xf52d09d71a3293bd},
780 {0x924d692ca61be758, 0x593c2626705f9c56},
781 {0xb6e0c377cfa2e12e, 0x6f8b2fb00c77836c},
782 {0xe498f455c38b997a, 0x0b6dfb9c0f956447},
783 {0x8edf98b59a373fec, 0x4724bd4189bd5eac},
784 {0xb2977ee300c50fe7, 0x58edec91ec2cb657},
785 {0xdf3d5e9bc0f653e1, 0x2f2967b66737e3ed},
786 {0x8b865b215899f46c, 0xbd79e0d20082ee74},
787 {0xae67f1e9aec07187, 0xecd8590680a3aa11},
788 {0xda01ee641a708de9, 0xe80e6f4820cc9495},
789 {0x884134fe908658b2, 0x3109058d147fdcdd},
790 {0xaa51823e34a7eede, 0xbd4b46f0599fd415},
791 {0xd4e5e2cdc1d1ea96, 0x6c9e18ac7007c91a},
792 {0x850fadc09923329e, 0x03e2cf6bc604ddb0},
793 {0xa6539930bf6bff45, 0x84db8346b786151c},
794 {0xcfe87f7cef46ff16, 0xe612641865679a63},
795 {0x81f14fae158c5f6e, 0x4fcb7e8f3f60c07e},
796 {0xa26da3999aef7749, 0xe3be5e330f38f09d},
797 {0xcb090c8001ab551c, 0x5cadf5bfd3072cc5},
798 {0xfdcb4fa002162a63, 0x73d9732fc7c8f7f6},
799 {0x9e9f11c4014dda7e, 0x2867e7fddcdd9afa},
800 {0xc646d63501a1511d, 0xb281e1fd541501b8},
801 {0xf7d88bc24209a565, 0x1f225a7ca91a4226},
802 {0x9ae757596946075f, 0x3375788de9b06958},
803 {0xc1a12d2fc3978937, 0x0052d6b1641c83ae},
804 {0xf209787bb47d6b84, 0xc0678c5dbd23a49a},
805 {0x9745eb4d50ce6332, 0xf840b7ba963646e0},
806 {0xbd176620a501fbff, 0xb650e5a93bc3d898},
807 {0xec5d3fa8ce427aff, 0xa3e51f138ab4cebe},
808 {0x93ba47c980e98cdf, 0xc66f336c36b10137},
809 {0xb8a8d9bbe123f017, 0xb80b0047445d4184},
810 {0xe6d3102ad96cec1d, 0xa60dc059157491e5},
811 {0x9043ea1ac7e41392, 0x87c89837ad68db2f},
812 {0xb454e4a179dd1877, 0x29babe4598c311fb},
813 {0xe16a1dc9d8545e94, 0xf4296dd6fef3d67a},
814 {0x8ce2529e2734bb1d, 0x1899e4a65f58660c},
815 {0xb01ae745b101e9e4, 0x5ec05dcff72e7f8f},
816 {0xdc21a1171d42645d, 0x76707543f4fa1f73},
817 {0x899504ae72497eba, 0x6a06494a791c53a8},
818 {0xabfa45da0edbde69, 0x0487db9d17636892},
819 {0xd6f8d7509292d603, 0x45a9d2845d3c42b6},
820 {0x865b86925b9bc5c2, 0x0b8a2392ba45a9b2},
821 {0xa7f26836f282b732, 0x8e6cac7768d7141e},
822 {0xd1ef0244af2364ff, 0x3207d795430cd926},
823 {0x8335616aed761f1f, 0x7f44e6bd49e807b8},
824 {0xa402b9c5a8d3a6e7, 0x5f16206c9c6209a6},
825 {0xcd036837130890a1, 0x36dba887c37a8c0f},
826 {0x802221226be55a64, 0xc2494954da2c9789},
827 {0xa02aa96b06deb0fd, 0xf2db9baa10b7bd6c},
828 {0xc83553c5c8965d3d, 0x6f92829494e5acc7},
829 {0xfa42a8b73abbf48c, 0xcb772339ba1f17f9},
830 {0x9c69a97284b578d7, 0xff2a760414536efb},
831 {0xc38413cf25e2d70d, 0xfef5138519684aba},
832 {0xf46518c2ef5b8cd1, 0x7eb258665fc25d69},
833 {0x98bf2f79d5993802, 0xef2f773ffbd97a61},
834 {0xbeeefb584aff8603, 0xaafb550ffacfd8fa},
835 {0xeeaaba2e5dbf6784, 0x95ba2a53f983cf38},
836 {0x952ab45cfa97a0b2, 0xdd945a747bf26183},
837 {0xba756174393d88df, 0x94f971119aeef9e4},
838 {0xe912b9d1478ceb17, 0x7a37cd5601aab85d},
839 {0x91abb422ccb812ee, 0xac62e055c10ab33a},
840 {0xb616a12b7fe617aa, 0x577b986b314d6009},
841 {0xe39c49765fdf9d94, 0xed5a7e85fda0b80b},
842 {0x8e41ade9fbebc27d, 0x14588f13be847307},
843 {0xb1d219647ae6b31c, 0x596eb2d8ae258fc8},
844 {0xde469fbd99a05fe3, 0x6fca5f8ed9aef3bb},
845 {0x8aec23d680043bee, 0x25de7bb9480d5854},
846 {0xada72ccc20054ae9, 0xaf561aa79a10ae6a},
847 {0xd910f7ff28069da4, 0x1b2ba1518094da04},
848 {0x87aa9aff79042286, 0x90fb44d2f05d0842},
849 {0xa99541bf57452b28, 0x353a1607ac744a53},
850 {0xd3fa922f2d1675f2, 0x42889b8997915ce8},
851 {0x847c9b5d7c2e09b7, 0x69956135febada11},
852 {0xa59bc234db398c25, 0x43fab9837e699095},
853 {0xcf02b2c21207ef2e, 0x94f967e45e03f4bb},
854 {0x8161afb94b44f57d, 0x1d1be0eebac278f5},
855 {0xa1ba1ba79e1632dc, 0x6462d92a69731732},
856 {0xca28a291859bbf93, 0x7d7b8f7503cfdcfe},
857 {0xfcb2cb35e702af78, 0x5cda735244c3d43e},
858 {0x9defbf01b061adab, 0x3a0888136afa64a7},
859 {0xc56baec21c7a1916, 0x088aaa1845b8fdd0},
860 {0xf6c69a72a3989f5b, 0x8aad549e57273d45},
861 {0x9a3c2087a63f6399, 0x36ac54e2f678864b},
862 {0xc0cb28a98fcf3c7f, 0x84576a1bb416a7dd},
863 {0xf0fdf2d3f3c30b9f, 0x656d44a2a11c51d5},
864 {0x969eb7c47859e743, 0x9f644ae5a4b1b325},
865 {0xbc4665b596706114, 0x873d5d9f0dde1fee},
866 {0xeb57ff22fc0c7959, 0xa90cb506d155a7ea},
867 {0x9316ff75dd87cbd8, 0x09a7f12442d588f2},
868 {0xb7dcbf5354e9bece, 0x0c11ed6d538aeb2f},
869 {0xe5d3ef282a242e81, 0x8f1668c8a86da5fa},
870 {0x8fa475791a569d10, 0xf96e017d694487bc},
871 {0xb38d92d760ec4455, 0x37c981dcc395a9ac},
872 {0xe070f78d3927556a, 0x85bbe253f47b1417},
873 {0x8c469ab843b89562, 0x93956d7478ccec8e},
874 {0xaf58416654a6babb, 0x387ac8d1970027b2},
875 {0xdb2e51bfe9d0696a, 0x06997b05fcc0319e},
876 {0x88fcf317f22241e2, 0x441fece3bdf81f03},
877 {0xab3c2fddeeaad25a, 0xd527e81cad7626c3},
878 {0xd60b3bd56a5586f1, 0x8a71e223d8d3b074},
879 {0x85c7056562757456, 0xf6872d5667844e49},
880 {0xa738c6bebb12d16c, 0xb428f8ac016561db},
881 {0xd106f86e69d785c7, 0xe13336d701beba52},
882 {0x82a45b450226b39c, 0xecc0024661173473},
883 {0xa34d721642b06084, 0x27f002d7f95d0190},
884 {0xcc20ce9bd35c78a5, 0x31ec038df7b441f4},
885 {0xff290242c83396ce, 0x7e67047175a15271},
886 {0x9f79a169bd203e41, 0x0f0062c6e984d386},
887 {0xc75809c42c684dd1, 0x52c07b78a3e60868},
888 {0xf92e0c3537826145, 0xa7709a56ccdf8a82},
889 {0x9bbcc7a142b17ccb, 0x88a66076400bb691},
890 {0xc2abf989935ddbfe, 0x6acff893d00ea435},
891 {0xf356f7ebf83552fe, 0x0583f6b8c4124d43},
892 {0x98165af37b2153de, 0xc3727a337a8b704a},
893 {0xbe1bf1b059e9a8d6, 0x744f18c0592e4c5c},
894 {0xeda2ee1c7064130c, 0x1162def06f79df73},
895 {0x9485d4d1c63e8be7, 0x8addcb5645ac2ba8},
896 {0xb9a74a0637ce2ee1, 0x6d953e2bd7173692},
897 {0xe8111c87c5c1ba99, 0xc8fa8db6ccdd0437},
898 {0x910ab1d4db9914a0, 0x1d9c9892400a22a2},
899 {0xb54d5e4a127f59c8, 0x2503beb6d00cab4b},
900 {0xe2a0b5dc971f303a, 0x2e44ae64840fd61d},
901 {0x8da471a9de737e24, 0x5ceaecfed289e5d2},
902 {0xb10d8e1456105dad, 0x7425a83e872c5f47},
903 {0xdd50f1996b947518, 0xd12f124e28f77719},
904 {0x8a5296ffe33cc92f, 0x82bd6b70d99aaa6f},
905 {0xace73cbfdc0bfb7b, 0x636cc64d1001550b},
906 {0xd8210befd30efa5a, 0x3c47f7e05401aa4e},
907 {0x8714a775e3e95c78, 0x65acfaec34810a71},
908 {0xa8d9d1535ce3b396, 0x7f1839a741a14d0d},
909 {0xd31045a8341ca07c, 0x1ede48111209a050},
910 {0x83ea2b892091e44d, 0x934aed0aab460432},
911 {0xa4e4b66b68b65d60, 0xf81da84d5617853f},
912 {0xce1de40642e3f4b9, 0x36251260ab9d668e},
913 {0x80d2ae83e9ce78f3, 0xc1d72b7c6b426019},
914 {0xa1075a24e4421730, 0xb24cf65b8612f81f},
915 {0xc94930ae1d529cfc, 0xdee033f26797b627},
916 {0xfb9b7cd9a4a7443c, 0x169840ef017da3b1},
917 {0x9d412e0806e88aa5, 0x8e1f289560ee864e},
918 {0xc491798a08a2ad4e, 0xf1a6f2bab92a27e2},
919 {0xf5b5d7ec8acb58a2, 0xae10af696774b1db},
920 {0x9991a6f3d6bf1765, 0xacca6da1e0a8ef29},
921 {0xbff610b0cc6edd3f, 0x17fd090a58d32af3},
922 {0xeff394dcff8a948e, 0xddfc4b4cef07f5b0},
923 {0x95f83d0a1fb69cd9, 0x4abdaf101564f98e},
924 {0xbb764c4ca7a4440f, 0x9d6d1ad41abe37f1},
925 {0xea53df5fd18d5513, 0x84c86189216dc5ed},
926 {0x92746b9be2f8552c, 0x32fd3cf5b4e49bb4},
927 {0xb7118682dbb66a77, 0x3fbc8c33221dc2a1},
928 {0xe4d5e82392a40515, 0x0fabaf3feaa5334a},
929 {0x8f05b1163ba6832d, 0x29cb4d87f2a7400e},
930 {0xb2c71d5bca9023f8, 0x743e20e9ef511012},
931 {0xdf78e4b2bd342cf6, 0x914da9246b255416},
932 {0x8bab8eefb6409c1a, 0x1ad089b6c2f7548e},
933 {0xae9672aba3d0c320, 0xa184ac2473b529b1},
934 {0xda3c0f568cc4f3e8, 0xc9e5d72d90a2741e},
935 {0x8865899617fb1871, 0x7e2fa67c7a658892},
936 {0xaa7eebfb9df9de8d, 0xddbb901b98feeab7},
937 {0xd51ea6fa85785631, 0x552a74227f3ea565},
938 {0x8533285c936b35de, 0xd53a88958f87275f},
939 {0xa67ff273b8460356, 0x8a892abaf368f137},
940 {0xd01fef10a657842c, 0x2d2b7569b0432d85},
941 {0x8213f56a67f6b29b, 0x9c3b29620e29fc73},
942 {0xa298f2c501f45f42, 0x8349f3ba91b47b8f},
943 {0xcb3f2f7642717713, 0x241c70a936219a73},
944 {0xfe0efb53d30dd4d7, 0xed238cd383aa0110},
945 {0x9ec95d1463e8a506, 0xf4363804324a40aa},
946 {0xc67bb4597ce2ce48, 0xb143c6053edcd0d5},
947 {0xf81aa16fdc1b81da, 0xdd94b7868e94050a},
948 {0x9b10a4e5e9913128, 0xca7cf2b4191c8326},
949 {0xc1d4ce1f63f57d72, 0xfd1c2f611f63a3f0},
950 {0xf24a01a73cf2dccf, 0xbc633b39673c8cec},
951 {0x976e41088617ca01, 0xd5be0503e085d813},
952 {0xbd49d14aa79dbc82, 0x4b2d8644d8a74e18},
953 {0xec9c459d51852ba2, 0xddf8e7d60ed1219e},
954 {0x93e1ab8252f33b45, 0xcabb90e5c942b503},
955 {0xb8da1662e7b00a17, 0x3d6a751f3b936243},
956 {0xe7109bfba19c0c9d, 0x0cc512670a783ad4},
957 {0x906a617d450187e2, 0x27fb2b80668b24c5},
958 {0xb484f9dc9641e9da, 0xb1f9f660802dedf6},
959 {0xe1a63853bbd26451, 0x5e7873f8a0396973},
960 {0x8d07e33455637eb2, 0xdb0b487b6423e1e8},
961 {0xb049dc016abc5e5f, 0x91ce1a9a3d2cda62},
962 {0xdc5c5301c56b75f7, 0x7641a140cc7810fb},
963 {0x89b9b3e11b6329ba, 0xa9e904c87fcb0a9d},
964 {0xac2820d9623bf429, 0x546345fa9fbdcd44},
965 {0xd732290fbacaf133, 0xa97c177947ad4095},
966 {0x867f59a9d4bed6c0, 0x49ed8eabcccc485d},
967 {0xa81f301449ee8c70, 0x5c68f256bfff5a74},
968 {0xd226fc195c6a2f8c, 0x73832eec6fff3111},
969 {0x83585d8fd9c25db7, 0xc831fd53c5ff7eab},
970 {0xa42e74f3d032f525, 0xba3e7ca8b77f5e55},
971 {0xcd3a1230c43fb26f, 0x28ce1bd2e55f35eb},
972 {0x80444b5e7aa7cf85, 0x7980d163cf5b81b3},
973 {0xa0555e361951c366, 0xd7e105bcc332621f},
974 {0xc86ab5c39fa63440, 0x8dd9472bf3fefaa7},
975 {0xfa856334878fc150, 0xb14f98f6f0feb951},
976 {0x9c935e00d4b9d8d2, 0x6ed1bf9a569f33d3},
977 {0xc3b8358109e84f07, 0x0a862f80ec4700c8},
978 {0xf4a642e14c6262c8, 0xcd27bb612758c0fa},
979 {0x98e7e9cccfbd7dbd, 0x8038d51cb897789c},
980 {0xbf21e44003acdd2c, 0xe0470a63e6bd56c3},
981 {0xeeea5d5004981478, 0x1858ccfce06cac74},
982 {0x95527a5202df0ccb, 0x0f37801e0c43ebc8},
983 {0xbaa718e68396cffd, 0xd30560258f54e6ba},
984 {0xe950df20247c83fd, 0x47c6b82ef32a2069},
985 {0x91d28b7416cdd27e, 0x4cdc331d57fa5441},
986 {0xb6472e511c81471d, 0xe0133fe4adf8e952},
987 {0xe3d8f9e563a198e5, 0x58180fddd97723a6},
988 {0x8e679c2f5e44ff8f, 0x570f09eaa7ea7648},
989 {0xb201833b35d63f73, 0x2cd2cc6551e513da},
990 {0xde81e40a034bcf4f, 0xf8077f7ea65e58d1},
991 {0x8b112e86420f6191, 0xfb04afaf27faf782},
992 {0xadd57a27d29339f6, 0x79c5db9af1f9b563},
993 {0xd94ad8b1c7380874, 0x18375281ae7822bc},
994 {0x87cec76f1c830548, 0x8f2293910d0b15b5},
995 {0xa9c2794ae3a3c69a, 0xb2eb3875504ddb22},
996 {0xd433179d9c8cb841, 0x5fa60692a46151eb},
997 {0x849feec281d7f328, 0xdbc7c41ba6bcd333},
998 {0xa5c7ea73224deff3, 0x12b9b522906c0800},
999 {0xcf39e50feae16bef, 0xd768226b34870a00},
1000 {0x81842f29f2cce375, 0xe6a1158300d46640},
1001 {0xa1e53af46f801c53, 0x60495ae3c1097fd0},
1002 {0xca5e89b18b602368, 0x385bb19cb14bdfc4},
1003 {0xfcf62c1dee382c42, 0x46729e03dd9ed7b5},
1004 {0x9e19db92b4e31ba9, 0x6c07a2c26a8346d1},
1005 {0xc5a05277621be293, 0xc7098b7305241885},
1006 {0xf70867153aa2db38, 0xb8cbee4fc66d1ea7}
1008 {0xff77b1fcbebcdc4f, 0x25e8e89c13bb0f7b},
1009 {0xce5d73ff402d98e3, 0xfb0a3d212dc81290},
1010 {0xa6b34ad8c9dfc06f, 0xf42faa48c0ea481f},
1011 {0x86a8d39ef77164bc, 0xae5dff9c02033198},
1012 {0xd98ddaee19068c76, 0x3badd624dd9b0958},
1013 {0xafbd2350644eeacf, 0xe5d1929ef90898fb},
1014 {0x8df5efabc5979c8f, 0xca8d3ffa1ef463c2},
1015 {0xe55990879ddcaabd, 0xcc420a6a101d0516},
1016 {0xb94470938fa89bce, 0xf808e40e8d5b3e6a},
1017 {0x95a8637627989aad, 0xdde7001379a44aa9},
1018 {0xf1c90080baf72cb1, 0x5324c68b12dd6339},
1019 {0xc350000000000000, 0x0000000000000000},
1020 {0x9dc5ada82b70b59d, 0xf020000000000000},
1021 {0xfee50b7025c36a08, 0x02f236d04753d5b4},
1022 {0xcde6fd5e09abcf26, 0xed4c0226b55e6f86},
1023 {0xa6539930bf6bff45, 0x84db8346b786151c},
1024 {0x865b86925b9bc5c2, 0x0b8a2392ba45a9b2},
1025 {0xd910f7ff28069da4, 0x1b2ba1518094da04},
1026 {0xaf58416654a6babb, 0x387ac8d1970027b2},
1027 {0x8da471a9de737e24, 0x5ceaecfed289e5d2},
1028 {0xe4d5e82392a40515, 0x0fabaf3feaa5334a},
1029 {0xb8da1662e7b00a17, 0x3d6a751f3b936243},
1030 {0x95527a5202df0ccb, 0x0f37801e0c43ebc8}
1034 #if !FMT_USE_FULL_CACHE_DRAGONBOX 1035 template <
typename T>
1037 0x0000000000000001, 0x0000000000000005, 0x0000000000000019,
1038 0x000000000000007d, 0x0000000000000271, 0x0000000000000c35,
1039 0x0000000000003d09, 0x000000000001312d, 0x000000000005f5e1,
1040 0x00000000001dcd65, 0x00000000009502f9, 0x0000000002e90edd,
1041 0x000000000e8d4a51, 0x0000000048c27395, 0x000000016bcc41e9,
1042 0x000000071afd498d, 0x0000002386f26fc1, 0x000000b1a2bc2ec5,
1043 0x000003782dace9d9, 0x00001158e460913d, 0x000056bc75e2d631,
1044 0x0001b1ae4d6e2ef5, 0x000878678326eac9, 0x002a5a058fc295ed,
1045 0x00d3c21bcecceda1, 0x0422ca8b0a00a425, 0x14adf4b7320334b9};
1047 template <
typename T>
1049 0x50001400, 0x54044100, 0x54014555, 0x55954415, 0x54115555, 0x00000001,
1050 0x50000000, 0x00104000, 0x54010004, 0x05004001, 0x55555544, 0x41545555,
1051 0x54040551, 0x15445545, 0x51555514, 0x10000015, 0x00101100, 0x01100015,
1052 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x04450514, 0x45414110,
1053 0x55555145, 0x50544050, 0x15040155, 0x11054140, 0x50111514, 0x11451454,
1054 0x00400541, 0x00000000, 0x55555450, 0x10056551, 0x10054011, 0x55551014,
1055 0x69514555, 0x05151109, 0x00155555};
1058 template <
typename T>
1060 template <
typename T>
1065 template <
typename T>
1067 template <
typename T>
1070 template <
typename T>
struct bits {
1072 static_cast<int>(
sizeof(T) * std::numeric_limits<unsigned char>::digits);
1089 using significand_type = uint64_t;
1091 template <
typename Float>
1092 using is_supported_float =
bool_constant<
sizeof(Float) ==
sizeof(uint64_t) ||
1093 sizeof(Float) ==
sizeof(uint32_t)>;
1103 std::numeric_limits<double>::digits - 1;
1105 1ULL << double_significand_size;
1109 fp() : f(0), e(0) {}
1110 fp(uint64_t f_val,
int e_val) : f(f_val), e(e_val) {}
1114 template <
typename Double>
explicit fp(Double
d) { assign(d); }
1117 template <typename Float, FMT_ENABLE_IF(is_supported_float<Float>::value)>
1118 bool assign(Float d) {
1120 using limits = std::numeric_limits<Float>;
1121 const int float_significand_size = limits::digits - 1;
1122 const int exponent_size =
1124 const uint64_t float_implicit_bit = 1ULL << float_significand_size;
1125 const uint64_t significand_mask = float_implicit_bit - 1;
1126 const uint64_t
exponent_mask = (~0ULL >> 1) & ~significand_mask;
1127 const int exponent_bias = (1 << exponent_size) - limits::max_exponent - 1;
1128 constexpr
bool is_double =
sizeof(Float) ==
sizeof(uint64_t);
1130 f = u & significand_mask;
1132 static_cast<int>((u &
exponent_mask) >> float_significand_size);
1135 bool is_predecessor_closer = f == 0 && biased_e > 1;
1137 f += float_implicit_bit;
1140 e = biased_e - exponent_bias - float_significand_size;
1141 return is_predecessor_closer;
1144 template <typename Float, FMT_ENABLE_IF(!is_supported_float<Float>::value)>
1145 bool assign(Float) {
1152 template <
int SHIFT> fp
normalize(fp value) {
1155 while ((value.f & shifted_implicit_bit) == 0) {
1167 inline bool operator==(fp
x, fp
y) {
return x.f == y.f && x.e == y.e; }
1170 inline uint64_t
multiply(uint64_t lhs, uint64_t rhs) {
1172 auto product =
static_cast<__uint128_t
>(lhs) * rhs;
1173 auto f =
static_cast<uint64_t
>(product >> 64);
1174 return (static_cast<uint64_t>(product) & (1ULL << 63)) != 0 ?
f + 1 :
f;
1177 uint64_t mask = (1ULL << 32) - 1;
1178 uint64_t a = lhs >> 32, b = lhs & mask;
1179 uint64_t c = rhs >> 32,
d = rhs & mask;
1180 uint64_t ac = a * c, bc = b * c, ad = a * d, bd = b * d;
1182 uint64_t mid = (bd >> 32) + (ad & mask) + (bc & mask) + (1U << 31);
1183 return ac + (ad >> 32) + (bc >> 32) + (mid >> 32);
1187 inline fp
operator*(fp x, fp y) {
return {
multiply(x.f, y.f), x.e + y.e + 64}; }
1192 const int shift = 32;
1194 int index =
static_cast<int>(
1196 ((int64_t(1) << shift) - 1))
1200 const int first_dec_exp = -348;
1202 const int dec_exp_step = 8;
1203 index = (index - first_dec_exp - 1) / dec_exp_step + 1;
1204 pow10_exponent = first_dec_exp + index * dec_exp_step;
1211 struct accumulator {
1215 accumulator() : lower(0), upper(0) {}
1216 explicit operator uint32_t()
const {
return static_cast<uint32_t
>(lower); }
1218 void operator+=(uint64_t n) {
1220 if (lower < n) ++upper;
1222 void operator>>=(
int shift) {
1225 lower = (upper << 32) | (lower >> 32);
1234 using bigit = uint32_t;
1235 using double_bigit = uint64_t;
1236 enum { bigits_capacity = 32 };
1241 bigit& operator[](
int index) {
return bigits_[
to_unsigned(index)]; }
1247 void subtract_bigits(
int index, bigit other, bigit& borrow) {
1248 auto result =
static_cast<double_bigit
>((*this)[
index]) - other - borrow;
1250 borrow =
static_cast<bigit
>(
result >> (bigit_bits * 2 - 1));
1253 void remove_leading_zeros() {
1254 int num_bigits =
static_cast<int>(bigits_.size()) - 1;
1255 while (num_bigits > 0 && (*
this)[num_bigits] == 0) --num_bigits;
1260 void subtract_aligned(
const bigint& other) {
1261 FMT_ASSERT(other.exp_ >= exp_,
"unaligned bigints");
1264 int i = other.exp_ - exp_;
1265 for (
size_t j = 0, n = other.bigits_.size(); j != n; ++i, ++j)
1266 subtract_bigits(i, other.bigits_[j], borrow);
1267 while (borrow > 0) subtract_bigits(i, 0, borrow);
1268 remove_leading_zeros();
1272 const double_bigit wide_value = value;
1274 for (
size_t i = 0, n = bigits_.size();
i < n; ++
i) {
1275 double_bigit
result = bigits_[
i] * wide_value + carry;
1276 bigits_[
i] =
static_cast<bigit
>(result);
1277 carry =
static_cast<bigit
>(result >> bigit_bits);
1279 if (carry != 0) bigits_.push_back(carry);
1283 const bigit mask = ~bigit(0);
1284 const double_bigit lower = value & mask;
1285 const double_bigit upper = value >> bigit_bits;
1286 double_bigit carry = 0;
1287 for (
size_t i = 0, n = bigits_.size();
i < n; ++
i) {
1288 double_bigit
result = bigits_[
i] * lower + (carry & mask);
1290 bigits_[
i] * upper + (result >> bigit_bits) + (carry >> bigit_bits);
1291 bigits_[
i] =
static_cast<bigit
>(result);
1293 while (carry != 0) {
1294 bigits_.push_back(carry & mask);
1295 carry >>= bigit_bits;
1300 bigint() : exp_(0) {}
1301 explicit bigint(uint64_t n) { assign(n); }
1302 ~bigint() {
assert(bigits_.capacity() <= bigits_capacity); }
1304 bigint(
const bigint&) =
delete;
1305 void operator=(
const bigint&) =
delete;
1307 void assign(
const bigint& other) {
1308 auto size = other.bigits_.size();
1310 auto data = other.bigits_.data();
1315 void assign(uint64_t n) {
1316 size_t num_bigits = 0;
1318 bigits_[num_bigits++] = n & ~bigit(0);
1321 bigits_.
resize(num_bigits);
1325 int num_bigits()
const {
return static_cast<int>(bigits_.size()) + exp_; }
1329 exp_ += shift / bigit_bits;
1330 shift %= bigit_bits;
1331 if (shift == 0)
return *
this;
1333 for (
size_t i = 0, n = bigits_.size();
i < n; ++
i) {
1334 bigit c = bigits_[
i] >> (bigit_bits - shift);
1335 bigits_[
i] = (bigits_[
i] << shift) + carry;
1338 if (carry != 0) bigits_.push_back(carry);
1342 template <
typename Int> bigint& operator*=(Int value) {
1348 friend int compare(
const bigint& lhs,
const bigint& rhs) {
1349 int num_lhs_bigits = lhs.num_bigits(), num_rhs_bigits = rhs.num_bigits();
1350 if (num_lhs_bigits != num_rhs_bigits)
1351 return num_lhs_bigits > num_rhs_bigits ? 1 : -1;
1352 int i =
static_cast<int>(lhs.bigits_.size()) - 1;
1353 int j =
static_cast<int>(rhs.bigits_.size()) - 1;
1355 if (end < 0) end = 0;
1356 for (; i >= end; --i, --j) {
1357 bigit lhs_bigit = lhs[i], rhs_bigit = rhs[j];
1358 if (lhs_bigit != rhs_bigit)
return lhs_bigit > rhs_bigit ? 1 : -1;
1360 if (i != j)
return i > j ? 1 : -1;
1365 friend int add_compare(
const bigint& lhs1,
const bigint& lhs2,
1366 const bigint& rhs) {
1367 int max_lhs_bigits = (std::max)(lhs1.num_bigits(), lhs2.num_bigits());
1368 int num_rhs_bigits = rhs.num_bigits();
1369 if (max_lhs_bigits + 1 < num_rhs_bigits)
return -1;
1370 if (max_lhs_bigits > num_rhs_bigits)
return 1;
1371 auto get_bigit = [](
const bigint& n,
int i) -> bigit {
1372 return i >= n.exp_ &&
i < n.num_bigits() ? n[
i - n.exp_] : 0;
1374 double_bigit borrow = 0;
1375 int min_exp = (std::min)((std::min)(lhs1.exp_, lhs2.exp_), rhs.exp_);
1376 for (
int i = num_rhs_bigits - 1;
i >= min_exp; --
i) {
1378 static_cast<double_bigit
>(get_bigit(lhs1,
i)) + get_bigit(lhs2,
i);
1379 bigit rhs_bigit = get_bigit(rhs,
i);
1380 if (sum > rhs_bigit + borrow)
return 1;
1381 borrow = rhs_bigit + borrow - sum;
1382 if (borrow > 1)
return -1;
1383 borrow <<= bigit_bits;
1385 return borrow != 0 ? -1 : 0;
1389 void assign_pow10(
int exp) {
1391 if (exp == 0)
return assign(1);
1394 while (exp >= bitmask) bitmask <<= 1;
1400 while (bitmask != 0) {
1402 if ((exp & bitmask) != 0) *
this *= 5;
1410 int num_bigits =
static_cast<int>(bigits_.size());
1411 int num_result_bigits = 2 * num_bigits;
1414 auto sum = accumulator_t();
1415 for (
int bigit_index = 0; bigit_index < num_bigits; ++bigit_index) {
1418 for (
int i = 0, j = bigit_index; j >= 0; ++
i, --j) {
1420 sum +=
static_cast<double_bigit
>(n[
i]) * n[j];
1422 (*this)[bigit_index] =
static_cast<bigit
>(sum);
1426 for (
int bigit_index = num_bigits; bigit_index < num_result_bigits;
1428 for (
int j = num_bigits - 1,
i = bigit_index - j;
i < num_bigits;)
1429 sum += static_cast<double_bigit>(n[
i++]) * n[j--];
1430 (*this)[bigit_index] =
static_cast<bigit
>(sum);
1433 --num_result_bigits;
1434 remove_leading_zeros();
1440 void align(
const bigint& other) {
1441 int exp_difference = exp_ - other.exp_;
1442 if (exp_difference <= 0)
return;
1443 int num_bigits =
static_cast<int>(bigits_.size());
1445 for (
int i = num_bigits - 1, j =
i + exp_difference;
i >= 0; --
i, --j)
1446 bigits_[j] = bigits_[
i];
1447 std::uninitialized_fill_n(bigits_.data(), exp_difference, 0);
1448 exp_ -= exp_difference;
1453 int divmod_assign(
const bigint& divisor) {
1455 if (compare(*
this, divisor) < 0)
return 0;
1456 FMT_ASSERT(divisor.bigits_[divisor.bigits_.size() - 1u] != 0,
"");
1460 subtract_aligned(divisor);
1462 }
while (compare(*
this, divisor) >= 0);
1479 if (remainder <= divisor - remainder && error * 2 <= divisor - remainder * 2)
1482 if (remainder >= error &&
1483 remainder - error >= divisor - (remainder - error)) {
1500 template <
typename Handler>
1502 int&
exp, Handler& handler) {
1503 const fp one(1ULL << -value.e, value.e);
1507 auto integral =
static_cast<uint32_t
>(value.f >> -one.e);
1509 FMT_ASSERT(integral == value.f >> -one.e,
"");
1511 uint64_t fractional = value.f & (one.f - 1);
1515 value.f / 10, error * 10, exp);
1520 auto divmod_integral = [&](uint32_t divisor) {
1521 digit = integral / divisor;
1522 integral %= divisor;
1528 divmod_integral(1000000000);
1531 divmod_integral(100000000);
1534 divmod_integral(10000000);
1537 divmod_integral(1000000);
1540 divmod_integral(100000);
1543 divmod_integral(10000);
1546 divmod_integral(1000);
1549 divmod_integral(100);
1552 divmod_integral(10);
1559 FMT_ASSERT(
false,
"invalid number of digits");
1562 auto remainder = (
static_cast<uint64_t
>(integral) << -one.e) + fractional;
1563 result = handler.on_digit(static_cast<char>(
'0' + digit),
1572 char digit =
static_cast<char>(
'0' + (fractional >> -one.e));
1573 fractional &= one.f - 1;
1575 result = handler.on_digit(digit, one.f, fractional, error, exp,
false);
1588 digits::result on_start(uint64_t divisor, uint64_t remainder, uint64_t error,
1594 precision += exp + exp10;
1605 digits::result on_digit(
char digit, uint64_t divisor, uint64_t remainder,
1606 uint64_t error,
int,
bool integral) {
1608 buf[size++] = digit;
1615 if (error >= divisor || error >= divisor - error)
return digits::error;
1623 for (
int i = size - 1;
i > 0 && buf[
i] >
'9'; --
i) {
1629 if (fixed) buf[size++] =
'0';
1642 return static_cast<uint128_t>(x) * static_cast<uint128_t>(y);
1643 #elif defined(_MSC_VER) && defined(_M_X64) 1645 result.
low_ = _umul128(x, y, &result.
high_);
1648 const uint64_t mask = (uint64_t(1) << 32) - uint64_t(1);
1650 uint64_t a = x >> 32;
1651 uint64_t b = x & mask;
1652 uint64_t c = y >> 32;
1653 uint64_t
d = y & mask;
1655 uint64_t ac = a * c;
1656 uint64_t bc = b * c;
1657 uint64_t ad = a * d;
1658 uint64_t bd = b * d;
1660 uint64_t intermediate = (bd >> 32) + (ad & mask) + (bc & mask);
1662 return {ac + (intermediate >> 32) + (ad >> 32) + (bc >> 32),
1663 (intermediate << 32) + (bd & mask)};
1671 auto p =
static_cast<uint128_t>(x) * static_cast<uint128_t>(y);
1672 return static_cast<uint64_t
>(p >> 64);
1673 #elif defined(_MSC_VER) && defined(_M_X64) 1674 return __umulh(x, y);
1699 uint64_t g01 = x * y.
high();
1713 FMT_ASSERT(e <= 1700 && e >= -1700,
"too large exponent");
1714 const int shift = 22;
1721 FMT_ASSERT(e <= 1233 && e >= -1233,
"too large exponent");
1722 const uint64_t log2_10_integer_part = 3;
1723 const uint64_t log2_10_fractional_digits = 0x5269e12f346e2bf9;
1724 const int shift_amount = 19;
1725 return (e * static_cast<int>(
1726 (log2_10_integer_part << shift_amount) |
1727 (log2_10_fractional_digits >> (64 - shift_amount)))) >>
1731 FMT_ASSERT(e <= 1700 && e >= -1700,
"too large exponent");
1732 const uint64_t log10_4_over_3_fractional_digits = 0x1ffbfc2bbc780375;
1733 const int shift_amount = 22;
1735 (64 - shift_amount)) -
1736 static_cast<int>(log10_4_over_3_fractional_digits >>
1737 (64 - shift_amount))) >>
1745 #ifdef FMT_BUILTIN_CTZ 1746 return FMT_BUILTIN_CTZ(x) >=
exp;
1748 return exp < num_bits<uint32_t>() && x == ((x >> exp) <<
exp);
1754 #ifdef FMT_BUILTIN_CTZLL 1755 return FMT_BUILTIN_CTZLL(x) >=
exp;
1757 return exp < num_bits<uint64_t>()) && x == ((x >>
exp) << exp);
1778 static constexpr
struct {
1779 uint32_t magic_number;
1780 int bits_for_comparison;
1783 } infos[] = {{0xcccd, 16, 0x3333, 18}, {0xa429, 8, 0x0a, 20}};
1784 constexpr
auto info = infos[N - 1];
1785 n *= info.magic_number;
1786 const uint32_t comparison_mask = (1u << info.bits_for_comparison) - 1;
1787 bool result = (n & comparison_mask) <= info.threshold;
1788 n >>= info.shift_amount;
1795 static constexpr
struct {
1796 uint32_t magic_number;
1798 uint32_t divisor_times_10;
1799 } infos[] = {{0xcccd, 19, 100}, {0xa3d8, 22, 1000}};
1800 constexpr
auto info = infos[N - 1];
1801 FMT_ASSERT(n <= info.divisor_times_10,
"n is too large");
1802 return n * info.magic_number >> info.shift_amount;
1807 return n / float_info<float>::big_divisor;
1815 template <
class T>
struct cache_accessor;
1817 template <>
struct cache_accessor<float> {
1818 using carrier_uint = float_info<float>::carrier_uint;
1819 using cache_entry_type = uint64_t;
1822 FMT_ASSERT(k >= float_info<float>::min_k && k <= float_info<float>::max_k,
1823 "k is out of range");
1827 static carrier_uint compute_mul(carrier_uint u,
1832 static uint32_t compute_delta(
const cache_entry_type& cache,
1834 return static_cast<uint32_t
>(cache >> (64 - 1 - beta_minus_1));
1837 static bool compute_mul_parity(carrier_uint two_f,
1838 const cache_entry_type& cache,
1843 return ((
umul96_lower64(two_f, cache) >> (64 - beta_minus_1)) & 1) != 0;
1846 static carrier_uint compute_left_endpoint_for_shorter_interval_case(
1847 const cache_entry_type& cache,
int beta_minus_1)
FMT_NOEXCEPT {
1848 return static_cast<carrier_uint
>(
1849 (cache - (cache >> (float_info<float>::significand_bits + 2))) >>
1850 (64 - float_info<float>::significand_bits - 1 - beta_minus_1));
1853 static carrier_uint compute_right_endpoint_for_shorter_interval_case(
1854 const cache_entry_type& cache,
int beta_minus_1)
FMT_NOEXCEPT {
1855 return static_cast<carrier_uint
>(
1856 (cache + (cache >> (float_info<float>::significand_bits + 1))) >>
1857 (64 - float_info<float>::significand_bits - 1 - beta_minus_1));
1860 static carrier_uint compute_round_up_for_shorter_interval_case(
1861 const cache_entry_type& cache,
int beta_minus_1)
FMT_NOEXCEPT {
1862 return (static_cast<carrier_uint>(
1864 (64 - float_info<float>::significand_bits - 2 - beta_minus_1)) +
1870 template <>
struct cache_accessor<double> {
1871 using carrier_uint = float_info<double>::carrier_uint;
1875 FMT_ASSERT(k >= float_info<double>::min_k && k <= float_info<double>::max_k,
1876 "k is out of range");
1878 #if FMT_USE_FULL_CACHE_DRAGONBOX 1880 float_info<double>::min_k];
1882 static const int compression_ratio = 27;
1885 int cache_index = (k - float_info<double>::min_k) / compression_ratio;
1886 int kb = cache_index * compression_ratio + float_info<double>::min_k;
1887 int offset = k - kb;
1892 if (offset == 0)
return base_cache;
1896 FMT_ASSERT(alpha > 0 && alpha < 64,
"shifting error detected");
1902 umul128(base_cache.
low() - (kb < 0 ? 1 : 0), pow5);
1904 recovered_cache += middle_low.
high();
1906 uint64_t high_to_middle = recovered_cache.
high() << (64 - alpha);
1907 uint64_t middle_to_low = recovered_cache.
low() << (64 - alpha);
1911 ((middle_low.low() >> alpha) | middle_to_low)};
1913 if (kb < 0) recovered_cache += 1;
1916 int error_idx = (k - float_info<double>::min_k) / 16;
1918 ((k - float_info<double>::min_k) % 16) * 2) &
1923 return {recovered_cache.
high(), recovered_cache.
low() + error};
1927 static carrier_uint compute_mul(carrier_uint u,
1932 static uint32_t compute_delta(cache_entry_type
const& cache,
1934 return static_cast<uint32_t
>(cache.high() >> (64 - 1 - beta_minus_1));
1937 static bool compute_mul_parity(carrier_uint two_f,
1938 const cache_entry_type& cache,
1946 static carrier_uint compute_left_endpoint_for_shorter_interval_case(
1947 const cache_entry_type& cache,
int beta_minus_1)
FMT_NOEXCEPT {
1948 return (cache.high() -
1949 (cache.high() >> (float_info<double>::significand_bits + 2))) >>
1950 (64 - float_info<double>::significand_bits - 1 - beta_minus_1);
1953 static carrier_uint compute_right_endpoint_for_shorter_interval_case(
1954 const cache_entry_type& cache,
int beta_minus_1)
FMT_NOEXCEPT {
1955 return (cache.high() +
1956 (cache.high() >> (float_info<double>::significand_bits + 1))) >>
1957 (64 - float_info<double>::significand_bits - 1 - beta_minus_1);
1960 static carrier_uint compute_round_up_for_shorter_interval_case(
1961 const cache_entry_type& cache,
int beta_minus_1)
FMT_NOEXCEPT {
1962 return ((cache.high() >>
1963 (64 - float_info<double>::significand_bits - 2 - beta_minus_1)) +
1974 T>::case_shorter_interval_left_endpoint_lower_threshold &&
1976 float_info<T>::case_shorter_interval_left_endpoint_upper_threshold;
1981 if (exponent < float_info<T>::case_fc_pm_half_lower_threshold)
return false;
1983 if (exponent <= float_info<T>::case_fc_pm_half_upper_threshold)
return true;
1985 if (exponent > float_info<T>::divisibility_check_by_5_threshold)
return false;
1990 bool is_center_integer(
typename float_info<T>::carrier_uint two_f,
int exponent,
1993 if (exponent > float_info<T>::divisibility_check_by_5_threshold)
return false;
1994 if (exponent > float_info<T>::case_fc_upper_threshold)
1997 if (exponent >= float_info<T>::case_fc_lower_threshold)
return true;
2004 #ifdef FMT_BUILTIN_CTZ 2005 int t = FMT_BUILTIN_CTZ(n);
2009 if (t > float_info<float>::max_trailing_zeros)
2010 t = float_info<float>::max_trailing_zeros;
2012 const uint32_t mod_inv1 = 0xcccccccd;
2013 const uint32_t max_quotient1 = 0x33333333;
2014 const uint32_t mod_inv2 = 0xc28f5c29;
2015 const uint32_t max_quotient2 = 0x0a3d70a3;
2018 for (; s < t - 1; s += 2) {
2019 if (n * mod_inv2 > max_quotient2)
break;
2022 if (s < t && n * mod_inv1 <= max_quotient1) {
2032 #ifdef FMT_BUILTIN_CTZLL 2033 int t = FMT_BUILTIN_CTZLL(n);
2037 if (t > float_info<double>::max_trailing_zeros)
2038 t = float_info<double>::max_trailing_zeros;
2043 const uint32_t mod_inv1 = 0xcccccccd;
2044 const uint32_t max_quotient1 = 0x33333333;
2045 const uint64_t mod_inv8 = 0xc767074b22e90e21;
2046 const uint64_t max_quotient8 = 0x00002af31dc46118;
2050 auto quotient_candidate = n * mod_inv8;
2052 if (quotient_candidate <= max_quotient8) {
2053 auto quotient =
static_cast<uint32_t
>(quotient_candidate >> 8);
2056 for (; s < t; ++s) {
2057 if (quotient * mod_inv1 > max_quotient1)
break;
2058 quotient *= mod_inv1;
2060 quotient >>= (s - 8);
2067 auto quotient =
static_cast<uint32_t
>(n / 100000000);
2068 auto remainder =
static_cast<uint32_t
>(n - 100000000 * quotient);
2070 if (t == 0 || remainder * mod_inv1 > max_quotient1) {
2073 remainder *= mod_inv1;
2075 if (t == 1 || remainder * mod_inv1 > max_quotient1) {
2076 n = (remainder >> 1) + quotient * 10000000ull;
2079 remainder *= mod_inv1;
2081 if (t == 2 || remainder * mod_inv1 > max_quotient1) {
2082 n = (remainder >> 2) + quotient * 1000000ull;
2085 remainder *= mod_inv1;
2087 if (t == 3 || remainder * mod_inv1 > max_quotient1) {
2088 n = (remainder >> 3) + quotient * 100000ull;
2091 remainder *= mod_inv1;
2093 if (t == 4 || remainder * mod_inv1 > max_quotient1) {
2094 n = (remainder >> 4) + quotient * 10000ull;
2097 remainder *= mod_inv1;
2099 if (t == 5 || remainder * mod_inv1 > max_quotient1) {
2100 n = (remainder >> 5) + quotient * 1000ull;
2103 remainder *= mod_inv1;
2105 if (t == 6 || remainder * mod_inv1 > max_quotient1) {
2106 n = (remainder >> 6) + quotient * 100ull;
2109 remainder *= mod_inv1;
2111 n = (remainder >> 7) + quotient * 10ull;
2119 decimal_fp<T> ret_value;
2125 using cache_entry_type =
typename cache_accessor<T>::cache_entry_type;
2126 const cache_entry_type cache = cache_accessor<T>::get_cached_power(-minus_k);
2128 auto xi = cache_accessor<T>::compute_left_endpoint_for_shorter_interval_case(
2129 cache, beta_minus_1);
2130 auto zi = cache_accessor<T>::compute_right_endpoint_for_shorter_interval_case(
2131 cache, beta_minus_1);
2134 if (!is_left_endpoint_integer_shorter_interval<T>(exponent)) ++xi;
2137 ret_value.significand = zi / 10;
2140 if (ret_value.significand * 10 >= xi) {
2141 ret_value.exponent = minus_k + 1;
2147 ret_value.significand =
2148 cache_accessor<T>::compute_round_up_for_shorter_interval_case(
2149 cache, beta_minus_1);
2150 ret_value.exponent = minus_k;
2153 if (exponent >= float_info<T>::shorter_interval_tie_lower_threshold &&
2154 exponent <= float_info<T>::shorter_interval_tie_upper_threshold) {
2155 ret_value.significand = ret_value.significand % 2 == 0
2156 ? ret_value.significand
2157 : ret_value.significand - 1;
2158 }
else if (ret_value.significand < xi) {
2159 ++ret_value.significand;
2164 template <
typename T>
2168 using carrier_uint =
typename float_info<T>::carrier_uint;
2169 using cache_entry_type =
typename cache_accessor<T>::cache_entry_type;
2170 auto br =
bit_cast<carrier_uint>(x);
2173 const carrier_uint significand_mask =
2174 (
static_cast<carrier_uint
>(1) << float_info<T>::significand_bits) - 1;
2175 carrier_uint significand = (br & significand_mask);
2177 static_cast<int>((br & exponent_mask<T>()) >> float_info<T>::significand_bits);
2179 if (exponent != 0) {
2180 exponent += float_info<T>::exponent_bias - float_info<T>::significand_bits;
2183 if (significand == 0)
return shorter_interval_case<T>(exponent);
2186 (
static_cast<carrier_uint
>(1) << float_info<T>::significand_bits);
2189 if (significand == 0)
return {0, 0};
2190 exponent = float_info<T>::min_exponent - float_info<T>::significand_bits;
2193 const bool include_left_endpoint = (significand % 2 == 0);
2194 const bool include_right_endpoint = include_left_endpoint;
2198 const cache_entry_type cache = cache_accessor<T>::get_cached_power(-minus_k);
2203 const uint32_t deltai = cache_accessor<T>::compute_delta(cache, beta_minus_1);
2204 const carrier_uint two_fc = significand << 1;
2205 const carrier_uint two_fr = two_fc | 1;
2206 const carrier_uint zi =
2207 cache_accessor<T>::compute_mul(two_fr << beta_minus_1, cache);
2213 decimal_fp<T> ret_value;
2215 uint32_t r =
static_cast<uint32_t
>(zi - float_info<T>::big_divisor *
2216 ret_value.significand);
2219 goto small_divisor_case_label;
2220 }
else if (r < deltai) {
2222 if (r == 0 && !include_right_endpoint &&
2223 is_endpoint_integer<T>(two_fr, exponent, minus_k)) {
2224 --ret_value.significand;
2225 r = float_info<T>::big_divisor;
2226 goto small_divisor_case_label;
2232 const carrier_uint two_fl = two_fc - 1;
2233 if ((!include_left_endpoint ||
2234 !is_endpoint_integer<T>(two_fl, exponent, minus_k)) &&
2235 !cache_accessor<T>::compute_mul_parity(two_fl, cache, beta_minus_1)) {
2236 goto small_divisor_case_label;
2239 ret_value.exponent = minus_k + float_info<T>::kappa + 1;
2247 small_divisor_case_label:
2248 ret_value.significand *= 10;
2249 ret_value.exponent = minus_k + float_info<T>::kappa;
2251 const uint32_t mask = (1u << float_info<T>::kappa) - 1;
2252 auto dist = r - (deltai / 2) + (float_info<T>::small_divisor / 2);
2255 if ((dist & mask) == 0) {
2256 const bool approx_y_parity =
2257 ((dist ^ (float_info<T>::small_divisor / 2)) & 1) != 0;
2258 dist >>= float_info<T>::kappa;
2262 ret_value.significand += dist;
2270 if (cache_accessor<T>::compute_mul_parity(two_fc, cache, beta_minus_1) !=
2272 --ret_value.significand;
2276 if (is_center_integer<T>(two_fc, exponent, minus_k)) {
2277 ret_value.significand = ret_value.significand % 2 == 0
2278 ? ret_value.significand
2279 : ret_value.significand - 1;
2285 ret_value.significand += dist;
2292 ret_value.significand +=
2293 small_division_by_pow10<float_info<T>::kappa>(dist);
2302 template <
typename Double>
2315 const bool is_predecessor_closer =
2316 binary32 ? value.assign(static_cast<float>(d)) : value.assign(d);
2317 int shift = is_predecessor_closer ? 2 : 1;
2318 uint64_t significand = value.f << shift;
2320 numerator.assign(significand);
2321 numerator <<= value.e;
2325 upper_store.assign(1);
2326 upper_store <<= value.e + 1;
2327 upper = &upper_store;
2329 denominator.assign_pow10(exp10);
2331 }
else if (exp10 < 0) {
2332 numerator.assign_pow10(-exp10);
2333 lower.assign(numerator);
2335 upper_store.assign(numerator);
2337 upper = &upper_store;
2339 numerator *= significand;
2340 denominator.assign(1);
2341 denominator <<= shift - value.e;
2343 numerator.assign(significand);
2344 denominator.assign_pow10(exp10);
2345 denominator <<= shift - value.e;
2348 upper_store.assign(1ULL << 1);
2349 upper = &upper_store;
2353 if (num_digits < 0) {
2355 if (!upper) upper = &lower;
2356 bool even = (value.f & 1) == 0;
2360 int digit = numerator.divmod_assign(denominator);
2361 bool low = compare(numerator, lower) - even < 0;
2363 bool high = add_compare(numerator, *upper, denominator) + even > 0;
2364 data[num_digits++] =
static_cast<char>(
'0' + digit);
2367 ++data[num_digits - 1];
2369 int result = add_compare(numerator, numerator, denominator);
2371 if (result > 0 || (result == 0 && (digit % 2) != 0))
2372 ++data[num_digits - 1];
2375 exp10 -= num_digits - 1;
2380 if (upper != &lower) *upper *= 10;
2384 exp10 -= num_digits - 1;
2385 if (num_digits == 0) {
2388 buf[0] = add_compare(numerator, numerator, denominator) > 0 ?
'1' :
'0';
2392 for (
int i = 0;
i < num_digits - 1; ++
i) {
2393 int digit = numerator.divmod_assign(denominator);
2394 buf[
i] =
static_cast<char>(
'0' + digit);
2397 int digit = numerator.divmod_assign(denominator);
2398 auto result = add_compare(numerator, numerator, denominator);
2401 const auto overflow =
'0' + 10;
2402 buf[num_digits - 1] = overflow;
2404 for (
int i = num_digits - 1;
i > 0 && buf[
i] == overflow; --
i) {
2408 if (buf[0] == overflow) {
2416 buf[num_digits - 1] =
static_cast<char>(
'0' + digit);
2419 template <
typename T>
2421 static_assert(!std::is_same<T, float>::value,
"");
2426 if (precision <= 0 || !fixed) {
2431 std::uninitialized_fill_n(buf.
data(), precision,
'0');
2437 if (precision < 0) {
2442 return dec.exponent;
2446 return dec.exponent;
2452 const int min_exp = -60;
2453 int cached_exp10 = 0;
2457 normalized = normalized * cached_pow;
2460 const int max_double_digits = 767;
2461 if (precision > max_double_digits) precision = max_double_digits;
2464 exp +=
handler.size - cached_exp10 - 1;
2472 auto num_digits = buf.
size();
2473 while (num_digits > 0 && buf[num_digits - 1] ==
'0') {
2482 template <
typename T>
2487 static_assert(!std::is_same<T, float>::value,
"");
2493 precision = (precision >= 0 ? precision : 6) - 1;
2496 enum { max_format_size = 7 };
2497 char format[max_format_size];
2498 char* format_ptr =
format;
2499 *format_ptr++ =
'%';
2501 if (precision >= 0) {
2502 *format_ptr++ =
'.';
2503 *format_ptr++ =
'*';
2505 if (std::is_same<T, long double>()) *format_ptr++ =
'L';
2508 : (specs.
upper ?
'A' :
'a');
2512 auto offset = buf.
size();
2514 auto begin = buf.
data() + offset;
2515 auto capacity = buf.
capacity() - offset;
2517 if (precision > 100000)
2518 throw std::runtime_error(
2519 "fuzz mode - avoid large allocation inside snprintf");
2524 int result = precision >= 0
2525 ? snprintf_ptr(begin, capacity, format, precision, value)
2526 : snprintf_ptr(begin, capacity, format, value);
2534 if (
size >= capacity) {
2538 auto is_digit = [](
char c) {
return c >=
'0' && c <=
'9'; };
2540 if (precision == 0) {
2545 auto end = begin +
size, p = end;
2548 }
while (is_digit(*p));
2549 int fraction_size =
static_cast<int>(end - p - 1);
2550 std::memmove(p, p + 1,
to_unsigned(fraction_size));
2552 return -fraction_size;
2559 auto end = begin +
size, exp_pos = end;
2562 }
while (*exp_pos !=
'e');
2563 char sign = exp_pos[1];
2564 assert(sign ==
'+' || sign ==
'-');
2566 auto p = exp_pos + 2;
2569 exp = exp * 10 + (*p++ -
'0');
2571 if (sign ==
'-') exp = -
exp;
2572 int fraction_size = 0;
2573 if (exp_pos != begin + 1) {
2575 auto fraction_end = exp_pos - 1;
2576 while (*fraction_end ==
'0') --fraction_end;
2578 fraction_size =
static_cast<int>(fraction_end - begin - 1);
2579 std::memmove(begin + 1, begin + 2,
to_unsigned(fraction_size));
2582 return exp - fraction_size;
2603 inline const char*
utf8_decode(
const char* buf, uint32_t* c,
int* e) {
2604 static const char lengths[] = {1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1,
2605 1, 1, 1, 1, 1, 0, 0, 0, 0, 0, 0,
2606 0, 0, 2, 2, 2, 2, 3, 3, 4, 0};
2607 static const int masks[] = {0x00, 0x7f, 0x1f, 0x0f, 0x07};
2608 static const uint32_t mins[] = {4194304, 0, 128, 2048, 65536};
2609 static const int shiftc[] = {0, 18, 12, 6, 0};
2610 static const int shifte[] = {0, 6, 4, 2, 0};
2612 auto s =
reinterpret_cast<const unsigned char*
>(buf);
2613 int len = lengths[
s[0] >> 3];
2618 const char*
next = buf + len + !len;
2622 *c = uint32_t(s[0] & masks[len]) << 18;
2623 *c |= uint32_t(s[1] & 0x3f) << 12;
2624 *c |= uint32_t(s[2] & 0x3f) << 6;
2625 *c |= uint32_t(s[3] & 0x3f) << 0;
2629 *e = (*c < mins[len]) << 6;
2630 *e |= ((*c >> 11) == 0x1b) << 7;
2631 *e |= (*c > 0x10FFFF) << 8;
2632 *e |= (s[1] & 0xc0) >> 2;
2633 *e |= (s[2] & 0xc0) >> 4;
2649 h.
format(parse_ctx, format_ctx);
2664 for (
auto i = n.
bigits_.size();
i > 0; --
i) {
2680 auto transcode = [
this](
const char* p) {
2681 auto cp = uint32_t();
2686 buffer_.push_back(static_cast<wchar_t>(cp));
2689 buffer_.push_back(static_cast<wchar_t>(0xD800 + (cp >> 10)));
2690 buffer_.push_back(static_cast<wchar_t>(0xDC00 + (cp & 0x3FF)));
2695 const size_t block_size = 4;
2696 if (s.
size() >= block_size) {
2697 for (
auto end = p + s.
size() - block_size + 1; p < end;) p = transcode(p);
2699 if (
auto num_chars_left = s.
data() + s.
size() - p) {
2700 char buf[2 * block_size - 1] = {};
2705 }
while (p - buf < num_chars_left);
2707 buffer_.push_back(0);
2716 char* system_message = &buf[0];
2724 if (result != ERANGE)
2756 extern "C" __declspec(dllimport)
int __stdcall WriteConsoleW(
2757 void*,
const void*, dword, dword*,
void*);
2766 auto fd = _fileno(f);
2769 auto written = detail::dword();
2770 if (!detail::WriteConsoleW(reinterpret_cast<void*>(_get_osfhandle(fd)),
2771 u16.
c_str(),
static_cast<uint32_t
>(u16.
size()),
2772 &written,
nullptr)) {
2793 vprint(stdout, format_str, args);
2798 #endif // FMT_FORMAT_INL_H_
static const uint64_t powers_of_10_64[]
auto make_checked(T *p, size_t) -> T *
bool equal2(const Char *lhs, const char *rhs)
uint32_t umul96_upper32(uint32_t x, uint64_t y) FMT_NOEXCEPT
static const int16_t grisu_pow10_exponents[]
std::string operator()(basic_format_arg< format_context >::handle h) const
static const uint32_t dragonbox_pow10_recovery_errors[]
int floor_log2_pow10(int e) FMT_NOEXCEPT
void init(int err_code, string_view format_str, format_args args)
void run(class_loader::ClassLoader *loader)
FMT_FUNC void format_error_code(detail::buffer< char > &out, int error_code, string_view message) FMT_NOEXCEPT
bool operator==(fp x, fp y)
FMT_INLINE decimal_fp< T > shorter_interval_case(int exponent) FMT_NOEXCEPT
void try_reserve(size_t new_capacity)
typename std::conditional< B, T, F >::type conditional_t
bool divisible_by_power_of_2(uint32_t x, int exp) FMT_NOEXCEPT
constexpr auto begin() const FMT_NOEXCEPT -> iterator
span_CONFIG_SIZE_TYPE size_t
static FMT_CONSTEXPR_DECL const uint64_t implicit_bit
const wchar_t * c_str() const
static const uint64_t powers_of_5_64[]
void try_resize(size_t count)
uint32_t small_division_by_pow10(uint32_t n) FMT_NOEXCEPT
uint64_t umul96_lower64(uint32_t x, uint64_t y) FMT_NOEXCEPT
uint32_t divide_by_10_to_kappa_plus_1(uint32_t n) FMT_NOEXCEPT
static FMT_CONSTEXPR_DECL const int double_significand_size
size_t size() const FMT_NOEXCEPT
FMT_INLINE digits::result grisu_gen_digits(fp value, uint64_t error, int &exp, Handler &handler)
constexpr uint64_t high() const FMT_NOEXCEPT
#define FMT_CONSTEXPR_DECL
void fallback_format(Double d, int num_digits, bool binary32, buffer< char > &buf, int &exp10)
int floor_log10_pow2(int e) FMT_NOEXCEPT
basic_memory_buffer< bigit, bigits_capacity > bigits_
constexpr dragonbox::float_info< T >::carrier_uint exponent_mask()
constexpr auto size() const -> size_t
void vprint_mojibake(std::FILE *, basic_string_view< Char >, const Args &)
void fwrite_fully(const void *ptr, size_t size, size_t count, FILE *stream)
static const uint64_t log10_2_significand
#define FMT_END_NAMESPACE
FMT_FUNC int count_digits< 4 >(detail::fallback_uintptr n)
FMT_FUNC auto thousands_sep_impl(locale_ref loc) -> thousands_sep_result< Char >
basic_string_view< char > string_view
void(*)(detail::buffer< char > &, int, string_view) format_func
decimal_fp< T > to_decimal(T x) FMT_NOEXCEPT
fp get_cached_power(int min_exponent, int &pow10_exponent)
FMT_CONSTEXPR std::make_unsigned< Int >::type to_unsigned(Int value)
constexpr auto data() const -> const char *
buffer_appender< Char > vformat_to(buffer< Char > &buf, basic_string_view< Char > format_str, basic_format_args< FMT_BUFFER_CONTEXT(type_identity_t< Char >)> args)
FMT_CONSTEXPR_DECL FMT_INLINE auto visit_format_arg(Visitor &&vis, const basic_format_arg< Context > &arg) -> decltype(vis(0))
void push_back(const T &value)
int floor_log10_pow2_minus_log10_4_over_3(int e) FMT_NOEXCEPT
FMT_NORETURN FMT_API void on_error(const char *message)
#define assert(condition)
bool is_center_integer(typename float_info< T >::carrier_uint two_f, int exponent, int minus_k) FMT_NOEXCEPT
static FMT_CONSTEXPR_DECL const int value
static const uint64_t grisu_pow10_significands[]
std::basic_string< Char > vformat(basic_string_view< Char > format_str, basic_format_args< buffer_context< type_identity_t< Char >>> args)
bool divisible_by_power_of_5(uint32_t x, int exp) FMT_NOEXCEPT
uint64_t umul128_upper64(uint64_t x, uint64_t y) FMT_NOEXCEPT
FMT_CONSTEXPR auto utf8_decode(const char *s, uint32_t *c, int *e) -> const char *
bool check_divisibility_and_divide_by_pow5(uint32_t &n) FMT_NOEXCEPT
round_direction get_round_direction(uint64_t divisor, uint64_t remainder, uint64_t error)
static const uint128_wrapper dragonbox_pow10_significands_128[]
FMT_INLINE std::basic_string< Char > format(const S &format_str, Args &&... args)
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
int format_float(T value, int precision, float_specs specs, buffer< char > &buf)
static const divtest_table_entry< uint32_t > divtest_table_for_pow5_32[]
detail::named_arg< Char, T > arg(const Char *name, const T &arg)
const T & first(const T &value, const Tail &...)
int snprintf_float(T value, int precision, float_specs specs, buffer< char > &buf)
auto bit_cast(const Source &source) -> Dest
typename basic_string_view< Char >::iterator iterator
static FMT_CONSTEXPR_DECL const int bigit_bits
constexpr uint64_t low() const FMT_NOEXCEPT
int safe_strerror(int error_code, char *&buffer, size_t buffer_size) FMT_NOEXCEPT
uint64_t umul192_upper64(uint64_t x, uint128_wrapper y) FMT_NOEXCEPT
uint128_wrapper umul128(uint64_t x, uint64_t y) FMT_NOEXCEPT
FMT_FUNC void report_error(format_func func, int error_code, const char *message) FMT_NOEXCEPT
bool is_endpoint_integer(typename float_info< T >::carrier_uint two_f, int exponent, int minus_k) FMT_NOEXCEPT
FMT_INLINE std::string operator()(T value) const
FMT_INLINE int remove_trailing_zeros(uint32_t &n) FMT_NOEXCEPT
void resize(size_t count)
span_constexpr std::size_t size(span< T, Extent > const &spn)
bool is_left_endpoint_integer_shorter_interval(int exponent) FMT_NOEXCEPT
#define FMT_ASSERT(condition, message)
#define FMT_BEGIN_NAMESPACE
FMT_CONSTEXPR auto out() -> iterator
FMT_FUNC std::string grouping_impl(locale_ref loc)
FMT_CONSTEXPR bool is_negative(T value)
static const divtest_table_entry< uint64_t > divtest_table_for_pow5_64[]
std::integral_constant< bool, B > bool_constant
uint64_t multiply(uint64_t lhs, uint64_t rhs)
uint64_t umul192_middle64(uint64_t x, uint128_wrapper y) FMT_NOEXCEPT
FMT_API utf8_to_utf16(string_view s)
OutputIt format_to(OutputIt out, const S &format_str, Args &&... args)
FMT_FUNC void assert_fail(const char *file, int line, const char *message)
static FMT_CONSTEXPR_DECL const int significand_size
~system_error() FMT_NOEXCEPT FMT_OVERRIDE
FMT_FUNC Char decimal_point_impl(locale_ref loc)
int count_digits(uint64_t n)
size_t capacity() const FMT_NOEXCEPT
static const uint64_t dragonbox_pow10_significands_64[]