C++11 和 C11 标准定义了
std::isfinite
功能。 Visual Studio 2012 似乎没有提供它作为cmath
或 math.h
,但有 amp_math.h
哪一个
seems to provide this function .
是isfinite
可与 std::isfinite
互换?这
文档没有讨论使用 NAN
调用时的行为
而且我没有 VS 编译器来测试这个。
最佳答案
正如 Marius 已经指出的那样,isfinite
来自 amp_math.h
将在 C++ AMP 中使用,这是一个 MS 扩展,用于在类似于 CUDA 或 OpenCL 的多核架构上进行并行计算。而且由于此函数只能用于实际的 AMP 受限函数(通常是 GPU 内核),因此对您来说没有多大用处。
不幸的是,VS 2012 不支持 C++11 数学和浮点控制函数。但是一旦你意识到你在 VC 上并为它实现了特殊的代码,你就可以使用 _finite
(或者更确切地说 !_finite
)来自 <float.h>
,这是至少从 VS 2003 开始支持的 MS 特定功能。但请记住 _finite
只需要double
s 并因此转换任何非 double
参数(尽管 VC 似乎没有合适的 long double
),以及它的所有含义(而 INF
s 和安静的 NaN
s 应该毫无问题地转换,我不确定是否在转换中的信号 NaN
也可能是直接调用 std::finite
引起的)。
VC的标准库有other such functions以适应他们缺乏 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();
}
但当然具有相同的含义,可能会捕获信号
NaN
s(尽管我不得不承认我对信号 NaN
s 和一般浮点异常的复杂性并不那么精通)。
关于visual-c++ - MSVC 上的 std::isfinite,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/14580168/