C 11、14、17 或 20 是否为 pi 引入了标准常数?

新手上路,请多包涵

C 和 C++ 中的数字 pi 存在一个相当愚蠢的问题。据我所知 M_PI 定义在 math.h 不是任何标准所要求的。

新的 C++ 标准在标准库中引入了许多复杂的数学 - 双曲函数、 std::hermitestd::cyl_bessel_i 、不同的随机数生成器等等。

是否有任何“新”标准为 pi 带来了常数?如果不是 - 为什么?没有它,所有这些复杂的数学如何运作?

我知道关于 C++ 中 pi 的类似问题(它们已经有好几年了,而且标准已经老了);我想知道问题的当前状态。

我也对 为什么 C++ 仍然没有 pi 常数但有很多更复杂的数学很感兴趣。

我知道我可以将 pi 自己定义为 4*atan(1)acos(-1)double pi = 3.14; 。当然。但是我为什么还要这样做呢?没有 pi,标准数学函数如何工作?

原文由 Amomum 发布,翻译遵循 CC BY-SA 4.0 许可协议

阅读 1.4k
2 个回答

直到并包括 C++17 pi 并不是引入该语言的常量,它是一个令人头疼的问题。

我很幸运,因为我使用了 boost ,他们为 pi 定义了足够多的小数位数,即使是 128 位 long double

如果您不使用 Boost,请自行对其进行硬编码。用三角函数定义它很诱人,但如果你这样做,你就不能让它成为 constexpr 。我所知道的任何标准也不能保证三角函数的准确性( 参见 std::sqrt ),所以你确实处于危险的境地,确实依赖这样的函数。

有一种使用元编程获得 constexpr pi 值的方法:请参阅 http://timmurphy.org/2013/06/27/template-metaprogramming-in-c/


来自 C++20 的一些好消息。 pi 一个定义。 C++20 在 <numbers> 中添加了一些数学常数。例如 std::numbers::pidouble 类型。

参考: https ://en.cppreference.com/w/cpp/numeric/constants

原文由 Bathsheba 发布,翻译遵循 CC BY-SA 4.0 许可协议

M_PI 由“标准”定义,如果不是 语言 标准:带有 X/Open System Interfaces 扩展的 POSIX (这是官方 UNIX 品牌非常普遍支持和要求的)。

与此同时,C++20 确实有 这样的常量(在最后一轮 C++20 特性中合并)。具体来说,有 std::numbers::pi (类型为 double )和一个变量模板,如果您想要不同的浮点类型,可以使用它,例如 std::numbers::pi_v<float>

原文由 Davis Herring 发布,翻译遵循 CC BY-SA 4.0 许可协议

撰写回答
你尚未登录,登录后可以
  • 和开发者交流问题的细节
  • 关注并接收问题和回答的更新提醒
  • 参与内容的编辑和改进,让解决方法与时俱进
推荐问题