В том же mingw 5.4.0 выражение "sin( sqrt( -3.14 ) )" вполне себе вычисляется и возвращает значение "-0.00159265", которое выглядит вполне нормальным и не NaN.
Ну что же Вы аргументируете
багами конкретного компилятора? Некорректно
Что касается альтернативы
C++ (Qt)
errno = 0;
float b = sqrt(a);
if (errno == EDOM) ...
Что-то мне совсем не хочется так делать в рабочем коде. Это надо "окружать", разбираться (а вдруг не EDOM а что-то другое?), да и парочка вызовов errno что-то потянет в число-дробилке. В общем, обычная "рекомендация для других", сам рекомендующий вряд ли будет ей следовать
Скажу более конкретно:
!(w>=0) - это НЕ проверка на Nan, а лишь желание положиться на определенное поведение компилятора (которому он совершенно не обязан следовать), причем абсолютно не переносимое. Чем это лучше того, что человек вообще не проверит входные данные?
Поэтому говно, однозначно.
"совершенно", "абсолютно" - никогда не верьте таким "превосходным степеням", это банальная попытка "взять на понт" - и ничего более
Пользуюсь этим приемом со времен CodeWarrior, сколько компиляторов за это время сменил - не считал, ну может десяток. Пока проблем не было. Да и чего это я не должен верить справочнику
If the implementation supports IEEE floating-point arithmetic (IEC 60559),
If the argument is less than -0, FE_INVALID is raised and NaN is returned.
Ах, возможно я буду работать на платформе где не поддерживается IEC 60559!! Ну если доживу до этого - тогда и буду разбираться