visual-c-std :: isfinite在MSVC上

C 11和C 11标准定义了
std::isfinite
功能. Visual Studio 2012似乎并没有提供它作为的一部分
cmath或math.h,但是有amp_math.h
seems to provide this function.

isd是否与std :: isfinite可互换?该
文档并不涉及使用NAN调用时的行为
我没有一个VS编译器来测试这个.

解决方法

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

不幸VS 2012不支持C11数学和浮点控制功能.但是,一旦你认识到你在VC上实现了特殊的代码,你可以使用< float.h>中的_finite(或者更确切地说,_finite),这是至少VS 2003所支持的MS-secific功能.但是请记住,_finite只需要双倍,因此转换任何非双参数(尽管VC似乎没有适当的长双重),其所有的含义(而INF和安静的NaN应该被转换没有问题,m不知道在转换中的信号NaN上的陷阱是否也是直接调用std ::有限的).

VC的标准库有other such functions,因为缺乏C11 / C99支持(如_isnan等). (为什么他们拒绝在这功能前面删除那个下划线,并在_controlfp周围放置一个简单的< cfenv>包装器,从而更接近完成C 11的支持一个完全不同的问题.)

编辑:除此之外,检查INF和NaNs的直接方法也可能会起作用:

template<typename T> bool isfinite(T arg)
{
    return arg == arg && 
           arg != std::numeric_limits<T>::infinity() &&
           arg != -std::numeric_limits<T>::infinity();
}

但是,当然也有可能陷入信号NaN的同样的暗示(尽管我不得不承认,我不太熟悉信号NaNs和浮点异常的复杂性).

相关文章

本程序的编译和运行环境如下(如果有运行方面的问题欢迎在评...
水了一学期的院选修,万万没想到期末考试还有比较硬核的编程...
补充一下,先前文章末尾给出的下载链接的完整代码含有部分C&...
思路如标题所说采用模N取余法,难点是这个除法过程如何实现。...
本篇博客有更新!!!更新后效果图如下: 文章末尾的完整代码...
刚开始学习模块化程序设计时,估计大家都被形参和实参搞迷糊...