230 auto const cSmall = std::to_array<Case>({
231 {
Number{1'000'000'000'000'000, -15},
232 Number{6'555'555'555'555'555, -29},
233 Number{1'000'000'000'000'066, -15},
235 {
Number{-1'000'000'000'000'000, -15},
236 Number{-6'555'555'555'555'555, -29},
237 Number{-1'000'000'000'000'066, -15},
239 {
Number{-1'000'000'000'000'000, -15},
240 Number{6'555'555'555'555'555, -29},
241 Number{-9'999'999'999'999'344, -16},
243 {
Number{-6'555'555'555'555'555, -29},
244 Number{1'000'000'000'000'000, -15},
245 Number{9'999'999'999'999'344, -16},
249 {
Number{5'555'555'555'555'555, -32768},
250 Number{-5'555'555'555'555'554, -32768},
253 {
Number{-9'999'999'999'999'999, -31},
254 Number{1'000'000'000'000'000, -15},
255 Number{9'999'999'999'999'990, -16},
258 auto const cLarge = std::to_array<Case>(
263 {
Number{1'000'000'000'000'000, -15},
264 Number{6'555'555'555'555'555, -29},
265 Number{1'000'000'000'000'065'556, -18},
267 {
Number{-1'000'000'000'000'000, -15},
268 Number{-6'555'555'555'555'555, -29},
269 Number{-1'000'000'000'000'065'556, -18},
271 {
Number{-1'000'000'000'000'000, -15},
272 Number{6'555'555'555'555'555, -29},
275 {
Number{-6'555'555'555'555'555, -29},
276 Number{1'000'000'000'000'000, -15},
281 {
Number{5'555'555'555'555'555'000, -32768},
282 Number{-5'555'555'555'555'554'000, -32768},
285 {
Number{-9'999'999'999'999'999, -31},
286 Number{1'000'000'000'000'000, -15},
287 Number{9'999'999'999'999'990, -16},
290 {
Number{1'000'000'000'000'000'000, -18},
291 Number{6'555'555'555'555'555'555, -35},
292 Number{1'000'000'000'000'000'066, -18},
294 {
Number{-1'000'000'000'000'000'000, -18},
295 Number{-6'555'555'555'555'555'555, -35},
296 Number{-1'000'000'000'000'000'066, -18},
298 {
Number{-1'000'000'000'000'000'000, -18},
299 Number{6'555'555'555'555'555'555, -35},
302 {
Number{-6'555'555'555'555'555'555, -35},
303 Number{1'000'000'000'000'000'000, -18},
307 {
Number{5'555'555'555'555'555'555, -32768},
308 Number{-5'555'555'555'555'555'554, -32768},
312 Number{1'000'000'000'000'000'000, -18},
337 auto const cLargeLegacy = std::to_array<Case>({
340 auto const cLarge320 = std::to_array<Case>({
346 auto const cLargeCorrected = std::to_array<Case>({
349 auto test = [](
auto const& c) {
350 for (
auto const& [x, y, z, line] : c)
352 auto const result = x + y;
354 ss << x <<
" + " << y <<
" = " << result <<
". Expected: " << z;
355 EXPECT_EQ(result, z) << ss.
str() <<
" Line: " << line;
375 test(cLargeCorrected);
381 auto const cBigNums = std::to_array<Case>({
418 auto const cSmall = std::to_array<Case>(
419 {{
Number{1'000'000'000'000'000, -15},
420 Number{6'555'555'555'555'555, -29},
421 Number{9'999'999'999'999'344, -16},
423 {
Number{6'555'555'555'555'555, -29},
424 Number{1'000'000'000'000'000, -15},
425 Number{-9'999'999'999'999'344, -16},
427 {
Number{1'000'000'000'000'000, -15},
428 Number{1'000'000'000'000'000, -15},
431 {
Number{1'000'000'000'000'000, -15},
432 Number{1'000'000'000'000'001, -15},
433 Number{-1'000'000'000'000'000, -30},
435 {
Number{1'000'000'000'000'001, -15},
436 Number{1'000'000'000'000'000, -15},
437 Number{1'000'000'000'000'000, -30},
439 auto const cLargeAll = std::to_array<Case>(
444 {
Number{1'000'000'000'000'000, -15},
445 Number{6'555'555'555'555'555, -29},
448 {
Number{6'555'555'555'555'555, -29},
449 Number{1'000'000'000'000'000, -15},
452 {
Number{1'000'000'000'000'000, -15},
453 Number{1'000'000'000'000'000, -15},
456 {
Number{1'000'000'000'000'000, -15},
457 Number{1'000'000'000'000'001, -15},
458 Number{-1'000'000'000'000'000, -30},
460 {
Number{1'000'000'000'000'001, -15},
461 Number{1'000'000'000'000'000, -15},
462 Number{1'000'000'000'000'000, -30},
465 {
Number{1'000'000'000'000'000'000, -18},
466 Number{6'555'555'555'555'555'555, -32},
469 {
Number{6'555'555'555'555'555'555, -32},
470 Number{1'000'000'000'000'000'000, -18},
473 {
Number{1'000'000'000'000'000'000, -18},
474 Number{1'000'000'000'000'000'000, -18},
477 {
Number{1'000'000'000'000'000'000, -18},
478 Number{1'000'000'000'000'000'001, -18},
479 Number{-1'000'000'000'000'000'000, -36},
481 {
Number{1'000'000'000'000'000'001, -18},
482 Number{1'000'000'000'000'000'000, -18},
483 Number{1'000'000'000'000'000'000, -36},
490 auto const cLarge = std::to_array<Case>({
510 auto const cLarge330 = std::to_array<Case>({
535 auto test = [](
auto const& c) {
536 for (
auto const& [x, y, z, line] : c)
538 auto const result = x - y;
540 ss << x <<
" - " << y <<
" = " << result <<
". Expected: " << z;
541 EXPECT_EQ(result, z) << ss.
str() <<
" Line: " << line;
574 auto test = [](
auto const& c) {
575 for (
auto const& [x, y, z] : c)
577 auto const result = x * y;
579 ss << x <<
" * " << y <<
" = " << result <<
". Expected: " << z;
580 EXPECT_EQ(result, z) << ss.
str();
583 auto tests = [&](
auto const& cSmall,
auto const& cLarge) {
597 auto const cSmall = std::to_array<Case>({
599 {
Number{1414213562373095, -15},
600 Number{1414213562373095, -15},
601 Number{2000000000000000, -15}},
602 {
Number{-1414213562373095, -15},
603 Number{1414213562373095, -15},
604 Number{-2000000000000000, -15}},
605 {
Number{-1414213562373095, -15},
606 Number{-1414213562373095, -15},
607 Number{2000000000000000, -15}},
608 {
Number{3214285714285706, -15},
609 Number{3111111111111119, -15},
610 Number{1000000000000000, -14}},
613 {
Number{9'999'999'999'999'999, 0},
614 Number{9'999'999'999'999'999, 0},
615 Number{9'999'999'999'999'998, 16}},
617 auto const cLarge = std::to_array<Case>({
622 {
Number{1414213562373095, -15},
623 Number{1414213562373095, -15},
624 Number{1999999999999999862, -18}},
625 {
Number{-1414213562373095, -15},
626 Number{1414213562373095, -15},
627 Number{-1999999999999999862, -18}},
628 {
Number{-1414213562373095, -15},
629 Number{-1414213562373095, -15},
630 Number{1999999999999999862, -18}},
631 {
Number{3214285714285706, -15},
632 Number{3111111111111119, -15},
634 {
Number{1000000000000000000, -32768},
635 Number{1000000000000000000, -32768},
640 {
Number{1414213562373095049, -18},
641 Number{1414213562373095049, -18},
642 Number{2000000000000000001, -18}},
643 {
Number{-1414213562373095048, -18},
644 Number{1414213562373095048, -18},
645 Number{-1999999999999999998, -18}},
646 {
Number{-1414213562373095048, -18},
647 Number{-1414213562373095049, -18},
648 Number{1999999999999999999, -18}},
657 Number{85'070'591'730'234'615'85, 19}},
659 tests(cSmall, cLarge);
663 auto const cSmall = std::to_array<Case>(
665 {
Number{1414213562373095, -15},
666 Number{1414213562373095, -15},
667 Number{1999999999999999, -15}},
668 {
Number{-1414213562373095, -15},
669 Number{1414213562373095, -15},
670 Number{-1999999999999999, -15}},
671 {
Number{-1414213562373095, -15},
672 Number{-1414213562373095, -15},
673 Number{1999999999999999, -15}},
674 {
Number{3214285714285706, -15},
675 Number{3111111111111119, -15},
676 Number{9999999999999999, -15}},
678 auto const cLarge = std::to_array<Case>(
684 {
Number{1414213562373095, -15},
685 Number{1414213562373095, -15},
686 Number{1999999999999999861, -18}},
687 {
Number{-1414213562373095, -15},
688 Number{1414213562373095, -15},
689 Number{-1999999999999999861, -18}},
690 {
Number{-1414213562373095, -15},
691 Number{-1414213562373095, -15},
692 Number{1999999999999999861, -18}},
693 {
Number{3214285714285706, -15},
694 Number{3111111111111119, -15},
696 {
Number{1000000000000000000, -32768},
697 Number{1000000000000000000, -32768},
702 {
Number{1414213562373095049, -18},
703 Number{1414213562373095049, -18},
705 {
Number{-1414213562373095048, -18},
706 Number{1414213562373095048, -18},
707 Number{-1999999999999999997, -18}},
708 {
Number{-1414213562373095048, -18},
709 Number{-1414213562373095049, -18},
710 Number{1999999999999999999, -18}},
711 {
Number{3214285714285714278, -18},
712 Number{3111111111111111119, -18},
723 Number{85'070'591'730'234'615'84, 19}},
725 tests(cSmall, cLarge);
729 auto const cSmall = std::to_array<Case>(
731 {
Number{1414213562373095, -15},
732 Number{1414213562373095, -15},
733 Number{1999999999999999, -15}},
734 {
Number{-1414213562373095, -15},
735 Number{1414213562373095, -15},
736 Number{-2000000000000000, -15}},
737 {
Number{-1414213562373095, -15},
738 Number{-1414213562373095, -15},
739 Number{1999999999999999, -15}},
740 {
Number{3214285714285706, -15},
741 Number{3111111111111119, -15},
742 Number{9999999999999999, -15}},
744 auto const cLarge = std::to_array<Case>(
750 {
Number{1414213562373095, -15},
751 Number{1414213562373095, -15},
752 Number{1999999999999999861, -18}},
753 {
Number{-1414213562373095, -15},
754 Number{1414213562373095, -15},
755 Number{-1999999999999999862, -18}},
756 {
Number{-1414213562373095, -15},
757 Number{-1414213562373095, -15},
758 Number{1999999999999999861, -18}},
759 {
Number{3214285714285706, -15},
760 Number{3111111111111119, -15},
762 {
Number{1000000000000000000, -32768},
763 Number{1000000000000000000, -32768},
768 {
Number{1414213562373095049, -18},
769 Number{1414213562373095049, -18},
771 {
Number{-1414213562373095048, -18},
772 Number{1414213562373095048, -18},
773 Number{-1999999999999999998, -18}},
774 {
Number{-1414213562373095048, -18},
775 Number{-1414213562373095049, -18},
776 Number{1999999999999999999, -18}},
777 {
Number{3214285714285714278, -18},
778 Number{3111111111111111119, -18},
789 Number{85'070'591'730'234'615'84, 19}},
791 tests(cSmall, cLarge);
795 auto const cSmall = std::to_array<Case>(
797 {
Number{1414213562373095, -15},
798 Number{1414213562373095, -15},
799 Number{2000000000000000, -15}},
800 {
Number{-1414213562373095, -15},
801 Number{1414213562373095, -15},
802 Number{-1999999999999999, -15}},
803 {
Number{-1414213562373095, -15},
804 Number{-1414213562373095, -15},
805 Number{2000000000000000, -15}},
806 {
Number{3214285714285706, -15},
807 Number{3111111111111119, -15},
808 Number{1000000000000000, -14}},
810 auto const cLarge = std::to_array<Case>(
816 {
Number{1414213562373095, -15},
817 Number{1414213562373095, -15},
818 Number{1999999999999999862, -18}},
819 {
Number{-1414213562373095, -15},
820 Number{1414213562373095, -15},
821 Number{-1999999999999999861, -18}},
822 {
Number{-1414213562373095, -15},
823 Number{-1414213562373095, -15},
824 Number{1999999999999999862, -18}},
825 {
Number{3214285714285706, -15},
826 Number{3111111111111119, -15},
827 Number{999999999999999958, -17}},
828 {
Number{1000000000000000000, -32768},
829 Number{1000000000000000000, -32768},
834 {
Number{1414213562373095049, -18},
835 Number{1414213562373095049, -18},
836 Number{2000000000000000001, -18}},
837 {
Number{-1414213562373095048, -18},
838 Number{1414213562373095048, -18},
839 Number{-1999999999999999997, -18}},
840 {
Number{-1414213562373095048, -18},
841 Number{-1414213562373095049, -18},
843 {
Number{3214285714285714278, -18},
844 Number{3111111111111111119, -18},
845 Number{1000000000000000001, -17}},
855 Number{85'070'591'730'234'615'85, 19}},
857 tests(cSmall, cLarge);
884 auto test = [](
auto const& c) {
885 for (
auto const& [x, y, z] : c)
887 auto const result = x / y;
889 ss << x <<
" / " << y <<
" = " << result <<
". Expected: " << z;
890 EXPECT_EQ(result, z) << ss.
str();
894 auto tests = [&](
auto const& cSmall,
auto const& cLarge) {
906 auto const cSmall = std::to_array<Case>(
912 {
Number{9'999'999'999'999'999},
913 Number{1'000'000'000'000'000},
914 Number{9'999'999'999'999'999, -15}},
918 auto const cLarge = std::to_array<Case>(
927 {
Number{9'999'999'999'999'999},
928 Number{1'000'000'000'000'000},
929 Number{9'999'999'999'999'999, -15}},
937 Number{1'000'000'000'000'000'000},
939 tests(cSmall, cLarge);
943 auto const cSmall = std::to_array<Case>(
949 {
Number{9'999'999'999'999'999},
950 Number{1'000'000'000'000'000},
951 Number{9'999'999'999'999'999, -15}},
955 auto const cLarge = std::to_array<Case>(
964 {
Number{9'999'999'999'999'999},
965 Number{1'000'000'000'000'000},
966 Number{9'999'999'999'999'999, -15}},
974 Number{1'000'000'000'000'000'000},
976 tests(cSmall, cLarge);
980 auto const cSmall = std::to_array<Case>(
986 {
Number{9'999'999'999'999'999},
987 Number{1'000'000'000'000'000},
988 Number{9'999'999'999'999'999, -15}},
992 auto const cLarge = std::to_array<Case>(
1001 {
Number{9'999'999'999'999'999},
1002 Number{1'000'000'000'000'000},
1003 Number{9'999'999'999'999'999, -15}},
1011 Number{1'000'000'000'000'000'000},
1013 tests(cSmall, cLarge);
1017 auto const cSmall = std::to_array<Case>(
1023 {
Number{9'999'999'999'999'999},
1024 Number{1'000'000'000'000'000},
1025 Number{9'999'999'999'999'999, -15}},
1029 auto const cLarge = std::to_array<Case>(
1038 {
Number{9'999'999'999'999'999},
1039 Number{1'000'000'000'000'000},
1040 Number{9'999'999'999'999'999, -15}},
1048 Number{1'000'000'000'000'000'000},
1050 tests(cSmall, cLarge);
1052 bool caught =
false;
1061 EXPECT_TRUE(caught);