Вы может получить подписанную NaN, поскольку NaN-Несс величины и знак значений контролируются различными битами в IEEE754 (NaN просто обозначена специальными значения экспонентов, отличных от знакового бита). Я не понимаю, что это за операция.
Это возможно, что один из обычных операций, которые производят NaN может быть причиной отрицательного изменения (например, +0/-0
или +Inf/-Inf
). Но я бы подумал, что NaN будут печатать как nan
независимо от знака.
Однако, хотя стандарт подробно описывает, как обрабатываются номера, странно молчит о том, как они печатаются. В Wikipedia page for NaN перечислены эти:
nan NaN NaN% NAN NaNQ
NaNS qNaN sNaN 1.#SNAN 1.#QNAN
-1.#IND -NaN NaN12345 -sNaN12300
с некоторыми из тех, кто показывает знак и дополнительной полезной нагрузки.
Обратите внимание, что я говорю о стандартах IEEE. Стандарты ISO C указывают на ограниченное количество форм, но независимо от того, печатается ли знак и/или полезная нагрузка, зависит от реализации. Я могу только предположить, что более поздние версии библиотеки изменили свое поведение.
Как исправить это в компиляторе, я не уверен. Я бы просто взял прагматичный подход и запустил выходной файл через что-то вроде sed 's/-nan/nan/g'
. Надеюсь, это не вызовет других проблем.
И вы также должны следить за формой, которая также позволяет печатать полезную нагрузку, хотя я бы только беспокоился об этом, когда тесты снова начнут сбой. Но я бы добавил комментарий около этой команды sed
, указывающий, что это может произойти в будущем. Таким образом, по крайней мере, тот, кто следует за вами, поймет, почему.
Что расчет вы делаете, что приводит к такому значению ? –
Что вы подразумеваете под «подписанным наном»? Вы имеете в виду отрицательный? Внимательно просмотрев статью Википедии, NaNs явно подписаны. –
«cout << 0./0. << endl» результаты «-nan» на всех моих Ubuntu Lucid Lynx Systems и «nan» на Mac OS X Snow Leopard и Ubuntu Hardy Heron. Это все системы x86_64. – Juan