10

C++11 和 C11 标准定义了 std::isfinite 函数。Visual Studio 2012 似乎没有将其作为 cmathor的一部分提供, math.h似乎提供了此功能amp_math.h

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

4

2 回答 2

18

正如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

于 2013-01-29T11:42:59.663 回答
5

isfinitefromamp_math.h只能从标有 的函数中调用restrict(amp),即使行为相同,也不能互换。

于 2013-01-29T10:23:48.577 回答