Тестирование арифметики больших чисел

Я пишу пакет рациональных чисел произвольной точности, который мне нужно проверить на правильность и эффективность. Конечно, я мог бы сам составить специальный набор тестов, но, поскольку я далеко не первый, кто этим занимается, полагаю, стоит спросить: может ли кто-нибудь порекомендовать существующий набор тестов, который я мог бы использовать?

Изменить: я написал тестовую процедуру, которая каждый раз в цикле генерирует три случайных числа и проверяет выполнение различных арифметических тождеств. На данный момент было обнаружено несколько ошибок в числовом коде. Вот фактический код:

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)));
}

person rwallace    schedule 17.03.2011    source источник
comment
Одна вещь о тестировании со случайными числами заключается в том, что вам нужно установить начальное число, если вы хотите, чтобы тесты были воспроизводимыми. Это настоящий облом, получить отчет об ошибке, а затем не иметь возможности воспроизвести прогон, потому что вы не знаете начальное число.   -  person xan    schedule 24.03.2011


Ответы (1)


Попробуйте взглянуть на модульные тесты рациональных реализаций с открытым исходным кодом. rational в Ruby поддерживает произвольную точность, хотя лишь несколько тестов в 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, но если вы мотивированы, их тесты должны где-то существовать.

person xan    schedule 18.03.2011