C++11,14,17或20是否为pi引入了一个标准常数?

v440hwme  于 2023-02-14  发布在  其他
关注(0)|答案(6)|浏览(267)

C和C中的数字pi有一个相当愚蠢的问题。据我所知,在math.h中定义的M_PI不是任何标准所要求的。
新的C
标准在标准库中引入了许多复杂的数学-双曲函数、std::hermitestd::cyl_bessel_i、不同的随机数生成器等等。
有没有任何“新”标准为圆周率引入了常数?如果没有-为什么?没有它,所有这些复杂的数学如何工作?
我知道C中关于pi的类似问题(它们是几年前的标准);我想知道这个问题的现状。
我也很感兴趣 * 为什么哦为什么 * C
仍然没有一个pi常数,但有很多更复杂的数学。
我知道我可以自己把pi定义为4*atan(1),或者acos(-1),或者double pi = 3.14;,当然,但是为什么我还要这么做呢?没有pi,标准的数学函数怎么工作呢?

xmakbtuz

xmakbtuz1#

C17 * pi * 之前(包括C17 * pi *)并不是引入到语言中的常量,它是一个令人头痛的问题。
我很幸运,因为我使用boost,他们用足够多的小数位来定义 * pi ,即使是128位的long double
如果你不使用Boost,那么你可以自己硬编码。用三角函数定义它是很诱人的,但是如果你这样做了,你就不能把它变成constexpr。三角函数的准确性也没有我所知道的任何标准(
cf *. std::sqrt)来保证,所以你真的是在危险的地方依赖这样的函数。
有一种方法可以使用元编程来获取 * pi * 的constexpr值:参见https://web.archive.org/web/20200629174939/http://timmurphy.org/2013/06/27/template-metaprogramming-in-c/
来自C20的一些好消息。pi * 的一个定义。C20在<numbers>中添加了一些数学常数。例如std::numbers::pidouble类型。
参考:https://en.cppreference.com/w/cpp/numeric/constants

5f0d552i

5f0d552i2#

直到C++20,没有,没有一个标准引入常数来表示number pi(π),你可以在代码中近似计算:

constexpr double pi = 3.14159265358979323846;

其他语言如C#have在其库中声明常量。

    • 更新:**从C++20开始,<numbers>头文件中确实声明了一个pi常量。std::numbers::pi.
56lgkhnf

56lgkhnf3#

M_PI由“标准”定义,如果不是 * 语言 * 标准:带有X/Open System Interfaces扩展的POSIX(官方UNIX品牌通常支持和要求此扩展)。
同时,C20确实有such constants(合并在上一轮C20特性中),具体来说,有std::numbers::pi(类型为double)和变量模板,如果你想要不同的浮点类型,比如std::numbers::pi_v<float>,你可以使用变量模板。

watbbzwu

watbbzwu4#

正如其他人所说,没有std::pi,但如果你想要精确的PI值,你可以用途:

constexpr double pi = std::acos(-1);

这里假设您的C++实现从acos(-1.0)生成了一个正确舍入的PI值,这很常见,但不能保证。
它不是constexpr,但实际上像gcc和clang这样的优化编译器会在编译时计算它,尽管声明它为const对于优化器的工作很重要。

pkmbmrz7

pkmbmrz75#

这显然不是一个好主意,因为没有明显的类型来定义跨域通用的pi。
当然,Pi是一个无理数,所以它不能用 * 任何 * C类型来正确表示。因此,你可能会认为最自然的方法是用可用的最大浮点类型来定义它。然而,最大的标准浮点类型long double的大小不是由C标准定义的,所以常量的值在不同的系统之间会有所不同。更糟糕的是,对于其中工作类型不是该最大类型的任何程序,pi的定义将是不适当的,因为它将对pi的每次使用强加性能成本。
对于任何程序员来说,找到pi的值并定义自己适合使用的常量也是微不足道的,因此将其包含在数学头中并没有提供任何巨大的优势。

vjhs03f7

vjhs03f76#

编辑-删除必要的术语,因为它被证明是有争议的。它是一个太多的绝对术语。
C++是一种庞大而复杂的语言,因此标准委员会只包括那些"强烈要求“的东西。尽可能多的东西留给了非语言标准库...比如Boost。
boost::math::constants

相关问题