Страницы

Поиск по вопросам

четверг, 16 мая 2019 г.

Почему std::isnan() возвращает false для переменной double равной NAN?

Я решил использовать в качестве дефолтного значения параметра функции NAN(так же пробовал std::numeric_limits::quiet_NaN()), но когда попытался проверить его с помощью std::isnan, функция вернула false. В то же время я выводил значение переменной с помощью qDebug() в консоль, где напечаталось значение - nan
Так же пробовал проверить на NAN используя правило нанов, которое голасит, что NAN всегда не равен NAN. Это сработало для неравнества NAN != NAN, но не для x != x. Во втором случае результат был отрицательный.
Последней попыткой было определение переменной внутри используемой функции со значением NAN и проверка ее обоими способами на равенство NAN. Результаты те же, false.
Совершенно не могу понять в чем может быть дело.
Пример:
double abc = NAN; qDebug()<< abc << (abc != abc) << std::isnan(abc);
Вывод:
nan false false
UPD: Проверил возможность такого использования NAN на cpp.sh и там все оказалось хорошо. Пока что думаю, что может быть не так с проектом.


Ответ

Проблему вызывает использование -ffast-math. Я не знал, что мы используем ее в нашем проекте. Для данной проблемы нет решения, если вы используете -ffast-math. Не используйте NAN в паре с быстрой математикой.

Комментариев нет:

Отправить комментарий