在MSVC 2010中,isnan()在哪里?

时间:2016-07-18 16:26:51

标签: c++ std

我正在尝试编写一个使用std::isnan()和MSVC 2010的程序。我包含cmath但不幸的是编译器返回错误:

  

isnan不是std命名空间的一部分

MSVC 2010是否支持std(AKA C ++ 11)中的此功能?

2 个答案:

答案 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位,请务必进行调整。

希望可以提供帮助。