代码之家  ›  专栏  ›  技术社区  ›  Jan Schultke

我能在GCC和Clang中为单个函数启用严格的浮点行为吗?

  •  1
  • Jan Schultke  · 技术社区  · 4 年前

    我有以下功能:

    template <typename Float, std::enable_if_t<std::is_floating_point_v<Float>, int> = 0>
    constexpr Float inf2nan(Float x)
    {
        static_assert(std::numeric_limits<Float>::is_iec559);
        return x * 0 + x;
    }
    

    NaN 如果输入是无穷大,否则只输入。 不幸的是,使用 -ffast-math 带有GCC的标志将其优化为 ret

    return std::isinf(x) ? std::numeric_limits<Float>::quit_NaN() : x;
    

    但是GCC和clang并没有优化到与我的函数相同的输出。

    有没有一种方法(通过注释或宏)为一个变量或函数启用严格的浮点数学,类似于Java的 strictfp

    1 回复  |  直到 4 年前
        1
  •  3
  •   t.niese    4 年前

    具体如何做到这一点取决于你的工具链。在CMake中,您可以创建 OBJECT 图书馆,和链接 包含可执行文件的库。在make文件中,也应该直接执行该操作。