У меня проблема со сравнением значения 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?
3 ответа
Я не думаю, что текущая стандартная библиотека предоставляет какую-либо реализацию is_nan, которая вам понадобится для использования сторонней библиотеки или собственной
Значения с плавающей запятой можно сравнивать на равенство, это редко бывает полезно, но это одно из тех мест, где это полезно, вам нужно что-то вроде:
template <T>
bool is_nan(T d)
{
return std::numeric_limits<T>::has_quiet_NaN && d != d;
}
Который проверяет, есть ли у вас соответствующее значение NaN на вашем компьютере, а затем использует тот факт, что NaN! = NaN истинно!
Boost, наверное, должен это где-то предусматривать?
Не имея никакого опыта работы с C ++, но вместо этого:
Если (d == std :: numeric_limits :: quiet_NaN ())
Вам следует позвонить:
Если (std :: numeric_limits :: quiet_isNaN (d))
Если такой метод существует.
Имейте в виду, что если d равно NaN, d == d оценивается как FALSE
is_nan
или его языковой эквивалент - это способ. NaN всегда по определению! = Что-то еще, даже само по себе.
Я нашел вашу информацию на странице документации Microsoft:
http://msdn.microsoft.com/en-us/library/w22adx1s.aspx
Попробуйте что-нибудь вроде
if(myDouble != myDouble)
{
// myDouble is NaN
}
else
{
// myDouble is NOT NaN
}
Это должно помочь.
Похожие вопросы
Новые вопросы
c++
C++ — это язык программирования общего назначения. Изначально он разрабатывался как расширение C и имел аналогичный синтаксис, но теперь это совершенно другой язык. Используйте этот тег для вопросов о коде, который будет скомпилирован с помощью компилятора C++. Используйте тег версии для вопросов, связанных с конкретной стандартной версией [C++11], [C++14], [C++17], [C++20] или [C++23]. и т.д.
isNan
или что-то в этом роде.