Помощь - Поиск - Пользователи - Календарь
Полная версия этой страницы: nan
Форум на CrossPlatform.RU > Разработка > С\С++
nikita
Всем привет! Помогите разобраться : Есть функция которая возвращает значение типа double. На некоторых наборах входных данных она возвращает "nan". Как я понимаю nan = Not A Number. Как проверить является ли значение переменной равным nan? Заранее спасибо!
Алексей1153
http://ru.wikipedia.org/wiki/Nan

Цитата
NaN не равен ни одному другому значению (даже самому себе[2]); соответственно, самый простой метод проверки результата на NaN — это сравнение полученной величины с самой собой.

:)
nikita
Спасибо! Ответ очень помог :)
Алексей1153
кстати, я не проверял, как оптимизатор обойдётся с кодом вида

double a=...;
bool isNan=!(a==a);


может, он решит, что isNan всегда == false
Iron Bug
Цитата(Алексей1153 @ 4.2.2013, 17:12) *
может, он решит, что isNan всегда == false

теоретически, он может так решить, если переменная не меняется. а если она должна меняться извне - то нужен volatile.
Алексей1153
думаю, как процедуру оформить можно
nikita
Я оформил так :
template<typename P_numType>
inline bool isNaN(P_numType a)
  { return (!(a == a)); }


Вроде все работает как нужно)
Litkevich Yuriy
Цитата(Алексей1153 @ 4.2.2013, 16:12) *
bool isNan=!(a==a);
я бы в жизни не допёр, что сия запись значит! Подумал бы, что это ересь.
Алексей1153
nikita, как сказала Iron Bug, необходимо volatile переменные. Только я их в коде никогда не использовал, но предполагаю, что это должно быть атрибутом аргумента - ведь именно его не нужно оптимизировать. Шаблон не нужен - это всё имеет смысл только для вещественных чисел, а float приведётся к double:

bool isNaN(volatile double a)
{
   return !(a == a);
}



Litkevich Yuriy, ну, выглядит как нагромождение знаков, но там как-то так

    double a;
    bool isNan=!a.operator==(a);



И! Апофигиоз: у меня НЕ работает (MinGW) - см картинку. Под cl не пробовал
Нажмите для просмотра прикрепленного файла

Litkevich Yuriy
Цитата(Алексей1153 @ 5.2.2013, 20:54) *
что это должно быть атрибутом аргумента
нет, это квалификатор переменной, т.е.:

volatile double x;
...
bool y = isNaN(x);

Алексей1153
Litkevich Yuriy, попробовал и так - результат такое же
nikita
Кстати, во всем известной стандартной библиотеке <math.h> есть встроенная функция isnan(x) которая прекрасно работает!
Алексей1153
nikita, кстати да, буквально вчера на неё наткнулся
Для просмотра полной версии этой страницы, пожалуйста, пройдите по ссылке.
Форум IP.Board © 2001-2024 IPS, Inc.