我想在一些c++程序中使用PI常数和三角函数。我得到三角函数包含<math。h>。然而,在这个头文件中似乎没有PI的定义。

如何获得PI而不手动定义它?


当前回答

Pi可计算为atan(1)*4。您可以这样计算值并缓存它。

其他回答

你也可以使用boost,它为所请求的类型定义了最精确的重要数学常数(例如float vs double)。

const double pi = boost::math::constants::pi<double>();

查看boost文档以获得更多示例。

我在项目中使用了一个覆盖所有基础的公共头文件:

#define _USE_MATH_DEFINES
#include <cmath>

#ifndef M_PI
#define M_PI (3.14159265358979323846)
#endif

#ifndef M_PIl
#define M_PIl (3.14159265358979323846264338327950288)
#endif

另外,如果包含<cmath>,下面所有的编译器都定义了M_PI和M_PIl常量。不需要添加只有vc++才需要的#define _use_math_definitions。

x86 GCC 4.4+
ARM GCC 4.5+
x86 Clang 3.0+

Pi可计算为atan(1)*4。您可以这样计算值并缓存它。

C + + 20 std::数字pi

最后,它来了:http://eel.is/c++draft/numbers

main.cpp

#include <numbers> // std::numbers
#include <iomanip>
#include <iostream>

int main() {
    std::cout << std::fixed << std::setprecision(20);
    std::cout << "float       " << std::numbers::pi_v<float> << std::endl;
    std::cout << "double      " << std::numbers::pi << std::endl;
    std::cout << "long double " << std::numbers::pi_v<long double> << std::endl;
    std::cout << "exact       " << "3.141592653589793238462643383279502884197169399375105820974944" << std::endl;
}

其中,精确的计算结果为:

echo "scale=60; 4*a(1)" | BC_LINE_LENGTH=0 bc -l

如何使用Bash命令计算pi

编译并运行:

g++-10 -ggdb3 -O0 -std=c++20 -Wall -Wextra -pedantic -o main.out main.cpp
./main.out

输出:

float       3.14159274101257324219
double      3.14159265358979311600
long double 3.14159265358979323851
exact       3.141592653589793238462643383279502884197169399375105820974944

在Ubuntu 20.04 amd64, GCC 10.2.0上测试

已接受的建议如下:

5.0. “头”(头) 在表[tab: cppp .library.]Headers],需要添加一个新的<math>头。 […] 命名空间STD { 命名空间math { template<typename T > inline constexpr T pi_v = undefined; Inline constexpr double PI = pi_v<double>;

还有一个std::numbers::e当然:-)如何计算欧拉常数或欧拉驱动在c++ ?

这些常量使用c++ 14变量模板特性:有什么使用例子吗?

在草案的早期版本中,常量位于std::math::pi: http://www.open-std.org/jtc1/sc22/wg21/docs/papers/2019/p0631r7.pdf之下

#include <cmath>
const long double pi = acos(-1.L);