Разница между двойными сравнениями в gtest (C ++) и nunit (C #) - PullRequest
4 голосов
/ 25 августа 2010

Я выполнил перенос проекта c ++ с тестами gtest на проект ac # с тестом nunit.Теперь у меня возникают проблемы с точностью с плавающей запятой.

в тесте nunit У меня не все в порядке (красный)

Assert.AreEqual(0.7, 7 * 0.1); 

в тесте gtest, который у меня есть:

ASSERT_DOUBLE_EQ(0.7, 7 * 0.1);

что в порядке (зеленый)

Вопрос теперь ПОЧЕМУ ???

Ответы [ 4 ]

2 голосов
/ 11 ноября 2010

Google Test ASSERT_DOUBLE_EQ() проверяет, что фактическое значение находится в пределах 4 ULP от ожидаемого (см. Дополнительную информацию в https://github.com/google/googletest/blob/master/googletest/docs/advanced.md#floating-point-comparison). Nunit, вероятно, выполняет точное сравнение.

2 голосов
/ 25 августа 2010

никогда не сравнивайте числа с плавающей точкой на равенство!десятичные дробные числа (например, 0,1) не могут быть представлены в числах с плавающей запятой без малой потери точности.то, что может выглядеть как 0,7, может быть 0,6999999 или как-то иначе.тогда это разные цифры.Вы должны использовать технику эпсилон: рассмотрим a == b if abs(a - b) <= epsilon, где эпсилон очень маленькое постоянное число.

прочитайте это и многие другие ^

http://docs.sun.com/source/806-3568/ncg_goldberg.html

Чтонеправильно использовать == для сравнения чисел в Java?

1 голос
/ 25 августа 2010

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

public static void AreEqual (
    double expected,
    double actual,
    double delta
)

Проверяет, что два указанных двойныхравны или в пределах указанной точности друг друга.Утверждение не выполняется, если они не соответствуют указанной точности друг друга.

0 голосов
/ 25 августа 2010

Попробуйте Assert.AreApproximatelyEqual при сравнении поплавков.

...