C++;11、14、17或20引入pi的标准常数? 在C和C++中,数字PI有一个相当愚蠢的问题。据我所知,math.h中定义的M_PI不是任何标准所要求的 新C++标准在标准库中引入了大量复杂的数学函数——双曲函数, STD::Hermite 和 STD::Cyras-BeelelsI,不同的随机数生成器等。

C++;11、14、17或20引入pi的标准常数? 在C和C++中,数字PI有一个相当愚蠢的问题。据我所知,math.h中定义的M_PI不是任何标准所要求的 新C++标准在标准库中引入了大量复杂的数学函数——双曲函数, STD::Hermite 和 STD::Cyras-BeelelsI,不同的随机数生成器等。,c++,c++11,c++14,language-lawyer,c++17,C++,C++11,C++14,Language Lawyer,C++17,是否有任何“新”标准为pi引入了常数?如果没有,为什么?没有它,所有这些复杂的数学是怎么工作的 我知道类似的关于PI的问题在C++(他们是几年和标准老);我想知道问题的现状 我也很感兴趣为什么为什么C++仍然没有π常数但有很多更复杂的数学。 我知道我自己可以将pi定义为4*atan(1)或acos(-1)或double pi=3.14。当然但是为什么我还要这么做呢?标准数学函数在没有π的情况下如何工作?直到C++20,没有,没有一个标准引入了表示(π)的常数。您可以在您的代码中估计数字: con

是否有任何“新”标准为pi引入了常数?如果没有,为什么?没有它,所有这些复杂的数学是怎么工作的

我知道类似的关于PI的问题在C++(他们是几年和标准老);我想知道问题的现状

我也很感兴趣为什么为什么C++仍然没有π常数但有很多更复杂的数学。
我知道我自己可以将pi定义为
4*atan(1)
acos(-1)
double pi=3.14。当然但是为什么我还要这么做呢?标准数学函数在没有π的情况下如何工作?

直到C++20,没有,没有一个标准引入了表示(π)的常数。您可以在您的代码中估计数字:

constexpr double pi = 3.14159265358979323846;
其他语言,如C#在其库中声明的常量

更新:
从C++20开始,确实在
头中声明了一个
pi
常量。它可以通过以下方式访问:
std::numbers::pi

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

幸运的是,我使用了,他们定义的pi小数位数足够大,即使是128位
长的双精度

如果您不使用Boost,那么您可以自己硬编码它。用三角函数定义它是很诱人的,但如果你这样做了,你就不能把它变成
constepr
。我所知道的任何标准(参见
std::sqrt
)也不能保证三角函数的精度,因此,实际上,依赖这样的函数是危险的

有一种方法可以使用元编程获取pi的
constepr
值:请参阅


来自C++20的一些好消息。有一个pi的定义。C++20在
中添加了一些数学常数。例如,
std::numbers::pi
是一种
double
类型


参考资料:

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

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

这假设C++实现从PI代码中产生了正确的舍入值(ACS)(-1),


它不是
constexpr
,而是在实践中优化编译器,如gcc和clang,在编译时对其进行评估。声明它
const
对于优化器做好工作很重要。

这显然不是一个好主意,因为没有定义pi的明显类型可以普遍适用于各个域

PI当然是无理数,所以不能用任何C++类型正确表示。因此,您可能会争辩说,自然的方法是用可用的最大浮点类型来定义它。但是,最大标准浮点类型<代码> long double < />代码的大小不是由C++标准定义的,所以常数的值将在系统之间变化。更糟糕的是,对于工作类型不是最大类型的任何程序来说,pi的定义都是不合适的,因为它会给pi的每次使用带来性能成本


对于任何程序员来说,找到pi的值并定义自己适合使用的常数也很简单,因此将其包含在数学标题中并没有什么好处。

M\u pi
是由“标准”定义的,如果不是语言标准的话:使用X/Open System Interface扩展(这是官方UNIX品牌非常普遍的支持和要求)


与此同时,C++20确实有(在上一轮C++20功能中合并了)。具体来说,有两个
std::numbers::pi
(类型
double
)如果您想要不同的浮点类型,可以使用一个变量模板,例如,
std::numbers::pi_v

编辑-删除必要的术语,因为它被证明是有争议的。它是一个绝对术语

C++是一种庞大而复杂的语言,因此标准委员会只包含一些强烈要求的内容。尽可能多地留给非语言标准库,如Boost。

您可能想为C++ 17 + TA添加<代码>内联<代码>。请投票表决,但您的定义仍然容易受到不同定义的平台的不精确性的影响。C++代码很容易,因为<代码>双< /C>类型是固定的。如果我在C++标准委员会上,我会提出一些类似于<代码> STD::CO的东西。nstants::pi
@Duplicator也不是隐式内联的constexpr…?@R.很公平,不过在这种情况下,您应该在
std::numeric_limits::is_iec559;
上进行静态断言。我承认,这就是我的“主标头”中的内容。请注意,在形式上,您需要分别检查所有浮点类型。仅仅因为一个是IEEE754并不意味着它们都是。@DanielSchepler那么,“数字”应该是什么?我不知道有16个底数的双精度数字。@Lundin:但不幸的是,这不可能是
constexpr
,这就是我说的原因“用trig函数定义它是一件痛苦的事”为什么它很重要?Pi是一个常数,不需要改变或任何特定于实现的东西。只要把值写出来(如果你喜欢的话,在一个const对象中)就可以了。
double
(如果你关心假设的很长的double,也可以写一些荒谬的数字)@R.。我的问题是这看起来很荒谬