我正在尝试编写一个使用std::isnan()
和MSVC 2010的程序。我包含cmath
但不幸的是编译器返回错误:
isnan不是std命名空间的一部分
MSVC 2010是否支持std(AKA C ++ 11)中的此功能?
答案 0 :(得分:4)
std::isnan
中的 <cmath>
:http://en.cppreference.com/w/cpp/numeric/math/isnan
你的问题可能是VS2010,它支持很差的C ++ 11。我建议在这方面更好地抓住VS2015 很多。
可以看出here VS2010只有_isnan
。
答案 1 :(得分:1)
不幸的是,在complete版本之前,Visual Studio的C ++ 11支持并不是2015,因此您无法使用C ++ std::isnan
功能。有趣的是,有一个C99 isnan
宏,但它的实现已定义,VS 2010似乎没有任何这些宏。幸运的是,MS系列编译器确实具有_isnan
功能的MS特定_
版本。所以你可以自己编写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不是NaN
1.#QNAN是NaN
请注意,_isnanf
适用于64位应用程序,而_WIN64
宏可能未必定义,因此如果您定位64位,请务必进行调整。
希望可以提供帮助。