C++11 和 C11 标准定义了
std::isfinite
函数。Visual Studio 2012 似乎没有将其作为
cmathor的一部分提供,
math.h但似乎提供了此功能。amp_math.h
isfinite可以互换吗std::isfinite?该文档没有讨论调用时的行为,NAN
并且我没有 VS 编译器来测试它。
C++11 和 C11 标准定义了
std::isfinite
函数。Visual Studio 2012 似乎没有将其作为
cmathor的一部分提供,
math.h但似乎提供了此功能。amp_math.h
isfinite可以互换吗std::isfinite?该文档没有讨论调用时的行为,NAN
并且我没有 VS 编译器来测试它。
正如Marius已经指出的那样,isfinitefromamp_math.h将用于 C++ AMP,这是一个MS扩展,用于在类似于 CUDA 或 OpenCL 的多核架构上进行并行计算。而且由于这个函数只能在实际的 AMP 受限函数(通常是 GPU 内核)中使用,它对你来说不会有太多的普遍用途。
不幸的是VS 2012不支持 C++11 数学和浮点控制函数。但是一旦你意识到你在VC上并为它实现了特殊代码,你就可以使用_finite(或者更确切地说!_finite) from <float.h>,这是一个MS特定的函数,至少从VS 2003开始就支持它。但请记住,_finite它只需要doubles 并因此转换任何非double参数(尽管VC似乎long double无论如何都没有正确的参数),以及它的所有含义(虽然INFs 和 quiet NaNs 应该毫无问题地转换,我不确定如果捕获信号NaN在转换中也将导致直接调用std::finite)。
VC的标准库具有其他此类功能,以适应它们缺乏 C++11/C99 支持(_isnan诸如此类)。(为什么他们拒绝只删除这些函数前面的下划线并放置一个简单的<cfenv>包装器_controlfp,从而更接近完成 C++11 支持是一个完全不同的问题。)
编辑:除此之外,检查INFs 和NaNs 的直接方法也可能有效:
template<typename T> bool isfinite(T arg)
{
return arg == arg &&
arg != std::numeric_limits<T>::infinity() &&
arg != -std::numeric_limits<T>::infinity();
}
但当然,可能捕获信号 s 具有相同的含义(尽管我不得不承认,我对信号s 的复杂性和一般的浮点异常NaN并不精通)。NaN
isfinitefromamp_math.h只能从标有 的函数中调用restrict(amp),即使行为相同,也不能互换。