visual-c++ - MSVC 上的 std::isfinite

标签 visual-c++ c++11 visual-studio-2012 c11 cmath

C++11 和 C11 标准定义了
std::isfinite
功能。 Visual Studio 2012 似乎没有提供它作为cmathmath.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/

相关文章:

c++ - 泛型枚举和其他类型的重载模板函数

c++ - 为什么C++标准要求std::partition来满足不同类型迭代器的不同复杂度?

c++ - 如何调用另一个对话框(Win32 应用程序)

c++ - 引用保留名称肯定是非法的吗?

visual-studio-2012 - 启动后,Visual Studio 2012 不会打开以前打开的文件

visual-studio - 让 PC-lint 与 Visual Studio 一起使用

c++ - 为什么此 C++ 代码会导致运行时错误?

c++ - 在 C++ 中读取磁盘中文件的最快方法是什么?

visual-studio - Visual Studio编译输出格式

c++ - CoCreateInstance 返回 E_NOINTERFACE 即使找到接口(interface)