243 auto const cSmall = std::to_array<Case>({
244 {
Number{1'000'000'000'000'000, -15},
245 Number{6'555'555'555'555'555, -29},
246 Number{1'000'000'000'000'066, -15},
248 {
Number{-1'000'000'000'000'000, -15},
249 Number{-6'555'555'555'555'555, -29},
250 Number{-1'000'000'000'000'066, -15},
252 {
Number{-1'000'000'000'000'000, -15},
253 Number{6'555'555'555'555'555, -29},
254 Number{-9'999'999'999'999'344, -16},
256 {
Number{-6'555'555'555'555'555, -29},
257 Number{1'000'000'000'000'000, -15},
258 Number{9'999'999'999'999'344, -16},
262 {
Number{5'555'555'555'555'555, -32768},
263 Number{-5'555'555'555'555'554, -32768},
266 {
Number{-9'999'999'999'999'999, -31},
267 Number{1'000'000'000'000'000, -15},
268 Number{9'999'999'999'999'990, -16},
271 auto const cLarge = std::to_array<Case>(
276 {
Number{1'000'000'000'000'000, -15},
277 Number{6'555'555'555'555'555, -29},
278 Number{1'000'000'000'000'065'556, -18},
280 {
Number{-1'000'000'000'000'000, -15},
281 Number{-6'555'555'555'555'555, -29},
282 Number{-1'000'000'000'000'065'556, -18},
284 {
Number{-1'000'000'000'000'000, -15},
285 Number{6'555'555'555'555'555, -29},
288 {
Number{-6'555'555'555'555'555, -29},
289 Number{1'000'000'000'000'000, -15},
294 {
Number{5'555'555'555'555'555'000, -32768},
295 Number{-5'555'555'555'555'554'000, -32768},
298 {
Number{-9'999'999'999'999'999, -31},
299 Number{1'000'000'000'000'000, -15},
300 Number{9'999'999'999'999'990, -16},
303 {
Number{1'000'000'000'000'000'000, -18},
304 Number{6'555'555'555'555'555'555, -35},
305 Number{1'000'000'000'000'000'066, -18},
307 {
Number{-1'000'000'000'000'000'000, -18},
308 Number{-6'555'555'555'555'555'555, -35},
309 Number{-1'000'000'000'000'000'066, -18},
311 {
Number{-1'000'000'000'000'000'000, -18},
312 Number{6'555'555'555'555'555'555, -35},
315 {
Number{-6'555'555'555'555'555'555, -35},
316 Number{1'000'000'000'000'000'000, -18},
320 {
Number{5'555'555'555'555'555'555, -32768},
321 Number{-5'555'555'555'555'555'554, -32768},
325 Number{1'000'000'000'000'000'000, -18},
350 auto const cLargeLegacy = std::to_array<Case>({
353 auto const cLarge320 = std::to_array<Case>({
359 auto const cLargeCorrected = std::to_array<Case>({
362 auto test = [](
auto const& c) {
363 for (
auto const& [x, y, z, line] : c)
365 auto const result = x + y;
367 ss << x <<
" + " << y <<
" = " << result <<
". Expected: " << z;
368 EXPECT_EQ(result, z) << ss.
str() <<
" Line: " << line;
388 test(cLargeCorrected);
394 auto const cBigNums = std::to_array<Case>({
583 auto const cSmall = std::to_array<Case>(
584 {{
Number{1'000'000'000'000'000, -15},
585 Number{6'555'555'555'555'555, -29},
586 Number{9'999'999'999'999'344, -16},
588 {
Number{6'555'555'555'555'555, -29},
589 Number{1'000'000'000'000'000, -15},
590 Number{-9'999'999'999'999'344, -16},
592 {
Number{1'000'000'000'000'000, -15},
593 Number{1'000'000'000'000'000, -15},
596 {
Number{1'000'000'000'000'000, -15},
597 Number{1'000'000'000'000'001, -15},
598 Number{-1'000'000'000'000'000, -30},
600 {
Number{1'000'000'000'000'001, -15},
601 Number{1'000'000'000'000'000, -15},
602 Number{1'000'000'000'000'000, -30},
604 auto const cLargeAll = std::to_array<Case>(
609 {
Number{1'000'000'000'000'000, -15},
610 Number{6'555'555'555'555'555, -29},
613 {
Number{6'555'555'555'555'555, -29},
614 Number{1'000'000'000'000'000, -15},
617 {
Number{1'000'000'000'000'000, -15},
618 Number{1'000'000'000'000'000, -15},
621 {
Number{1'000'000'000'000'000, -15},
622 Number{1'000'000'000'000'001, -15},
623 Number{-1'000'000'000'000'000, -30},
625 {
Number{1'000'000'000'000'001, -15},
626 Number{1'000'000'000'000'000, -15},
627 Number{1'000'000'000'000'000, -30},
630 {
Number{1'000'000'000'000'000'000, -18},
631 Number{6'555'555'555'555'555'555, -32},
634 {
Number{6'555'555'555'555'555'555, -32},
635 Number{1'000'000'000'000'000'000, -18},
638 {
Number{1'000'000'000'000'000'000, -18},
639 Number{1'000'000'000'000'000'000, -18},
642 {
Number{1'000'000'000'000'000'000, -18},
643 Number{1'000'000'000'000'000'001, -18},
644 Number{-1'000'000'000'000'000'000, -36},
646 {
Number{1'000'000'000'000'000'001, -18},
647 Number{1'000'000'000'000'000'000, -18},
648 Number{1'000'000'000'000'000'000, -36},
655 auto const cLarge = std::to_array<Case>({
675 auto const cLarge330 = std::to_array<Case>({
700 auto test = [](
auto const& c) {
701 for (
auto const& [x, y, z, line] : c)
703 auto const result = x - y;
705 ss << x <<
" - " << y <<
" = " << result <<
". Expected: " << z;
706 EXPECT_EQ(result, z) << ss.
str() <<
" Line: " << line;
739 auto test = [](
auto const& c) {
740 for (
auto const& [x, y, z] : c)
742 auto const result = x * y;
744 ss << x <<
" * " << y <<
" = " << result <<
". Expected: " << z;
745 EXPECT_EQ(result, z) << ss.
str();
748 auto tests = [&](
auto const& cSmall,
auto const& cLarge) {
762 auto const cSmall = std::to_array<Case>({
764 {
Number{1414213562373095, -15},
765 Number{1414213562373095, -15},
766 Number{2000000000000000, -15}},
767 {
Number{-1414213562373095, -15},
768 Number{1414213562373095, -15},
769 Number{-2000000000000000, -15}},
770 {
Number{-1414213562373095, -15},
771 Number{-1414213562373095, -15},
772 Number{2000000000000000, -15}},
773 {
Number{3214285714285706, -15},
774 Number{3111111111111119, -15},
775 Number{1000000000000000, -14}},
778 {
Number{9'999'999'999'999'999, 0},
779 Number{9'999'999'999'999'999, 0},
780 Number{9'999'999'999'999'998, 16}},
782 auto const cLarge = std::to_array<Case>({
787 {
Number{1414213562373095, -15},
788 Number{1414213562373095, -15},
789 Number{1999999999999999862, -18}},
790 {
Number{-1414213562373095, -15},
791 Number{1414213562373095, -15},
792 Number{-1999999999999999862, -18}},
793 {
Number{-1414213562373095, -15},
794 Number{-1414213562373095, -15},
795 Number{1999999999999999862, -18}},
796 {
Number{3214285714285706, -15},
797 Number{3111111111111119, -15},
799 {
Number{1000000000000000000, -32768},
800 Number{1000000000000000000, -32768},
805 {
Number{1414213562373095049, -18},
806 Number{1414213562373095049, -18},
807 Number{2000000000000000001, -18}},
808 {
Number{-1414213562373095048, -18},
809 Number{1414213562373095048, -18},
810 Number{-1999999999999999998, -18}},
811 {
Number{-1414213562373095048, -18},
812 Number{-1414213562373095049, -18},
813 Number{1999999999999999999, -18}},
822 Number{85'070'591'730'234'615'85, 19}},
824 tests(cSmall, cLarge);
828 auto const cSmall = std::to_array<Case>(
830 {
Number{1414213562373095, -15},
831 Number{1414213562373095, -15},
832 Number{1999999999999999, -15}},
833 {
Number{-1414213562373095, -15},
834 Number{1414213562373095, -15},
835 Number{-1999999999999999, -15}},
836 {
Number{-1414213562373095, -15},
837 Number{-1414213562373095, -15},
838 Number{1999999999999999, -15}},
839 {
Number{3214285714285706, -15},
840 Number{3111111111111119, -15},
841 Number{9999999999999999, -15}},
843 auto const cLarge = std::to_array<Case>(
849 {
Number{1414213562373095, -15},
850 Number{1414213562373095, -15},
851 Number{1999999999999999861, -18}},
852 {
Number{-1414213562373095, -15},
853 Number{1414213562373095, -15},
854 Number{-1999999999999999861, -18}},
855 {
Number{-1414213562373095, -15},
856 Number{-1414213562373095, -15},
857 Number{1999999999999999861, -18}},
858 {
Number{3214285714285706, -15},
859 Number{3111111111111119, -15},
861 {
Number{1000000000000000000, -32768},
862 Number{1000000000000000000, -32768},
867 {
Number{1414213562373095049, -18},
868 Number{1414213562373095049, -18},
870 {
Number{-1414213562373095048, -18},
871 Number{1414213562373095048, -18},
872 Number{-1999999999999999997, -18}},
873 {
Number{-1414213562373095048, -18},
874 Number{-1414213562373095049, -18},
875 Number{1999999999999999999, -18}},
876 {
Number{3214285714285714278, -18},
877 Number{3111111111111111119, -18},
888 Number{85'070'591'730'234'615'84, 19}},
890 tests(cSmall, cLarge);
894 auto const cSmall = std::to_array<Case>(
896 {
Number{1414213562373095, -15},
897 Number{1414213562373095, -15},
898 Number{1999999999999999, -15}},
899 {
Number{-1414213562373095, -15},
900 Number{1414213562373095, -15},
901 Number{-2000000000000000, -15}},
902 {
Number{-1414213562373095, -15},
903 Number{-1414213562373095, -15},
904 Number{1999999999999999, -15}},
905 {
Number{3214285714285706, -15},
906 Number{3111111111111119, -15},
907 Number{9999999999999999, -15}},
909 auto const cLarge = std::to_array<Case>(
915 {
Number{1414213562373095, -15},
916 Number{1414213562373095, -15},
917 Number{1999999999999999861, -18}},
918 {
Number{-1414213562373095, -15},
919 Number{1414213562373095, -15},
920 Number{-1999999999999999862, -18}},
921 {
Number{-1414213562373095, -15},
922 Number{-1414213562373095, -15},
923 Number{1999999999999999861, -18}},
924 {
Number{3214285714285706, -15},
925 Number{3111111111111119, -15},
927 {
Number{1000000000000000000, -32768},
928 Number{1000000000000000000, -32768},
933 {
Number{1414213562373095049, -18},
934 Number{1414213562373095049, -18},
936 {
Number{-1414213562373095048, -18},
937 Number{1414213562373095048, -18},
938 Number{-1999999999999999998, -18}},
939 {
Number{-1414213562373095048, -18},
940 Number{-1414213562373095049, -18},
941 Number{1999999999999999999, -18}},
942 {
Number{3214285714285714278, -18},
943 Number{3111111111111111119, -18},
954 Number{85'070'591'730'234'615'84, 19}},
956 tests(cSmall, cLarge);
960 auto const cSmall = std::to_array<Case>(
962 {
Number{1414213562373095, -15},
963 Number{1414213562373095, -15},
964 Number{2000000000000000, -15}},
965 {
Number{-1414213562373095, -15},
966 Number{1414213562373095, -15},
967 Number{-1999999999999999, -15}},
968 {
Number{-1414213562373095, -15},
969 Number{-1414213562373095, -15},
970 Number{2000000000000000, -15}},
971 {
Number{3214285714285706, -15},
972 Number{3111111111111119, -15},
973 Number{1000000000000000, -14}},
975 auto const cLarge = std::to_array<Case>(
981 {
Number{1414213562373095, -15},
982 Number{1414213562373095, -15},
983 Number{1999999999999999862, -18}},
984 {
Number{-1414213562373095, -15},
985 Number{1414213562373095, -15},
986 Number{-1999999999999999861, -18}},
987 {
Number{-1414213562373095, -15},
988 Number{-1414213562373095, -15},
989 Number{1999999999999999862, -18}},
990 {
Number{3214285714285706, -15},
991 Number{3111111111111119, -15},
992 Number{999999999999999958, -17}},
993 {
Number{1000000000000000000, -32768},
994 Number{1000000000000000000, -32768},
999 {
Number{1414213562373095049, -18},
1000 Number{1414213562373095049, -18},
1001 Number{2000000000000000001, -18}},
1002 {
Number{-1414213562373095048, -18},
1003 Number{1414213562373095048, -18},
1004 Number{-1999999999999999997, -18}},
1005 {
Number{-1414213562373095048, -18},
1006 Number{-1414213562373095049, -18},
1008 {
Number{3214285714285714278, -18},
1009 Number{3111111111111111119, -18},
1010 Number{1000000000000000001, -17}},
1020 Number{85'070'591'730'234'615'85, 19}},
1022 tests(cSmall, cLarge);
1025 bool caught =
false;
1035 EXPECT_TRUE(caught);
1049 auto test = [](
auto const& c) {
1050 for (
auto const& [x, y, z] : c)
1052 auto const result = x / y;
1054 ss << x <<
" / " << y <<
" = " << result <<
". Expected: " << z;
1055 EXPECT_EQ(result, z) << ss.
str();
1059 auto tests = [&](
auto const& cSmall,
auto const& cLarge) {
1071 auto const cSmall = std::to_array<Case>(
1077 {
Number{9'999'999'999'999'999},
1078 Number{1'000'000'000'000'000},
1079 Number{9'999'999'999'999'999, -15}},
1083 auto const cLarge = std::to_array<Case>(
1092 {
Number{9'999'999'999'999'999},
1093 Number{1'000'000'000'000'000},
1094 Number{9'999'999'999'999'999, -15}},
1102 Number{1'000'000'000'000'000'000},
1104 tests(cSmall, cLarge);
1108 auto const cSmall = std::to_array<Case>(
1114 {
Number{9'999'999'999'999'999},
1115 Number{1'000'000'000'000'000},
1116 Number{9'999'999'999'999'999, -15}},
1120 auto const cLarge = std::to_array<Case>(
1129 {
Number{9'999'999'999'999'999},
1130 Number{1'000'000'000'000'000},
1131 Number{9'999'999'999'999'999, -15}},
1139 Number{1'000'000'000'000'000'000},
1141 tests(cSmall, cLarge);
1145 auto const cSmall = std::to_array<Case>(
1151 {
Number{9'999'999'999'999'999},
1152 Number{1'000'000'000'000'000},
1153 Number{9'999'999'999'999'999, -15}},
1157 auto const cLarge = std::to_array<Case>(
1166 {
Number{9'999'999'999'999'999},
1167 Number{1'000'000'000'000'000},
1168 Number{9'999'999'999'999'999, -15}},
1176 Number{1'000'000'000'000'000'000},
1178 tests(cSmall, cLarge);
1182 auto const cSmall = std::to_array<Case>(
1188 {
Number{9'999'999'999'999'999},
1189 Number{1'000'000'000'000'000},
1190 Number{9'999'999'999'999'999, -15}},
1194 auto const cLarge = std::to_array<Case>(
1203 {
Number{9'999'999'999'999'999},
1204 Number{1'000'000'000'000'000},
1205 Number{9'999'999'999'999'999, -15}},
1213 Number{1'000'000'000'000'000'000},
1215 tests(cSmall, cLarge);
1217 bool caught =
false;
1226 EXPECT_TRUE(caught);