double.NaN Равенство в тесте MS - PullRequest
6 голосов
/ 26 марта 2010

Почему я получаю этот результат?

[TestMethod]
public void nan_test()
{
    Assert.AreEqual(1, double.NaN, 1E-1); <-- Passes
    Assert.AreEqual(1, double.NaN);       <-- Fails
}

Какая разница, что дельта в утверждении NaN равна числу? Конечно, он всегда должен возвращать false. Я знаю об IsNaN, но здесь это бесполезно (см. Ниже).

Справочная информация: у меня есть функция, возвращающая NaN (ошибочно), она должна была быть действительным числом, но тест все же прошел. Я использую дельту, потому что это равенство двойной точности, в первоначальном тесте использовался 1E-9.

Ответы [ 3 ]

4 голосов
/ 26 марта 2010

Когда вы используете Assert.AreEqual(1, double.NaN), он пробует проверку на равенство чисел и, конечно же, не проходит, так как double.NaN не равно ничему.

Когда вы делаете Assert.AreEqual(1, double.NaN, 1E-1), он должен делать арифметику с числами. В частности, он вычисляет

Math.Abs((double) (expected - actual)) > delta
Math.Abs(1 - double.NaN) > 1E-1
Math.Abs(double.NaN) > 1E-1 // All arithmetic with double.NaN returns double.NaN
double.NaN > 1E-1 // All comparisons with double.NaN return false (except !=)

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

Мораль истории: поведение NaN довольно сумасшедшее (но лучшее, что могли придумать некоторые умные люди). Сделайте все возможное, чтобы проверить наличие NaN, прежде чем выполнять какие-либо вычисления, в которых ошибка не может распространяться молча, как этот.

2 голосов
/ 26 марта 2010

Посмотрите здесь: Почему Assert.AreEqual (1.0, double.NaN, 1.0) проходит?

Edit:

определенно есть ошибка в Assert.AreEqual. в VS 2008 Microsoft.VisualStudio.QualityTools.UnitTestFramework кодируется как

if (Math.Abs((double) (expected - actual)) > delta)
{
    // report error
}

Поскольку в вашем случае Math.Abs((double) (expected - actual)) является double.NaN, сравнение дает false: -)

1 голос
/ 26 марта 2010

Не могли бы вы использовать этот тест для NaN вместо

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