Тестирование множества математических операций в классе - PullRequest
0 голосов
/ 14 февраля 2012

Есть ли способ проверить функции внутри класса простым способом для получения правильных результатов?Я имею в виду, я смотрел на модульное тестирование Google, но, похоже, больше обнаруживает сбои в рабочих классах и функциях, чем в ожидаемом результате.

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

Ответы [ 2 ]

1 голос
/ 14 февраля 2012

Я могу придумать 2 прямых решения

1)

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

так что вы бы сделали, чтобы для каждой функции была определена переменная limitDomain (это потому, что некоторые операции более точны, чем другие, для рассуждений ищите приближение Тейлора [function]), а затем используйте его в качестве ограничителя. затем проверьте: low, high, а затем само значение, а затем возьмите среднее значение всех трех с заданным пределом погрешности,

float testMathOpX(float _input){
    float low = 0.0f;
    float high = 0.0f;

    low = _input - limitDomainOpX;
    high = _input + limitDomainOpX;

    low = OpX(low);
    _input = OpX(_input);
    high = OpX(high);

    // doing 3 separate averages with division by 2 mains the worst decimal you will have is a trailing 5, or in some cases a trailing 25
    low = (low + _input)/2
    high = (_input + high)/2;
    _input = (low + high)/2
    return _input;
}

2)

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

if( (_input > valLow) && (_input < valHigh)){
     ... replace the value with an empirically found value
}

проблема в том, что вам нужно найти эти эмпирически найденные значения.

1 голос
/ 14 февраля 2012

У вас есть требования к точности или вы хотите найти точность?Если это первое, то нетрудно создать контрольные примеры с использованием любой среды тестирования.

y = myfunc(x);
if (y > expected_y + allowed_error || y < expected_y - allowed_error) {
  // Test failed
  ...
}

Редактировать: Существует два способа определения точности: через тестирование и черезАлгоритм анализа.

Тестирование должно быть простым: сравните выходные данные с правильными значениями (которые вы должны получить каким-то образом).

Алгоритмный анализ - это вычисление ожидаемого размера ошибки путем вычисления ошибки алгоритма и ошибки, вызванной отсутствием точности в арифметике с плавающей запятой.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...