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