📄 test_bignum.cxx
字号:
TEST("b2 == b2", b2 == b2, true);
TEST("b2 == b3", b2 == b3, false);
TEST("b3 == b3", b3 == b3, true);
TEST("p_inf == p_inf", p_inf == p_inf, true);
TEST("p_inf == m_inf", p_inf == m_inf, false);
TEST("m_inf == m_inf", m_inf == m_inf, true);
TEST("b0 == p_inf", b0 == p_inf, false);
TEST("b1 == p_inf", b1 == p_inf, false);
TEST("b2 == p_inf", b2 == p_inf, false);
TEST("b3 == p_inf", b3 == p_inf, false);
TEST("b0 == m_inf", b0 == m_inf, false);
TEST("b1 == m_inf", b1 == m_inf, false);
TEST("b2 == m_inf", b2 == m_inf, false);
TEST("b3 == m_inf", b3 == m_inf, false);
TEST("b0 != b0", b0 != b0, false);
TEST("b0 != b1", b0 != b1, true);
TEST("b0 != b2", b0 != b2, true);
TEST("b0 != b3", b0 != b3, true);
TEST("b1 != b1", b1 != b1, false);
TEST("b1 != b2", b1 != b2, true);
TEST("b1 != b3", b1 != b3, true);
TEST("b2 != b2", b2 != b2, false);
TEST("b2 != b3", b2 != b3, true);
TEST("b3 != b3", b3 != b3, false);
TEST("b0 < b0", b0 < b0, false);
TEST("b0 < b1", b0 < b1, true);
TEST("b0 < b2", b0 < b2, true);
TEST("b0 < b3", b0 < b3, false);
TEST("b1 < b1", b1 < b1, false);
TEST("b1 < b2", b1 < b2, true);
TEST("b1 < b3", b1 < b3, false);
TEST("b2 < b2", b2 < b2, false);
TEST("b2 < b3", b2 < b3, false);
TEST("b3 < b3", b3 < b3, false);
TEST("p_inf < p_inf", p_inf < p_inf, false);
TEST("p_inf < m_inf", p_inf < m_inf, false);
TEST("m_inf < p_inf", m_inf < p_inf, true);
TEST("m_inf < m_inf", m_inf < m_inf, false);
TEST("b0 < p_inf", b0 < p_inf, true);
TEST("b1 < p_inf", b1 < p_inf, true);
TEST("b2 < p_inf", b2 < p_inf, true);
TEST("b3 < p_inf", b3 < p_inf, true);
TEST("b0 < m_inf", b0 < m_inf, false);
TEST("b1 < m_inf", b1 < m_inf, false);
TEST("b2 < m_inf", b2 < m_inf, false);
TEST("b3 < m_inf", b3 < m_inf, false);
TEST("b0 > b0", b0 > b0, false);
TEST("b0 > b1", b0 > b1, false);
TEST("b0 > b2", b0 > b2, false);
TEST("b0 > b3", b0 > b3, true);
TEST("b1 > b1", b1 > b1, false);
TEST("b1 > b2", b1 > b2, false);
TEST("b1 > b3", b1 > b3, true);
TEST("b2 > b2", b2 > b2, false);
TEST("b2 > b3", b2 > b3, true);
TEST("b3 > b3", b3 > b3, false);
TEST("p_inf > p_inf", p_inf > p_inf, false);
TEST("p_inf > m_inf", p_inf > m_inf, true);
TEST("m_inf > p_inf", m_inf > p_inf, false);
TEST("m_inf > m_inf", m_inf > m_inf, false);
TEST("b0 > p_inf", b0 > p_inf, false);
TEST("b1 > p_inf", b1 > p_inf, false);
TEST("b2 > p_inf", b2 > p_inf, false);
TEST("b3 > p_inf", b3 > p_inf, false);
TEST("b0 > m_inf", b0 > m_inf, true);
TEST("b1 > m_inf", b1 > m_inf, true);
TEST("b2 > m_inf", b2 > m_inf, true);
TEST("b3 > m_inf", b3 > m_inf, true);
TEST("b3 != b2", b3 != b2, true);
TEST("b3 != b3", b3 != b3, false);
TEST("b3 < b2", b3 < b2, true);
TEST("b3 <= b2", b3 <= b2, true);
TEST("b3 <= b3", b3 <= b3, true);
TEST("b3 > b3", b3 > b3, false);
TEST("b3 > b2", b3 > b2, false);
TEST("b3 >= b2", b3 >= b2, false);
TEST("b3 >= b3", b3 >= b3, true);
TEST("b2 >= b2", b2 >= b2, true);
vcl_cout << b2 << " == " << &b2 << vcl_endl;
TEST("<<", 1, 1);
}
static void run_division_tests()
{
vcl_cout << "\nStarting division tests:\n";
TEST("long(vnl_bignum(0L)/vnl_bignum(1L))", long(vnl_bignum(0L)/vnl_bignum(1L)), 0L);
TEST("long(vnl_bignum(-1L)/vnl_bignum(1L))", long(vnl_bignum(-1L)/vnl_bignum(1L)), -1L);
TEST("long(vnl_bignum(-1L)/vnl_bignum(\"+Inf\"))", long(vnl_bignum(-1L)/vnl_bignum("+Inf")), 0L);
TEST("vnl_bignum(\"+Inf\")/(-1L)", vnl_bignum("+Inf")/(-1L), vnl_bignum("-Inf"));
TEST("vnl_bignum(-1L)/0L", vnl_bignum(-1L)/0L, vnl_bignum("-Inf"));
long i,j,k,l;
long div_errors = 0;
long mod_errors = 0;
vcl_cout << " for (i = 0xffffff; i > 0; i /= 0x10)\n"
<< " for (j = 0x7ffffff; j > 0; j /= 0x10)\n"
<< " for (k = 1; k < 17; ++k)\n"
<< " for (l = 1; l < 17; ++l)\n ";
for (i = 0xffffff; i > 0; i /= 0x10) {
vcl_cout.put('.');
vcl_cout.flush();
for (j = 0x7ffffff; j > 0; j /= 0x10) {
for (k = 1; k < 17; ++k) {
for (l = 1; l < 17; ++l) {
vnl_bignum b1(i+k);
vnl_bignum b2(j+l);
vnl_bignum b3(long((i+k)/(j+l)));
if (b1/b2 != b3) {
TEST("(vnl_bignum(i+k)/vnl_bignum(j+l)) == vnl_bignum(long((i+k)/(j+l)))", false, true);
#ifndef __alpha__ // On Alpha, compiler runs out of memory when using <iomanip>
vcl_cout<<vcl_hex<< "i=0x"<<i<<", j=0x"<<j<<", k=0x"<<k<<", l="<<l
<<vcl_dec<<", b1="<<b1<<", b2="<<b2<<", b3="<<b3<<'\n';
#endif
++div_errors;
}
b3 = vnl_bignum(long((i+k)%(j+l)));
if (b1%b2 != b3) {
TEST("(vnl_bignum(i+k)%vnl_bignum(j+l)) == vnl_bignum(long((i+k)%(j+l)))", false, true);
#ifndef __alpha__ // On Alpha, compiler runs out of memory when using <iomanip>
vcl_cout<<vcl_hex<< "i=0x"<<i<<", j=0x"<<j<<", k=0x"<<k<<", l="<<l
<<vcl_dec<<", b1="<<b1<<", b2="<<b2<<", b3="<<b3<<'\n';
#endif
++mod_errors;
}
}
}
}
}
vcl_cout << "\n";
TEST("(vnl_bignum(i+k)/vnl_bignum(j+l)) == vnl_bignum(long((i+k)/(j+l)))",
div_errors, 0);
TEST("(vnl_bignum(i+k)%vnl_bignum(j+l)) == vnl_bignum(long((i+k)%(j+l)))",
mod_errors, 0);
#ifdef INTERACTIVE
char num[130], den[130];
vnl_bignum b,r;
while (true) {
vcl_cout << "Enter next numerator: ";
vcl_cin >> num;
vcl_cout << "Enter next denominator: ";
vcl_cin >> den;
b = vnl_bignum(num)/vnl_bignum(den);
r = vnl_bignum(num) % vnl_bignum(den);
vcl_cout << "\nquotient = " << b
<< "\n "; b.dump();
vcl_cout << "\n\nremainder = " << r
<< "\n "; r.dump();
vcl_cout << '\n';
}
#endif
}
static void run_multiplication_division_tests()
{
vcl_cout << "\nCheck example in book:\n";
vnl_bignum b2 = "0xffffffff"; // Create vnl_bignum object
vnl_bignum b3 = "12345e30"; // Create vnl_bignum object
vcl_cout << "b2 = " << b2 << vcl_endl
<< "b3 = " << b3 << vcl_endl;
TEST("(b2*b3) / b3 = b2", ((b2*b3) / b3 == b2), 1);
TEST("(b2*b3) / b2 = b3", ((b2*b3) / b2 == b3), 1);
TEST("((b3/b2) * b2) + (b3%b2) = b3", (((b3/b2) * b2) + (b3%b2) == b3), 1);
}
static void run_addition_subtraction_tests()
{
vcl_cout << "\nStarting addition, subtraction tests:\n";
long i,j;
long add_errors = 0;
long sub_errors = 0;
vnl_bignum bi,bj,bij;
vcl_cout << " for (i = 1; i < 0xfffffff; i *= 3)\n"
<< " for (j = 1; j < 0xfffffff; j *= 3)\n ";
{for (i = 1; i < 0xfffffff; i *= 3) {
vcl_cout.put('.');
vcl_cout.flush();
for (j = 1; j < 0xfffffff; j *= 3) {
bi = i;
bj = j;
bij = vnl_bignum(i+j);
if (bi + bj != bij) {
TEST("bi + bj == vnl_bignum(i + j)", false, true);
vcl_cout << "i = "<<i<<", j = "<<j<<"\n";
++add_errors;
}
bij = vnl_bignum(i-j);
if (bi - bj != bij) {
TEST("bi - bj == vnl_bignum(i - j)", false, true);
vcl_cout << "i = "<<i<<", j = "<<j<<"\n";
++sub_errors;
}
}
}}
vcl_cout << "\n";
TEST("bi + bj == vnl_bignum(i + j)", add_errors, 0);
TEST("bi - bj == vnl_bignum(i - j)", sub_errors, 0);
vnl_bignum b0(0L);
vnl_bignum zillion("1000000000000000000");
vnl_bignum b1000(1000L), b1000000(1000000L);
vnl_bignum p_inf("+Inf"), m_inf("-Inf");
TEST("-b0 == b0", -b0, b0);
TEST("-p_inf == m_inf", -p_inf, m_inf);
TEST("-m_inf == p_inf", -m_inf, p_inf);
TEST("-b1000 == vnl_bignum(-1L)*b1000", -b1000, vnl_bignum(-1L)*b1000);
TEST("-(-b1000000) == b1000000", -(-b1000000), b1000000);
TEST("b0 + b1000 == b1000", b0 + b1000, b1000);
TEST("b0 + b1000000 == b1000000", b0 + b1000000, b1000000);
TEST("b1000 + b0 == b1000", b1000 + b0, b1000);
TEST("b1000000 + b0 == b1000000", b1000000 + b0, b1000000);
TEST("b0 + (-b1000) == -b1000", b0 + (-b1000), -b1000);
TEST("-b1000 + b0 == -b1000", -b1000 + b0, -b1000);
TEST("-b1000 + (-b1000) == (vnl_bignum(2L)*(-b1000))",
-b1000 + (-b1000), (vnl_bignum(2L)*(-b1000)));
TEST("-b1000000 + (-b1000000) == (vnl_bignum(2L)*(-b1000000))",
-b1000000 + (-b1000000), (vnl_bignum(2L)*(-b1000000)));
TEST("b1000000 + (-b1000000) == b0", b1000000 + (-b1000000), b0);
TEST("zillion + (-zillion) == b0", zillion + (-zillion), b0);
TEST("zillion + b1000 == b1000000*b1000000*b1000000 + b1000",
zillion + b1000, b1000000*b1000000*b1000000 + b1000);
TEST("zillion + p_inf == p_inf", zillion + p_inf, p_inf);
TEST("zillion + m_inf == m_inf", zillion + m_inf, m_inf);
TEST("p_inf + zillion == p_inf", p_inf + zillion, p_inf);
TEST("m_inf + zillion == m_inf", m_inf + zillion, m_inf);
TEST("b0 - b1000 == -b1000", b0 - b1000, -b1000);
TEST("b0 - b1000000 == -b1000000", b0 -b1000000, -b1000000);
TEST("b1000 - b0 == b1000", b1000 - b0, b1000);
TEST("b1000000 - b0 == b1000000", b1000000 - b0, b1000000);
TEST("b0 - (-b1000) == b1000", b0 - (-b1000), b1000);
TEST("-b1000 - b0 == -b1000", -b1000 - b0, -b1000);
TEST("-b1000 - (-b1000) == b0", -b1000 - (-b1000), b0);
TEST("-b1000 - (-zillion) == zillion - b1000",
-b1000 - (-zillion), zillion - b1000);
TEST("-b1000000 - (-b1000000) == b0", -b1000000 - (-b1000000), b0);
TEST("-b1000000 - (b1000000) == -vnl_bignum(2L)*b1000000",
⌨️ 快捷键说明
复制代码
Ctrl + C
搜索代码
Ctrl + F
全屏模式
F11
切换主题
Ctrl + Shift + D
显示快捷键
?
增大字号
Ctrl + =
减小字号
Ctrl + -