MSVC上的std :: isfinite

pmr*_*pmr 10 cmath visual-c++ c++11 c11 visual-studio-2012

C++ 11和C11标准定义了 std :: isfinite 函数.的Visual Studio 2012似乎并没有提供它的一部分 cmathmath.h,但amp_math.h似乎提供了这一功能.

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

Chr*_*ica 17

正如Marius已经指出的那样,isfinitefrom amp_math.h将用于C++ AMP,它是类似于CUDA或OpenCL的多核架构上的并行计算的MS扩展.由于此功能只能用于实际的AMP限制功能(通常是GPU内核),因此对您来说不是很常用.

不幸的是,VS 2012不支持C++ 11数学和浮点控制功能.但是一旦你认识到你在VC上并为它实现特殊代码,你就可以使用_finite(或者更确切地说!_finite)from <float.h>,这是至少从VS 2003开始支持的MS- secific功能.但请记住,只需要s并因此转换任何非参数(尽管VC看起来似乎没有正确的),其所有含义(虽然s和quiet s应该没有问题地转换,我不确定如果转换中的信号捕获也是由直接调用产生的)._finitedoubledoublelong doubleINFNaNNaNstd::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();
}
Run Code Online (Sandbox Code Playgroud)

但当然有可能陷入信号NaNs 的相同含义(尽管我不得不承认我并不精通信号NaNs和浮点异常的复杂性).

  • 好吧,这让我很头疼,只能使用http://www.boost.org/doc/libs/1_52_0/libs/math/doc/sf_and_dist/html/math_toolkit/utils/fpclass.html (2认同)

Mar*_*ila 5

isfinitefrom amp_math.h只能从标记为的函数调用restrict(amp),即使行为相同,也不能使它可互换.