21xrx.com
2024-11-22 02:14:32 Friday
登录
文章检索 我的文章 写文章
如何在C++中表示π?
2023-07-13 17:45:34 深夜i     --     --
C++ 表示 π

在C++中表示π是一个常见的问题,因为π是一个无理数,不能被精确地表示为有限的小数。但是,在C++中有几种方法可以近似地表示π。

方法一:使用cmath库

C++的cmath库中包含一个名为M_PI的常量,它表示π的值。这是一种简单而方便的方式来表示π。例如:

#include

const double PI = M_PI;

但是,需要注意的是,M_PI是一个近似值,并不是π的精确值。

方法二:使用自定义变量

我们也可以自己定义一个变量来表示π的近似值。有许多算法可以用于计算π的近似值,如蒙特卡罗方法、马青公式等。这里我们用蒙特卡罗方法来计算π的值。

基本思路是在一个正方形内部随机选择许多点,并将落在正方形内部的点与圆的内切正方形内部的点数相比较,最终得到一个近似值。代码如下:

#include

#include

#include

using namespace std;

double pi_approx(int n) {

  int count = 0;

  double x, y;

  for (int i = 0; i < n; i++) {

    x = (double)rand() / RAND_MAX;

    y = (double)rand() / RAND_MAX;

    if (x*x + y*y <= 1)

      count++;

  }

  return 4.0 * count / n;

}

int main() {

  srand(time(NULL));

  int n;

  cout << "Enter the number of points for pi approximation: ";

  cin >> n;

  cout << "pi = " << pi_approx(n) << endl;

  return 0;

}

由于这个算法是随机的,每次运行结果都可能有差别。如果我们选择足够多的点,结果就会趋近于π。

方法三:使用自定义精确度

我们也可以使用自定义的精确度来表示π,这个方法通常用于精确计算。由于π是无理数,不能表示为有限的小数,因此需要使用一个无限的小数形式。在C++中,我们可以用类来表示这个无限精度的小数。代码如下:

#include

#include

using namespace std;

class BigInt {

public:

  BigInt(int n = 0) {

    if (n == 0)

      digits.push_back(0);

    while (n) {

      digits.push_back(n % 10);

      n /= 10;

    }

  }

  void add(const BigInt& A) {

    int carry = 0, sum;

    for (int i = 0; i < digits.size() || i < A.digits.size(); i++) {

      sum = carry;

      if (i < digits.size())

        sum += digits[i];

      if (i < A.digits.size())

        sum += A.digits[i];

      carry = sum / 10;

      if (i < digits.size())

        digits[i] = sum % 10;

      else

        digits.push_back(sum % 10);

    }

    if (carry)

      digits.push_back(carry);

  }

  void multiply(int x) {

    int carry = 0, prod;

    for (int i = 0; i < digits.size(); i++) {

      prod = carry + digits[i] * x;

      carry = prod / 10;

      digits[i] = prod % 10;

    }

    if (carry)

      digits.push_back(carry);

  }

  friend ostream& operator<<(ostream& os, const BigInt& A) {

    string s(A.digits.size(), '0');

    for (int i = 0; i < A.digits.size(); i++)

      s[i] += A.digits[i];

    reverse(s.begin(), s.end());

    return os << s;

  }

private:

  vector digits;

};

int main() {

  BigInt a(1), b(1), c(1);

  for (int i = 3; i <= 100; i += 2) {

    b.multiply(i - 1);

    c.multiply(i);

    a.add(b);

    a.add(c);

    b.multiply(i);

    c.multiply(i + 1);

  }

  a.multiply(2);

  cout << "pi = " << a << endl;

  return 0;

}

这个算法使用了公式:

π/2 = 1 + 1/3 + 1*2/3*5 + 1*2*3/3*5*7 + ...

这个无限级数收敛于π/2,因此将其乘以2即可得到π的值。

以上就是在C++中表示π的几种方法。每种方法都有其优缺点,需要根据具体情况灵活选择。

  
  

评论区

{{item['qq_nickname']}}
()
回复
回复