Имя пользователя:
Пароль:  
Помощь | Регистрация | Забыли пароль?  | Правила  

Компьютерный форум OSzone.net » Программирование, базы данных и автоматизация действий » Программирование и базы данных » NaN via C++

Ответить
Настройки темы
NaN via C++
pva pva вне форума

Аватара для pva

Ветеран


Сообщения: 1180
Благодарности: 279

Профиль | Отправить PM | Цитировать


Использую NaN для разметки области определения функции на плоскости. Удобно, т.к. любая арифметическая операция с ним даёт NaN, а сравнение false. Короче, всегда известно, когда вызезаю за границы множества при свёртках.
Проблема в том, что проверить результат NaN удаётся не всегда (особенно в релизе).
Код: Выделить весь код
double f = numeric_limits<double>::quiet_NaN();
bool test = (0<f && f<=0);
не прокатывает, т.к. компилятор считает меня идиотом и оптимизирет test=false;
Есть ли в C++ способ проверить на NaN?

Отправлено: 12:46, 16-07-2004

 

Аватара для hasherfrog

Старый параноик


Сообщения: 2423
Благодарности: 85

Профиль | Отправить PM | Цитировать


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

Отправлено: 13:39, 16-07-2004 | #2



Для отключения данного рекламного блока вам необходимо зарегистрироваться или войти с учетной записью социальной сети.

Если же вы забыли свой пароль на форуме, то воспользуйтесь данной ссылкой для восстановления пароля.

pva pva вне форума Автор темы

Аватара для pva

Ветеран


Сообщения: 1180
Благодарности: 279

Профиль | Отправить PM | Цитировать


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

Отправлено: 14:40, 16-07-2004 | #3


Аватара для hasherfrog

Старый параноик


Сообщения: 2423
Благодарности: 85

Профиль | Отправить PM | Цитировать


pva
Залезьте в stl/limits и посмотрите, как определяется nanq. По идее, Вы всегда можете сравнить своё число с nanq:
Код: Выделить весь код
if (fSomeValue == numeric_limits<double>::quiet_NaN) ...
Разве нет?
Потом, есть же isnan()

Отправлено: 15:17, 16-07-2004 | #4

pva pva вне форума Автор темы

Аватара для pva

Ветеран


Сообщения: 1180
Благодарности: 279

Профиль | Отправить PM | Цитировать


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

Отправлено: 15:33, 16-07-2004 | #5


Пользователь


Сообщения: 135
Благодарности: 0

Профиль | Отправить PM | Цитировать


Цитата:
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>

Отправлено: 03:26, 17-07-2004 | #6

pva pva вне форума Автор темы

Аватара для pva

Ветеран


Сообщения: 1180
Благодарности: 279

Профиль | Отправить PM | Цитировать


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

Отправлено: 12:40, 19-07-2004 | #7



Компьютерный форум OSzone.net » Программирование, базы данных и автоматизация действий » Программирование и базы данных » NaN via C++

Участник сейчас на форуме Участник сейчас на форуме Участник вне форума Участник вне форума Автор темы Автор темы Шапка темы Сообщение прикреплено

Похожие темы
Название темы Автор Информация о форуме Ответов Последнее сообщение
Теория - Паскаль и NaN ManHack Программирование и базы данных 9 20-01-2009 15:57




 
Переход