【问题标题】:MSVC equivalent to GCC's -fno-finite-math-only?MSVC 相当于 GCC 的 -fno-finite-math-only?
【发布时间】:2016-10-21 16:17:08
【问题描述】:

在 GCC 上,我们启用 -ffast-math 以加快浮点计算。但是由于我们依赖 NaN 和 Inf 浮点值的正确行为,我们也打开了-fno-finite-math-only,因此假设值不是 NaN/Inf 的优化

对于 MSVC,-ffast-math 的“等价物”显然是 /fp:fast。然而,就像 GCC 的 -ffast-math,它 also includes 假设 Nan/Inf 不存在的优化。 (重要的是,似乎 std::isnan() 之类的测试不能保证给出“准确”的结果。)

是否有 MSVC C++ 编译选项允许您利用大部分 /fp:fast 优化,但仍“正确”处理 NaN 和 Inf 值? (或者至少,保证像 std::isnan()/std::isinf() 这样的测试如果碰巧生成了 NaN/Inf。)

【问题讨论】:

  • 您很可能找不到这样的开关。据我所知,添加到编译器的每个开关都会使 Microsoft 方面的测试工作加倍。这就是他们现在非常不愿意添加新开关的原因。

标签: c++ visual-c++ ieee-754


【解决方案1】:
guarantees that tests like std::isnan()/std::isinf()

与 GCC 不同,MSVC (CL RC 19) 实际上并未在 /fp:fast 设置上优化 std::isnan

另一个永远不会优化的替代方法是调用 C99 isnan 或 MSVC 内在函数 _isnanf。或者针对已知的位掩码滚动您自己的nan 测试,该位掩码可以使用std::numeric_limits::quiet_NaN 生成。

见: https://godbolt.org/g/YdZJq5

【讨论】:

    猜你喜欢
    • 2016-11-11
    • 1970-01-01
    • 2018-07-12
    • 1970-01-01
    • 1970-01-01
    • 2011-05-12
    • 2019-12-31
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多