【问题标题】:C++11 math library has changed? [duplicate]C++11 数学库变了? [复制]
【发布时间】:2013-02-02 17:12:10
【问题描述】:

可能重复:
round() for float in C++

我在笔记本电脑上使用了 mingw 和 eclipse 以及 c++98。但是在我的电脑上我有 vs2012。

现在有个小问题,数学库好像完全不一样了。

在 c++98 中,我可以使用 math.h 访问 roundM_PI。但是在vs2012中它不再存在了。我进行了google搜索,发现以下参考http://en.cppreference.com/w/cpp/numeric/math/round

round 不在 cmath 中,也不在 math.h 中。我也找不到M_PI

还有其他数学库吗?

【问题讨论】:

  • 对于round(),请参阅外部参考。 C99 在<math.h><tgmath.h> 中都有round(),但是MSVC 仍然实现了没有round() 的过时的C89 标准。 M_PI 是一个 POSIX 扩展。缺少函数和宏对我来说并不奇怪。
  • 如果您在包含<math.h>(或<cmath>)之前定义_USE_MATH_DEFINES,则将定义M_PI。默认情况下未定义它们,因为它们不是 C 或 C++ 语言标准的一部分。 Visual C++ 2012 没有定义 round 函数,它不是 C90 或 C++03 的一部分(通过 C99 标准库,它是 C++11 的一部分,Visual C++ 尚未实现)。

标签: c++ c++11


【解决方案1】:

round()确实在<cmath>中:http://en.cppreference.com/w/cpp/numeric/math/round

M_PI 不是 C 或 C++ 标准的一部分,而是在兼容 POSIX 的系统上提供的。 MinGW 试图模仿 POSIX 环境,因此它提供了这一点。

您可以使用double pi = 4 * std::atan(1); 获得非常好的近似值。

【讨论】:

    【解决方案2】:

    这些是 C++11 中的新功能。 MinGW 之前有它是因为 C 兼容,但是 VS2012 不是 C99 编译器。 M_PI 可能是同一个故事。 IOW,您在 MinGW 中依赖于特定于实现的行为,现在它是标准行为,但 VS 尚未完全升级。

    【讨论】:

      【解决方案3】:

      round 应该<cmath> 标头中(请参阅 C++11 标准的第 26.8 节,表 119),如果不是,则它是一个实现错误。但是,M_PI 常量不是属于 C++11 标准的一部分(参见相同的表 119),尽管某些实现确实提供了它。

      例如,使用 GCC 4.7.2 及其附带的 libstdc++ 实现,此代码可以编译:

      #include <cmath>
      
      int main()
      {
          int x = std::round(M_PI);
      }
      

      确保您对round() 使用std:: 命名空间限定。

      【讨论】:

        猜你喜欢
        • 2021-09-11
        • 1970-01-01
        • 2012-10-17
        • 2022-11-16
        • 2020-08-24
        • 1970-01-01
        • 2020-09-07
        • 2014-05-28
        • 1970-01-01
        相关资源
        最近更新 更多