Компьютерный форум OSzone.net  

Компьютерный форум OSzone.net (http://forum.oszone.net/index.php)
-   Программирование и базы данных (http://forum.oszone.net/forumdisplay.php?f=21)
-   -   NaN via C++ (http://forum.oszone.net/showthread.php?t=29582)

pva 16-07-2004 12:46 204743

Использую 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 204744

Обсуждалось как-то мимоходом :).

pva 16-07-2004 14:40 204745

Круто! ...только сейчас я понял, что
Цитата:

Обсуждалось как-то мимоходом
не совсем то, что нужно.
  • во-первых используются указатели (ссылки), т.е. число должно лежать в памяти (я это конечно использую, спасибо), но хочется ещё и в fpu или XMM это делать.
  • во-вторых, то, что там написано - это ассемблер с человеческим лицом, а не C++. Наверняка если есть numeric_limits<double>::quiet_NaN() то и проверка на него есть (в хелпе не нашёл).
  • я уповаю на компилятор, что он найдёт наиболее правильный код (дескать я так не смогу) для реализации подобной проверки, тем более, что в других случаях подобных прецендентов было немало.

hasherfrog 16-07-2004 15:17 204746

pva
Залезьте в stl/limits и посмотрите, как определяется nanq. По идее, Вы всегда можете сравнить своё число с nanq:
Код:

if (fSomeValue == numeric_limits<double>::quiet_NaN) ...
Разве нет?
Потом, есть же isnan()

pva 16-07-2004 15:33 204747

В том то и дело, что результат проверок с NaN всегда false! А isnan() посмотрю...

bilytur 17-07-2004 03:26 204748

Цитата:

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> :)

pva 19-07-2004 12:40 204749

Действительно, нашёл isnan во всех компиляторах и в т.ч. в линуксе, попробовал - помогло, посмотрел как сделано - также как в
Цитата:

Обсуждалось как-то мимоходом
. Так что всем спасибо, извините за критику.
исходник - самое лучшее доказательство


Время: 22:59.

Время: 22:59.
© OSzone.net 2001-