У меня проблема со сравнением значения NAN в C ++, Visualstudio. Мне нужно обработать деление по нулю в моем коде. если я получаю деление на ноль, я хочу присвоить результату NAN. Позже проверьте, есть ли у результата NAN. Но сравнение NAN не удается позже, хотя я назначаю quiet_Nan (), как показано ниже.

double d = std::numeric_limits<double>::quiet_NaN();
if( d == std::numeric_limits<double>::quiet_NaN())
{
    cout<<" NAN ";
}
else
{
    cout<<" Number";
}

Я знаю, что плавающие значения нельзя сравнивать на равенство. Я попытался взять разницу между d и quiet_Nan () и попытался сравнить его с плавающим числом с помощью оператора <. Я видел несколько сообщений, но не мог понять, как сравнить двойное значение.

Как узнать наличие значения NAN в переменной типа double?

c++
3
bjskishore123 19 Авг 2010 в 14:52
Обычно есть функция под названием isNan или что-то в этом роде.
 – 
leppie
19 Авг 2010 в 14:55
 – 
kennytm
19 Авг 2010 в 16:02

3 ответа

Лучший ответ

Я не думаю, что текущая стандартная библиотека предоставляет какую-либо реализацию is_nan, которая вам понадобится для использования сторонней библиотеки или собственной

Значения с плавающей запятой можно сравнивать на равенство, это редко бывает полезно, но это одно из тех мест, где это полезно, вам нужно что-то вроде:

template <T>
bool is_nan(T d)
{
  return std::numeric_limits<T>::has_quiet_NaN && d != d;
}

Который проверяет, есть ли у вас соответствующее значение NaN на вашем компьютере, а затем использует тот факт, что NaN! = NaN истинно!

Boost, наверное, должен это где-то предусматривать?

3
jk. 19 Авг 2010 в 15:55

Не имея никакого опыта работы с C ++, но вместо этого:

Если (d == std :: numeric_limits :: quiet_NaN ())

Вам следует позвонить:

Если (std :: numeric_limits :: quiet_isNaN (d))

Если такой метод существует.

Имейте в виду, что если d равно NaN, d == d оценивается как FALSE

2
Riven 19 Авг 2010 в 14:56
Да. is_nan или его языковой эквивалент - это способ. NaN всегда по определению! = Что-то еще, даже само по себе.
 – 
Jakob Borg
19 Авг 2010 в 14:58
Метод quiet_isNan () недоступен. Я использую VS2008.
 – 
bjskishore123
19 Авг 2010 в 15:15
При тестировании не важно, тихая ли это няня. isnan () должно быть достаточно.
 – 
MSalters
19 Авг 2010 в 15:21

Я нашел вашу информацию на странице документации Microsoft:

http://msdn.microsoft.com/en-us/library/w22adx1s.aspx

Попробуйте что-нибудь вроде

if(myDouble != myDouble)
{
   // myDouble is NaN
}
else
{
   // myDouble is NOT NaN
}

Это должно помочь.

0
paercebal 19 Авг 2010 в 15:09