3

正確性と効率性をテストする必要がある任意精度の有理数パッケージを作成しています。もちろん、アドホックなテスト セットを自分で作成することもできますが、これを行うのは初めてではないので、質問する価値はあると思います。使用できる既存のテスト セットを推奨できる人はいますか?

編集:ループのたびに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

オープンソースの合理的な実装の単体テストを調べてみてください。Ruby は任意の精度をサポートしていますが、 32 ビットを超えるプッシュをrational行うテストはごくわずかです。test/ruby/test_rational2.rb例えば:

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

Scheme や Sage などの他のオープン ソースの Rational Bignum パッケージがどのようにテストされているかはわかりませんが、やる気があるなら、それらのテストがどこかにあるはずです。

于 2011-03-18T00:05:16.873 に答える