C ++ 11和C11标准定义了
std::isfinite
功能。 Visual Studio 2012似乎没有提供它作为的一部分
cmath
或math.h
,但有amp_math.h
seems to provide this function。
isfinite
可与std::isfinite
互换吗?该
使用NAN
调用时,文档不会讨论行为
我没有VS编译器来测试它。
答案 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支持是一个完全不同的问题。 )
编辑:除此之外,检查INF
和NaN
的直接方法也可能有效:
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)
的函数中调用,即使行为相同,也无法使其互换。