Оценить, если два двойных равны на основе заданной точности, а не в пределах определенного фиксированного допуска

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

В NUnit мы можем сравнивать с фиксированным допуском:

double expected = 0.389842845321551d;
double actual   = 0.38984284532155145d; // really comes from a data import
Expect(actual, EqualTo(expected).Within(0.000000000000001));

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

В частности, этот тест не проходит:

double expected = 1.95346834136148d;
double actual   = 1.9534683413614817d; // really comes from a data import
Expect(actual, EqualTo(expected).Within(0.000000000000001));

и, конечно же, большие числа терпят неудачу с допуском ..

double expected = 1632.4587642911599d;
double actual   = 1632.4587642911633d; // really comes from a data import
Expect(actual, EqualTo(expected).Within(0.000000000000001));

Как правильно вычислить, что два числа с плавающей запятой равны с заданной точностью? Есть ли встроенный способ сделать это в NUnit?

30
задан Samuel Neff 24 January 2011 в 21:02
поделиться