Когда вы используете 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, прежде чем выполнять какие-либо вычисления, в которых ошибка не может распространяться молча, как этот.