Показать полную графическую версию : NaN via C++
Использую NaN для разметки области определения функции на плоскости. Удобно, т.к. любая арифметическая операция с ним даёт NaN, а сравнение false. Короче, всегда известно, когда вызезаю за границы множества при свёртках.
Проблема в том, что проверить результат NaN удаётся не всегда (особенно в релизе).
double f = numeric_limits<double>::quiet_NaN();
bool test = (0<f && f<=0);
не прокатывает, т.к. компилятор считает меня идиотом и оптимизирет test=false;
Есть ли в C++ способ проверить на NaN?
hasherfrog
16-07-2004, 13:39
Обсуждалось (http://forum.oszone.net/topic.cgi?forum=18&topic=1303&start=0#8) как-то мимоходом :).
Круто! ...только сейчас я понял, что Обсуждалось как-то мимоходом не совсем то, что нужно.
во-первых используются указатели (ссылки), т.е. число должно лежать в памяти (я это конечно использую, спасибо), но хочется ещё и в fpu или XMM это делать.
во-вторых, то, что там написано - это ассемблер с человеческим лицом, а не C++. Наверняка если есть numeric_limits<double>::quiet_NaN() то и проверка на него есть (в хелпе не нашёл).
я уповаю на компилятор, что он найдёт наиболее правильный код (дескать я так не смогу) для реализации подобной проверки, тем более, что в других случаях подобных прецендентов было немало.
hasherfrog
16-07-2004, 15:17
pva
Залезьте в stl/limits и посмотрите, как определяется nanq. По идее, Вы всегда можете сравнить своё число с nanq:if (fSomeValue == numeric_limits<double>::quiet_NaN) ...Разве нет?
Потом, есть же isnan()
В том то и дело, что результат проверок с NaN всегда false! А isnan() посмотрю...
int _isnan(double x);
_isnan returns a nonzero value if the argument x is a NAN; otherwise it returns 0.
есть еще
int _finite(double x);
_finite returns a nonzero value if its argument x is not infinite, that is, if -INF < x < +INF. It returns 0 if the argument is infinite or a NAN.
незабуть инклудануть <float.h> :)
Действительно, нашёл isnan во всех компиляторах и в т.ч. в линуксе, попробовал - помогло, посмотрел как сделано - также как в Обсуждалось как-то мимоходом. Так что всем спасибо, извините за критику.
исходник - самое лучшее доказательство
© OSzone.net 2001-2012
vBulletin v3.6.4, Copyright ©2000-2025, Jelsoft Enterprises Ltd.