3

我正在编写一个任意精度的有理数包,我需要测试它的正确性和效率。当然,我可以自己组合一组临时测试,但由于我远不是第一个这样做的人,我认为值得一问:有人可以推荐一组我可以使用的现有测试吗?

编辑:我最终编写了一个测试例程,每次在循环中生成三个随机数并验证各种算术恒等式是否成立。到目前为止,它在数字代码中发现了几个错误。这是实际的代码:

for (i = 0;; i++)
{
    mem = memlo;
    printf(fmtw "\r", i);

    a = rndnum();
    b = rndnum();
    c = rndnum();

    // Equality
    test(eq(a, a));
    test(!eq(a, b) || !eq(b, c) || eq(a, c));

    // Addition
    test(eq(add(add(a, b), c), add(a, add(b, c))));
    test(eq(add(a, b), add(b, a)));
    test(eq(add(a, zero), a));

    // Subtraction
    test(eq(sub(add(a, b), b), a));
    test(sub(a, a) == zero);
    test(eq(sub(a, b), add(a, sub(zero, b))));

    // Multiplication
    test(eq(mul(mul(a, b), c), mul(a, mul(b, c))));
    test(eq(mul(a, b), mul(b, a)));
    test(eq(mul(a, one), a));
    test(eq(mul(a, add(b, c)), add(mul(a, b), mul(a, c))));

    // Division
    test(b == zero || eq(div_(mul(a, b), b), a));
    test(a == zero || div_(a, a) == (one));
    test(b == zero || eq(div_(a, b), mul(a, div_(one, b))));
    test(c == zero
        || eq(div_(sub(a, b), c), sub(div_(a, c), div_(b, c))));

    // I/O
    test(eq(a, roundtrip(a)));
}
4

1 回答 1

4

尝试查看开源合理实现的单元测试。Rubyrational支持任意精度,尽管只有少数测试test/ruby/test_rational2.rb超过了 32 位。例如:

assert_equal(Rational(2305842940494218450, 1152921470247108503),
             Rational(1073741789, 1073741827) + Rational(1073741827, 1073741789))

对于 Python 的 test_fractions.py 也是如此:

 self.assertTypedEquals(10**23, 10**22 // F(1, 10))

GNU MPL有一些主要基于随机数的合理单元测试。

IMath包有一很好的测试,例如:

qadd:-14,9/2,-20:-19/2
qadd:-60,=1,43/2:-120
qadd:375/18696391582109365451,-131/32949770573031503434,166/56750232802998421883:9906936667630486913669/616041813174061083543307811398267458734
qadd:615/80348516296708248277,=1,=2:1230/80348516296708248277

对我来说,如何测试其他开源合理的 bignum 包(如 Scheme 和 Sage)并不明显,但如果你有动力,他们的测试应该存在于某个地方。

于 2011-03-18T00:05:16.873 回答