К сожалению, поддержка Visual C++ 11 не была такой complete до версии 2015, поэтому вы не сможете использовать функциональность C++ std::isnan
. Интересно, что есть макрос C99 isnan
, но его реализация определена, и VS 2010, похоже, не имеет ни одного из этих макросов. К счастью, MS-линия компиляторов имеет свои специфичные для MS _
версии _isnan
. Таким образом, вы можете написать свой собственный isnan
как таковой:
#include <iostream>
#include <cmath>
#include <cfloat>
#include <limits>
namespace non_std
{
template < typename T >
bool isnan(T val)
{
#if defined(_WIN64)
// x64 version
return _isnanf(val) != 0;
#else
return _isnan(val) != 0;
#endif
}
}
int main(int argc, char** argv)
{
float value = 1.0f;
std::cout << value << " is " <<
(non_std::isnan(value) ? "NaN" : "NOT NaN") << std::endl;
if (std::numeric_limits<float>::has_quiet_NaN) {
value = std::numeric_limits<float>::quiet_NaN();
std::cout << value << " is " <<
(non_std::isnan(value) ? "NaN" : "NOT NaN") << std::endl;
}
return 0;
}
На моей машине это выводит:
1 is NOT NaN
1.#QNAN is NaN
Обратите внимание, что _isnanf
для 64-битных приложений и _WIN64
макрос не обязательно может быть поэтому, если вы нацеливаете 64 бит, обязательно настройте это.
Надеюсь, что это поможет.
MSVC 2010 не очень похожа на C++ 11. Их самая совместимая версия - 2015 год. – NathanOliver
@NathanOliver, к сожалению, на данный момент я застрял в 2010 году. Любой намек на исправление? – Igor
@BatCoder, ничего не публиковать. Я просто написал 'if (std :: isnan (x))' и получил вышеупомянутую ошибку. – Igor