【问题标题】:std::isfinite on MSVCMSVC 上的 std::isfinite
【发布时间】:2013-01-12 20:41:05
【问题描述】:

C++11 和 C11 标准定义了 std::isfinite 功能。 Visual Studio 2012 似乎没有将它作为 cmathmath.h,但有 amp_math.h 哪个 seems to provide this function

isfinite 可以与std::isfinite 互换吗?这 当使用NAN 调用时,文档没有讨论该行为 而且我没有 VS 编译器来测试这个。

【问题讨论】:

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


    【解决方案1】:

    正如Marius 已经指出的,来自amp_math.hisfinite 将用于C++ AMP,这是一个MS 扩展,用于在许多平台上进行并行计算- 类似于 CUDA 或 OpenCL 的核心架构。而且由于这个函数只能在实际的 AMP 受限函数(通常是 GPU 内核)中使用,所以它对你来说没有太多的普遍用途。

    很遗憾 VS 2012 不支持 C++11 数学和浮点控制函数。但是一旦你意识到你在 VC 上并为它实现了特殊的代码,你就可以使用<float.h> 中的_finite(或者更确切地说是!_finite),这是一个MS - 至少从 VS 2003 开始支持特定功能。但请记住,_finite 只接受 doubles 并因此转换任何非 double 参数(尽管 VC 似乎无论如何都没有合适的 long double),所有它的含义(虽然INFs 和安静的NaNs 应该毫无问题地转换,但我不确定在转换中捕获信号NaN 是否也会由于直接调用std::finite 而导致) .

    VC 的标准库有 other such functions 以适应它们缺乏对 C++11/C99 的支持(如 _isnan 等)。 (为什么他们拒绝只删除这些函数前面的下划线并在 _controlfp 周围放置一个简单的 <cfenv> 包装器,从而更接近完成 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();
    }
    

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

    【讨论】:

    • 好吧,这已经够让人头疼的了,我只好用boost.org/doc/libs/1_52_0/libs/math/doc/sf_and_dist/html/…
    • 也许这是不言而喻的,但是您在编辑中的isfinite 函数非常具有C++-specific。
    • @patrickvacek 没错,但 Visual Studio 无论如何都没有合理的 C 支持。我看到答案只解决了问题的 C++ 部分,但 OP 似乎知道这两种语言,因此如果需要,应该能够推断出答案的 C 版本。
    【解决方案2】:

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

    【讨论】:

    • 您的答案是正确的,但 Christian Rau 对替代可能性的阐述使其成为更好的答案。我的未充分说明的问题有错,而不是你的答案。
    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2013-06-22
    • 1970-01-01
    • 1970-01-01
    • 2017-08-13
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多