Это зависит от полностью от того, что тестирует ваш юнит-тест.
Скорее всего, вы сможете относиться к ним как к эквиваленту, если только тестирование, которое вы выполняете, на самом деле относится к самому программному обеспечению с плавающей запятой IEEE754 или коду исполнения C, который их печатает. В противном случае вы должны рассматривать их как идентичные , если код, который использует то, что вы тестируете, рассматривает их как идентичные.
Это потому, что тесты должны отражать ваше реальное использование, в каждый обстоятельство. Например, если вы тестируете функцию doCalc()
, которая возвращает double. Если это только когда-либо использовали таким образом:
x = doCalc()
if x is any sort of Nan:
doSomethingWithNan()
, то ваш тест должен обработать все NaN
значения как равнозначные. Однако, если вы используете его таким образом:
x = doCalc()
if x is +Nan:
doSomethingForPositive()
else:
if x is -Nan:
doSomethingForNegative()
тогда вы захотите относиться к ним как к разным.
Аналогично, если ваша реализация создает полезную полезную нагрузку в дробных битах (см. Ниже), а ваш реальный код использует, что также должно быть проверено модульными тестами.
Поскольку NaN просто все 1-бит в показателе и нечто иное, чем все нулевые биты во фракции, бит знака может быть положительным или отрицательным, а дробные биты могут быть самые разнообразные значений. Тем не менее, это по-прежнему значение или результат, который был вне представления типа данных, поэтому, если вы ожидали именно этого, вероятно, мало что может означать, что содержит знак или полезная нагрузка.
С точки зрения проверки текстового вывода NaN
значений, the Wikipedia page on NaN указывает на то, что различные реализации могут дать вам весьма различные выходы, среди них:
nan
NaN
NaN%
NAN
NaNQ
NaNS
qNaN
sNaN
1.#SNAN
1.#QNAN
-1.#IND
и даже варианты показывая изменяющегося знака и полезной нагрузки, которые имеют не влияет на его NaN-Несс:
-NaN
NaN12345
-sNaN12300
-NaN(s1234)
Так что, если вы хотите быть массивно портативный в тестовом модуле, вы заметите, что все выходные данные повторно В префиксах есть один вариант строки nan
. Таким образом, поиск без учета регистра по значению для строки nan
или ind
подберет их всех. Это может не сработать в всех окружениях, но имеет очень большой охват.
Для чего это стоит, стандарт C имеет это, чтобы сказать о выводе значений с плавающей запятой с %f
(%F
использует заглавные буквы):
double
аргумент, представляющий NaN
превращается в один из стилей [-]nan
или [-]nan(n-char-sequence)
- какой стиль, а также значение любого n-char-sequence
, определяется реализацией.
Поэтому достаточно просто проверить, было ли в нем nan
.
Что-то серьезное может уже пойти не так, если у ваших NaN есть знаки. Это не нормально. – user2357112
http://stackoverflow.com/a/8817304/267482 – bobah
Huh. Я думал, что бит знака всегда игнорируется; похоже, что есть системы, которые отображают его. Тогда, наверное, хорошо. – user2357112