Страницы

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

воскресенье, 1 марта 2020 г.

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

#cpp #c #qt


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


Ответы

Ответ 1



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

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

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