20 #include "ns3/int64x64.h" 22 #include "ns3/valgrind.h" 69 Printer (
const int64_t high,
const uint64_t low)
85 m_low (value.GetLow ())
108 os << std::fixed << std::setprecision (22)
113 os << std::hex << std::setfill (
'0')
114 <<
" (0x" << std::setw (16) << p.
m_high 115 <<
" 0x" << std::setw (16) << p.
m_low <<
")" 116 << std::dec << std::setfill (
' ');
125 virtual void DoRun (
void);
126 void Check (
const int64_t hi,
const uint64_t lo);
130 :
TestCase (
"Manipulate the high and low part of every number")
137 uint64_t tolerance = 0;
145 uint64_t vLow = value.
GetLow ();
146 bool pass = ( (value.
GetHigh () == hi)
147 && ( (
Max (vLow, lo) -
Min (vLow, lo)) <= tolerance)
151 << (pass ?
"pass " :
"FAIL ")
156 "High part does not match for hi:" << hi
159 "Low part does not match for hi: " << hi
166 std::cout << std::endl;
179 Check ( 0, 0xffffffffffffffffULL - low);
183 Check ( 1, 0xffffffffffffffffULL - low);
187 Check (-1, 0xffffffffffffffffULL - low);
195 virtual void DoRun (
void);
196 void Check (
const std::string & str,
197 const int64_t hi,
const uint64_t lo,
198 const int64_t tolerance = 0);
201 :
TestCase (
"Parse int64x64_t numbers as strings")
206 const int64_t hi,
const uint64_t lo,
207 const int64_t tolerance )
210 std::istringstream iss;
215 std::string input =
"\"" + str +
"\"";
216 uint64_t vLow = value.
GetLow ();
217 bool pass = ( (value.GetHigh () == hi) &&
218 (
Max (vLow, lo) -
Min (vLow, lo) <= tolerance)
222 << (pass ?
"pass " :
"FAIL ")
223 << std::left << std::setw (28) << input << std::right
225 <<
" expected: " <<
Printer (hi, lo) <<
" +/- " << tolerance
229 "High parts do not match for input string \"" 232 "Low parts do not match for input string \"" 238 std::cout << std::endl;
242 int64_t tolerance = 0;
253 Check (
"+1.0", 1, 0);
254 Check (
"001.0", 1, 0);
255 Check (
"+001.0", 1, 0);
256 Check (
"020.0", 20, 0);
257 Check (
"+020.0", 20, 0);
258 Check (
"1.0000000", 1, 0);
259 Check (
"-1.0", -1, 0, tolerance);
260 Check (
"-1.0000", -1, 0, tolerance);
261 Check (
" 1.000000000000000000054", 1, 1, tolerance);
262 Check (
"-1.000000000000000000054", (int64_t)-2, (uint64_t)-1, tolerance);
270 virtual void DoRun (
void);
271 void Check (
const std::string & str,
272 const int64_t tolerance = 0);
275 :
TestCase (
"Roundtrip int64x64_t numbers as strings")
280 const int64_t tolerance )
282 std::stringstream iss (str);
286 std::stringstream oss;
287 oss << std::scientific << std::setprecision (21) << expect;
291 bool pass =
Abs (value - expect) <=
int64x64_t (0, tolerance + 1);
293 std::string input =
"\"" + str +
"\"";
294 std::string output =
"\"" + oss.str () +
"\"";
299 << (pass ?
"pass " :
"FAIL ")
300 <<
" in: " << std::left << std::setw (28) << input
301 <<
" out: " << std::left << std::setw (28) << output
308 << (pass ?
"pass " :
"FAIL ")
309 <<
" in: " << std::left << std::setw (28) << input
310 << std::right <<
Printer (expect)
313 << std::setw (19) <<
" " 314 <<
" out: " << std::left << std::setw (28) << output
315 << std::right <<
Printer (value)
320 "Converted string does not match expected string");
326 std::cout << std::endl;
330 int64_t tolerance = 0;
337 Check (
"+1.000000000000000000000");
338 Check (
"+20.000000000000000000000");
339 Check (
"+0.000000000000000000000", tolerance);
340 Check (
"-1.000000000000000000000", tolerance);
341 Check (
"+1.084467440737095516158", tolerance);
342 Check (
"-2.084467440737095516158", tolerance);
343 Check (
"+3.184467440737095516179", tolerance);
344 Check (
"-4.184467440737095516179", tolerance);
352 virtual void DoRun (
void);
353 void Check (
const int test,
355 void Check (
const int test,
361 :
TestCase (
"Basic arithmetic operations")
378 bool pass =
Abs (value - expect) <= tolerance;
381 << (pass ?
"pass " :
"FAIL ")
382 << test <<
": " << value <<
" == " << expect
383 <<
" (+/- " << tolerance <<
")" 387 "Arithmetic failure in test case " << test);
399 std::cout << std::endl;
406 Check ( 3, one - two , -one );
407 Check ( 4, one - (-one ), two );
408 Check ( 5, (-one ) - (-two ), one );
409 Check ( 6, (-one ) - two , -thre );
413 Check ( 9, one + one , two );
414 Check (10, one + two , thre );
416 Check (12, (-one ) + (-two ), -thre );
417 Check (13, (-one ) + two , one );
422 Check (17, one * one , one );
423 Check (18, one * (-one ), -one );
424 Check (19, (-one ) * (-one ), one );
426 Check (20, (two * thre ) / thre , two );
431 Check (21, frac, 0.75);
432 Check (22, fplf2, 1.3125);
439 Check (23, zerof, frac);
443 Check (25, zerof - onef, -one );
445 Check (27, onef - twof, -one );
446 Check (28, onef - (-onef), twof + frac );
447 Check (29 , (-onef) - (-twof), one );
448 Check (30 , (-onef) - twof, -thref - frac );
450 Check (31, zerof + zerof, zerof + frac );
451 Check (32, zerof + onef, onef + frac );
452 Check (33, onef + onef, twof + frac );
453 Check (34, onef + twof, thref + frac );
455 Check (36 , (-onef) + (-twof), -thref - frac );
456 Check (37, (-onef) + twof, one );
458 Check (38, zerof * zerof, frac * frac );
460 Check (40 , zerof * one, frac );
462 Check (41, zerof * onef, fplf2 );
463 Check (42, zerof * (-onef), -fplf2 );
464 Check (43, onef * onef, onef + fplf2 );
465 Check (44, onef * (-onef), -onef - fplf2 );
466 Check (45, (-onef) * (-onef), onef + fplf2 );
470 Check (46, (two * thre ) / thre , two );
471 Check (47, (twof * thref) / thref, twof );
474 Check (48, (two / thre) * thre, two , 2 * tol1 );
475 Check (49, (twof / thref) * thref, twof, 3 * tol1 );
481 int64x64_t (1999999999, 0xfffffffffffffffeULL));
498 virtual void DoRun (
void);
499 void Check (
const double result,
const double expect,
500 const std::string & msg);
504 :
TestCase (
"Test case for bug 455")
509 const std::string & msg)
511 bool pass = result == expect;
514 << (pass ?
"pass " :
"FAIL ")
516 <<
" exp: " << expect
526 std::cout << std::endl;
536 Check (a.GetDouble (), 2.5,
"Simple test for multiplication");
540 Check (a.GetDouble (), -2.5,
"Test sign, first operation negative");
544 Check (a.GetDouble (), 2.5,
"both operands negative");
548 Check (a.GetDouble (), -2.5,
"only second operand negative");
560 virtual void DoRun (
void);
561 void Check (
const double result,
const double expect,
562 const std::string & msg);
566 :
TestCase (
"Test case for bug 863")
571 const std::string & msg)
573 bool pass = result == expect;
576 << (pass ?
"pass " :
"FAIL ")
578 <<
" exp: " << expect
588 std::cout << std::endl;
598 Check (a.GetDouble (), 1.0,
"Simple test for division");
601 Check (a.GetDouble (), -0.5,
"Check that we actually convert doubles correctly");
604 Check (a.GetDouble (), -1.0,
"first argument negative");
608 Check (a.GetDouble (), -1.0,
"second argument negative");
612 Check (a.GetDouble (), 1.0,
"both arguments negative");
623 virtual void DoRun (
void);
624 void Check (
const uint64_t low,
const std::string & value,
625 const int64_t tolerance = 0);
629 :
TestCase (
"Test case for bug 1786")
634 const std::string & str,
635 const int64_t tolerance )
638 std::ostringstream oss;
639 oss << std::scientific << std::setprecision (22) << value;
643 bool pass = oss.str () == str;
646 << (pass ?
"pass " :
"FAIL ")
647 <<
" 0x" << std::hex << std::setw (16) << low << std::dec
648 <<
" = " << oss.str ();
651 std::cout <<
", expected " << str;
653 std::cout << std::endl;
656 "Fraction string not correct");
664 <<
" 0x" << std::hex << std::setw (16) << low << std::dec
665 <<
" = " << oss.str ()
666 <<
", expected " << str
674 std::cout << std::endl;
678 int64_t tolerance = 0;
689 Check ( 1ULL,
"+0.0000000000000000000542");
690 Check ( 2ULL,
"+0.0000000000000000001084");
691 Check ( 3ULL,
"+0.0000000000000000001626");
692 Check ( 4ULL,
"+0.0000000000000000002168");
693 Check ( 5ULL,
"+0.0000000000000000002710");
694 Check ( 6ULL,
"+0.0000000000000000003253");
695 Check ( 7ULL,
"+0.0000000000000000003795");
696 Check ( 8ULL,
"+0.0000000000000000004337");
697 Check ( 9ULL,
"+0.0000000000000000004879");
698 Check ( 0xAULL,
"+0.0000000000000000005421");
699 Check ( 0xFULL,
"+0.0000000000000000008132");
700 Check ( 0xF0ULL,
"+0.0000000000000000130104");
701 Check ( 0xF00ULL,
"+0.0000000000000002081668");
702 Check ( 0xF000ULL,
"+0.0000000000000033306691");
703 Check ( 0xF0000ULL,
"+0.0000000000000532907052");
704 Check ( 0xF00000ULL,
"+0.0000000000008526512829");
705 Check ( 0xF000000ULL,
"+0.0000000000136424205266");
706 Check ( 0xF0000000ULL,
"+0.0000000002182787284255");
707 Check ( 0xF00000000ULL,
"+0.0000000034924596548080");
708 Check ( 0xF000000000ULL,
"+0.0000000558793544769287");
709 Check ( 0xF0000000000ULL,
"+0.0000008940696716308594");
710 Check ( 0xF00000000000ULL,
"+0.0000143051147460937500");
711 Check ( 0xF000000000000ULL,
"+0.0002288818359375000000");
712 Check ( 0xF0000000000000ULL,
"+0.0036621093750000000000");
713 Check ( 0xF00000000000000ULL,
"+0.0585937500000000000000");
714 std::cout << std::endl;
715 Check (0x7FFFFFFFFFFFFFFDULL,
"+0.4999999999999999998374", tolerance);
716 Check (0x7FFFFFFFFFFFFFFEULL,
"+0.4999999999999999998916", tolerance);
717 Check (0x7FFFFFFFFFFFFFFFULL,
"+0.4999999999999999999458", tolerance);
718 Check (0x8000000000000000ULL,
"+0.5000000000000000000000");
719 Check (0x8000000000000001ULL,
"+0.5000000000000000000542", tolerance);
720 Check (0x8000000000000002ULL,
"+0.5000000000000000001084", tolerance);
721 Check (0x8000000000000003ULL,
"+0.5000000000000000001626", tolerance);
722 std::cout << std::endl;
723 Check (0xF000000000000000ULL,
"+0.9375000000000000000000");
724 Check (0xFF00000000000000ULL,
"+0.9960937500000000000000");
725 Check (0xFFF0000000000000ULL,
"+0.9997558593750000000000");
726 Check (0xFFFF000000000000ULL,
"+0.9999847412109375000000");
727 Check (0xFFFFF00000000000ULL,
"+0.9999990463256835937500");
728 Check (0xFFFFFF0000000000ULL,
"+0.9999999403953552246094");
729 Check (0xFFFFFFF000000000ULL,
"+0.9999999962747097015381");
730 Check (0xFFFFFFFF00000000ULL,
"+0.9999999997671693563461");
731 Check (0xFFFFFFFFF0000000ULL,
"+0.9999999999854480847716");
732 Check (0xFFFFFFFFFF000000ULL,
"+0.9999999999990905052982");
733 Check (0xFFFFFFFFFFF00000ULL,
"+0.9999999999999431565811");
734 Check (0xFFFFFFFFFFFF0000ULL,
"+0.9999999999999964472863");
735 Check (0xFFFFFFFFFFFFF000ULL,
"+0.9999999999999997779554");
736 Check (0xFFFFFFFFFFFFFF00ULL,
"+0.9999999999999999861222");
737 Check (0xFFFFFFFFFFFFFFF0ULL,
"+0.9999999999999999991326");
738 Check (0xFFFFFFFFFFFFFFF5ULL,
"+0.9999999999999999994037", tolerance);
739 Check (0xFFFFFFFFFFFFFFF6ULL,
"+0.9999999999999999994579", tolerance);
740 Check (0xFFFFFFFFFFFFFFF7ULL,
"+0.9999999999999999995121", tolerance);
741 Check (0xFFFFFFFFFFFFFFF8ULL,
"+0.9999999999999999995663", tolerance);
742 Check (0xFFFFFFFFFFFFFFF9ULL,
"+0.9999999999999999996205", tolerance);
743 Check (0xFFFFFFFFFFFFFFFAULL,
"+0.9999999999999999996747", tolerance);
744 Check (0xFFFFFFFFFFFFFFFBULL,
"+0.9999999999999999997289", tolerance);
745 Check (0xFFFFFFFFFFFFFFFCULL,
"+0.9999999999999999997832", tolerance);
746 Check (0xFFFFFFFFFFFFFFFDULL,
"+0.9999999999999999998374", tolerance);
747 Check (0xFFFFFFFFFFFFFFFEULL,
"+0.9999999999999999998916", tolerance);
748 Check (0xFFFFFFFFFFFFFFFFULL,
"+0.9999999999999999999458", tolerance);
756 virtual void DoRun (
void);
758 void Check (
const bool result,
const bool expect,
759 const std::string & msg);
762 :
TestCase (
"Basic compare operations")
767 const std::string & msg)
769 bool pass = result == expect;
772 << (pass ?
"pass " :
"FAIL ")
782 std::cout << std::endl;
797 Check ( zerof == zerof,
true,
"equality, zero");
798 Check ( onef == onef,
true,
"equality, positive");
799 Check ( mtwof == mtwof,
true,
"equality, negative");
800 Check (
zero == one,
false,
"equality false, zero");
801 Check ( one == two,
false,
"equality false, unsigned");
802 Check ( one == mone,
false,
"equality false, signed");
803 Check ( onef == one,
false,
"equality false, fraction");
804 std::cout << std::endl;
806 Check ( zerof != zerof,
false,
"inequality, zero");
807 Check ( onef != onef,
false,
"inequality, positive");
808 Check ( mtwof != mtwof,
false,
"inequality, negative");
809 Check (
zero != one,
true,
"inequality true, zero");
810 Check ( one != two,
true,
"inequality true, unsigned");
811 Check ( one != mone,
true,
"inequality true, signed");
812 Check ( onef != one,
true,
"inequality true, fraction");
813 std::cout << std::endl;
815 Check ( zerof < onef,
true,
"less, zerof");
816 Check (
zero < zerof,
true,
"less, zero");
817 Check ( one < onef,
true,
"less, positive");
818 Check ( monef < mone,
true,
"less, negative");
819 Check ( onef < one,
false,
"less, false, positive");
820 Check ( mtwo < mtwof,
false,
"less, false, negative");
821 std::cout << std::endl;
823 Check ( zerof <= zerof,
true,
"less equal, equal, zerof");
824 Check (
zero <= zerof,
true,
"less equal, less, zero");
825 Check ( onef <= onef,
true,
"less equal, equal, positive");
826 Check ( monef <= mone,
true,
"less equal, less, negative");
827 Check ( onef <= one,
false,
"less equal, false, positive");
828 Check ( mtwo <= mtwof,
false,
"less equal, false, negative");
829 std::cout << std::endl;
831 Check ( onef > zerof,
true,
"greater, zerof");
832 Check ( zerof >
zero,
true,
"greater, zero");
833 Check ( onef > one,
true,
"greater, positive");
834 Check ( mone > monef,
true,
"greater, negative");
835 Check ( one > onef,
false,
"greater, false, positive");
836 Check ( mtwof > mtwo,
false,
"greater, false, negative");
837 std::cout << std::endl;
839 Check ( zerof >= zerof,
true,
"greater equal, equal, zerof");
840 Check ( zerof >=
zero,
true,
"greater equal, greater, zero");
841 Check ( onef >= onef,
true,
"greater equal, equal, positive");
842 Check ( mone >= monef,
true,
"greater equal, greater, negative");
843 Check ( one >= onef,
false,
"greater equal, false, positive");
844 Check ( mtwof >= mtwo,
false,
"greater equal, false, negative");
845 std::cout << std::endl;
847 Check (
zero ==
false,
true,
"zero == false");
848 Check ( one ==
true,
true,
"one == true");
849 Check ( zerof !=
false,
true,
"zerof != false");
850 Check ( (!
zero) ==
true,
true,
"!zero == true");
851 Check ( (!zerof) ==
false,
true,
"!zerof == false");
852 Check ( (!one) ==
false,
true,
"!one == false");
853 Check ( (+onef) == onef,
true,
"unary positive");
854 Check ( (-onef) == monef,
true,
"unary negative");
862 virtual void DoRun (
void);
863 void Check (
const int64_t factor);
866 const std::string & msg,
867 const double tolerance = 0);
871 :
TestCase (
"Invert and MulByInvert")
878 const std::string & msg,
879 const double tolerance )
881 bool pass =
Abs (result - expect) <= tolerance;
887 std::cout <<
"pass: " << factor <<
": ";
892 std::cout <<
"FAIL: " << factor <<
": " 893 <<
"(res: " << result
894 <<
" exp: " << expect
895 <<
" tol: " << tolerance <<
") ";
912 double tolerance = 0;
916 tolerance = 0.000000000000000001L;
920 CheckCase (factor, b, one,
"x * x^-1 == 1", tolerance);
924 CheckCase (factor, c, factorI,
"1 * x^-1 == 1 / x");
932 CheckCase (factor, e, -one,
"-x * x^-1 == -1", tolerance);
938 std::cout << std::endl;
958 Check (10000000000LL);
959 Check (100000000000LL);
960 Check (1000000000000LL);
961 Check (10000000000000LL);
962 Check (100000000000000LL);
963 Check (1000000000000000LL);
971 virtual void DoRun (
void);
972 void Check (
const int64_t intPart);
973 void Check (
const long double value,
974 const int64_t intPart,
983 :
TestCase (
"Construct from floating point.")
989 const int64_t intPart,
1001 long double margin = 0;
1019 const bool skip = value ==
m_last;
1020 const bool pass = delta <= tolerance;
1023 std::ios_base::fmtflags ff = std::cout.flags ();
1024 std::cout << std::fixed << std::setprecision (22);
1027 << (skip ?
"skip " : (pass ?
"pass " :
"FAIL "))
1028 << std::showpos << value <<
" == " 1036 << std::left << std::setw (43) <<
" expected" 1037 << std::right <<
Printer (expect)
1040 if (delta == tolerance)
1043 << std::left << std::setw (43) <<
" delta = tolerance" 1044 << std::right <<
Printer (delta)
1050 << std::left << std::setw (43) <<
" delta" 1051 << std::right <<
Printer (delta)
1054 << std::left << std::setw (43) <<
" +/-" 1055 << std::right <<
Printer (tolerance)
1068 "int64x64_t (long double) failed");
1070 std::cout.flags (ff);
1077 std::cout << std::endl;
1079 <<
"integer: " << intPart
1081 m_last =
static_cast<long double> (intPart);
1085 long double v =
static_cast<long double> (intPart);
1087 Check (v +0.0000000000000000000542L, intPart, 0x1ULL);
1088 Check (v +0.0000000000000000001084L, intPart, 0x2ULL);
1089 Check (v +0.0000000000000000001626L, intPart, 0x3ULL);
1090 Check (v +0.0000000000000000002168L, intPart, 0x4ULL);
1091 Check (v +0.0000000000000000002710L, intPart, 0x5ULL);
1092 Check (v +0.0000000000000000003253L, intPart, 0x6ULL);
1093 Check (v +0.0000000000000000003795L, intPart, 0x7ULL);
1094 Check (v +0.0000000000000000004337L, intPart, 0x8ULL);
1095 Check (v +0.0000000000000000004879L, intPart, 0x9ULL);
1096 Check (v +0.0000000000000000005421L, intPart, 0xAULL);
1097 Check (v +0.0000000000000000008132L, intPart, 0xFULL);
1098 Check (v +0.0000000000000000130104L, intPart, 0xF0ULL);
1099 Check (v +0.0000000000000002081668L, intPart, 0xF00ULL);
1100 Check (v +0.0000000000000033306691L, intPart, 0xF000ULL);
1101 Check (v +0.0000000000000532907052L, intPart, 0xF0000ULL);
1102 Check (v +0.0000000000008526512829L, intPart, 0xF00000ULL);
1103 Check (v +0.0000000000136424205266L, intPart, 0xF000000ULL);
1104 Check (v +0.0000000002182787284255L, intPart, 0xF0000000ULL);
1105 Check (v +0.0000000034924596548080L, intPart, 0xF00000000ULL);
1106 Check (v +0.0000000558793544769287L, intPart, 0xF000000000ULL);
1107 Check (v +0.0000008940696716308594L, intPart, 0xF0000000000ULL);
1108 Check (v +0.0000143051147460937500L, intPart, 0xF00000000000ULL);
1109 Check (v +0.0002288818359375000000L, intPart, 0xF000000000000ULL);
1110 Check (v +0.0036621093750000000000L, intPart, 0xF0000000000000ULL);
1111 Check (v +0.0585937500000000000000L, intPart, 0xF00000000000000ULL);
1112 std::cout << std::endl;
1113 Check (v +0.4999999999999999998374L, intPart, 0x7FFFFFFFFFFFFFFDULL);
1114 Check (v +0.4999999999999999998916L, intPart, 0x7FFFFFFFFFFFFFFEULL);
1115 Check (v +0.4999999999999999999458L, intPart, 0x7FFFFFFFFFFFFFFFULL);
1116 Check (v +0.5000000000000000000000L, intPart, 0x8000000000000000ULL);
1117 Check (v +0.5000000000000000000542L, intPart, 0x8000000000000001ULL);
1118 Check (v +0.5000000000000000001084L, intPart, 0x8000000000000002ULL);
1119 Check (v +0.5000000000000000001626L, intPart, 0x8000000000000003ULL);
1120 std::cout << std::endl;
1121 Check (v +0.9375000000000000000000L, intPart, 0xF000000000000000ULL);
1122 Check (v +0.9960937500000000000000L, intPart, 0xFF00000000000000ULL);
1123 Check (v +0.9997558593750000000000L, intPart, 0xFFF0000000000000ULL);
1124 Check (v +0.9999847412109375000000L, intPart, 0xFFFF000000000000ULL);
1125 Check (v +0.9999990463256835937500L, intPart, 0xFFFFF00000000000ULL);
1126 Check (v +0.9999999403953552246094L, intPart, 0xFFFFFF0000000000ULL);
1127 Check (v +0.9999999962747097015381L, intPart, 0xFFFFFFF000000000ULL);
1128 Check (v +0.9999999997671693563461L, intPart, 0xFFFFFFFF00000000ULL);
1129 Check (v +0.9999999999854480847716L, intPart, 0xFFFFFFFFF0000000ULL);
1130 Check (v +0.9999999999990905052982L, intPart, 0xFFFFFFFFFF000000ULL);
1131 Check (v +0.9999999999999431565811L, intPart, 0xFFFFFFFFFFF00000ULL);
1132 Check (v +0.9999999999999964472863L, intPart, 0xFFFFFFFFFFFF0000ULL);
1133 Check (v +0.9999999999999997779554L, intPart, 0xFFFFFFFFFFFFF000ULL);
1134 Check (v +0.9999999999999999861222L, intPart, 0xFFFFFFFFFFFFFF00ULL);
1135 Check (v +0.9999999999999999991326L, intPart, 0xFFFFFFFFFFFFFFF0ULL);
1136 Check (v +0.9999999999999999994037L, intPart, 0xFFFFFFFFFFFFFFF5ULL);
1137 Check (v +0.9999999999999999994579L, intPart, 0xFFFFFFFFFFFFFFF6ULL);
1138 Check (v +0.9999999999999999995121L, intPart, 0xFFFFFFFFFFFFFFF7ULL);
1139 Check (v +0.9999999999999999995663L, intPart, 0xFFFFFFFFFFFFFFF8ULL);
1140 Check (v +0.9999999999999999996205L, intPart, 0xFFFFFFFFFFFFFFF9ULL);
1141 Check (v +0.9999999999999999996747L, intPart, 0xFFFFFFFFFFFFFFFAULL);
1142 Check (v +0.9999999999999999997289L, intPart, 0xFFFFFFFFFFFFFFFBULL);
1143 Check (v +0.9999999999999999997832L, intPart, 0xFFFFFFFFFFFFFFFCULL);
1144 Check (v +0.9999999999999999998374L, intPart, 0xFFFFFFFFFFFFFFFDULL);
1145 Check (v +0.9999999999999999998916L, intPart, 0xFFFFFFFFFFFFFFFEULL);
1146 Check (v +0.9999999999999999999458L, intPart, 0xFFFFFFFFFFFFFFFFULL);
1149 <<
"integer: " << intPart
1158 std::cout << std::endl;
1163 std::ios_base::fmtflags ff = std::cout.flags ();
1164 std::cout << std::scientific << std::setprecision (21);
1181 std::cout.flags (ff);
1189 virtual void DoRun (
void);
1193 :
TestCase (
"Print the implementation")
1200 std::cout << std::endl;
1205 std::cout <<
"int64x64_t::implementation: ";
1211 default : std::cout <<
"unknown!";
1213 std::cout << std::endl;
1215 #if defined (INT64X64_USE_CAIRO) && !defined (PYTHON_SCAN) 1216 std::cout <<
"cairo_impl64: " <<
cairo_impl64 << std::endl;
1217 std::cout <<
"cairo_impl128: " <<
cairo_impl128 << std::endl;
1222 std::cout <<
"Running with valgrind" << std::endl;
Pretty printer for test cases.
virtual void DoRun(void)
Implementation to actually run this TestCase.
ns3::int64x64::test::Int64x64TestSuite g_int64x64TestSuite
std::ostream & operator<<(std::ostream &os, const Printer &p)
Int64x64Bug1786TestCase()
High precision numerical type, implementing Q64.64 fixed precision.
bool m_haveInt
Do we have a full int64x64_t value?
void CheckCase(const uint64_t factor, const int64x64_t result, const int64x64_t expect, const std::string &msg, const double tolerance=0)
void Check(const double result, const double expect, const std::string &msg)
virtual void DoRun(void)
Implementation to actually run this TestCase.
void Check(const int64_t factor)
void Check(const bool result, const bool expect, const std::string &msg)
const char * cairo_impl128
static int64x64_t Invert(const uint64_t v)
Compute the inverse of an integer value.
void Check(const int64_t intPart)
#define NS_TEST_EXPECT_MSG_EQ(actual, limit, msg)
Test that an actual and expected (limit) value are equal and report if not.
#define RUNNING_ON_VALGRIND
void MulByInvert(const int64x64_t &o)
Multiply this value by a Q0.128 value, presumably representing an inverse, completing a division oper...
Printer(const int64x64_t value)
Construct from an int64x64_t Q64.64 value.
int64_t m_high
The high (integer) word.
int64x64_t Min(const int64x64_t &a, const int64x64_t &b)
Minimum.
uint64_t m_low
The low (fractional) word.
void Check(const int test, const int64x64_t value, const int64x64_t expect)
virtual void DoRun(void)
Implementation to actually run this TestCase.
void AddTestCase(TestCase *testCase, TestDuration duration=QUICK)
Add an individual child TestCase to this test suite.
friend std::ostream & operator<<(std::ostream &os, const Printer &p)
Output streamer, the main reason for this class.
virtual void DoRun(void)
Implementation to actually run this TestCase.
int64x64_t m_value
The int64x64_t value.
#define NS_TEST_ASSERT_MSG_EQ(actual, limit, msg)
Test that an actual and expected (limit) value are equal and report and abort if not.
void Check(const int64_t hi, const uint64_t lo)
int64x64_t Max(const int64x64_t &a, const int64x64_t &b)
Maximum.
virtual void DoRun(void)
Implementation to actually run this TestCase.
virtual void DoRun(void)
Implementation to actually run this TestCase.
#define NS_TEST_ASSERT_MSG_EQ_TOL(actual, limit, tol, msg)
Test that actual and expected (limit) values are equal to plus or minus some tolerance and report and...
#define NS_TEST_EXPECT_MSG_EQ_TOL(actual, limit, tol, msg)
Test that actual and expected (limit) values are equal to plus or minus some tolerance and report if ...
int64x64_t Abs(const int64x64_t &value)
Absolute value.
virtual void DoRun(void)
Implementation to actually run this TestCase.
Every class exported by the ns3 library is enclosed in the ns3 namespace.
virtual void DoRun(void)
Implementation to actually run this TestCase.
TestCase * GetParent() const
Get the parent of this TestCsse.
const char * cairo_impl64
#define HP_MAX_64
Floating point value of HP_MASK_LO + 1.
std::string GetName(void) const
Native int128_t implementation.
uint64_t GetLow(void) const
Get the fractional portion of this value, unscaled.
Cairo wideint implementation.
Printer(const int64_t high, const uint64_t low)
Construct from high and low words of Q64.64 representation.
double GetDouble(void) const
Get this value as a double.
virtual void DoRun(void)
Implementation to actually run this TestCase.
void Check(const double result, const double expect, const std::string &msg)
Int64x64ArithmeticTestCase()
This test suite implements a Unit Test.
void Check(const uint64_t low, const std::string &value, const int64_t tolerance=0)
Int64x64CompareTestCase()
long double implementation.
int64_t GetHigh(void) const
Get the integer portion.
static enum impl_type implementation
Type tag for this implementation.