MSVC上的std :: isfinite

时间:2013-01-29 10:00:37

标签: visual-c++ c++11 visual-studio-2012 c11 cmath

C ++ 11和C11标准定义了 std::isfinite 功能。 Visual Studio 2012似乎没有提供它作为的一部分 cmathmath.h,但有amp_math.h seems to provide this function

isfinite可与std::isfinite互换吗?该 使用NAN调用时,文档不会讨论行为 我没有VS编译器来测试它。

2 个答案:

答案 0 :(得分:16)

正如 Marius 已经指出的那样,来自isfinite的{​​{1}}将在C ++ AMP中使用,这是 MS 的扩展名类似于CUDA或OpenCL的多核架构上的并行计算。由于此功能只能用于实际的AMP限制功能(通常是GPU内核),因此对您来说不是很常用。

不幸的是 VS 2012 不支持C ++ 11数学和浮点控制功能。但是,一旦您认识到自己在 VC 并为其实现特殊代码,您就可以使用amp_math.h中的_finite(或更确切地说!_finite)至少从 VS 2003 开始支持 MS -secific功能。但请记住,<float.h>仅需_finite次,因此会转换任何非double个参数(尽管 VC 似乎没有double long double 1}}无论如何)及其所有含义(虽然INF s和quiet NaN s应该没有问题地转换,但我不确定是否在信号NaN中捕获直接调用std::finite)也会导致转换。

VC 的标准库有other such functions以适应他们缺乏C ++ 11 / C99支持(如_isnan等)。 (为什么他们拒绝在这些函数前面删除那个下划线并在<cfenv>附近放置一个简单的_controlfp包装器,因此更接近完成C ++ 11支持是一个完全不同的问题。 )

编辑:除此之外,检查INFNaN的直接方法也可能有效:

template<typename T> bool isfinite(T arg)
{
    return arg == arg && 
           arg != std::numeric_limits<T>::infinity() &&
           arg != -std::numeric_limits<T>::infinity();
}

但当然有可能陷入信号NaN s的相同含义(尽管我不得不承认我并不精通信号NaN和浮点异常的错综复杂一般而言。

答案 1 :(得分:5)

来自isfinite的{​​p> amp_math.h只能从标有restrict(amp)的函数中调用,即使行为相同,也无法使其互换。