如何计算pi(π)?

jma*_*erx 34 algorithm math pi

如何编写一个将pi(π)返回给定小数位数的函数?

速度不是问题.我一直在看http://bellard.org/pi/,但我仍然不明白如何获得pi的第n位数.

Ala*_*lan 30

在微积分中有一个名为泰勒级数的东西,它提供了一种简单的方法来计算许多无理值到任意精度.

Pi/4 = 1 - 1/3 + 1/5 - 1/7 + ...
(来自http://www.math.hmc.edu/funfacts/ffiles/30001.1-3.shtml)

继续添加这些术语,直到您想要稳定的精度数位.

泰勒定理是一个强大的工具,但使用该定理推导出这一系列超出了问题的范围.这是标准的一年级大学微积分,如果您对更多细节感兴趣,可以轻松转换.


我并不是说暗示这是计算pi的最实用的方法.这取决于你真正需要这样做的原因.出于实际目的,您应该从许多已发布版本中的一个中复制所需数量的数字.我建议将其简单地介绍非理性值如何等同于无限级数.

  • 这个泰勒系列可能是在计算机上生成PI的最糟糕方式之一.你必须对计算有很大的精确度,并且需要数十亿次迭代才能超过3.14159.来吧,试试看.或者这是一个讨论它的网站:http://www.cygnus-software.com/misc/pidigits.htm (26认同)
  • @Alan:好的,但问题清楚地表明他正在尝试编写一个可以计算PI到X位置的函数......无论如何,我实现了这个泰勒系列,经过10亿次迭代后你就得到了"3.14159265".经过30亿次迭代后,您将获得下一个数字.之后的数字是在990亿次迭代之后发生的.990亿. (8认同)
  • @ user146780:简单.请注意,这些术语逐渐变小,并且交替添加和减去.因此,当你添加一个术语时,你肯定**高于真正的**π**.当你减去时,你肯定在下面.因此,最后两个部分和提供了真值的上限和下限. (6认同)
  • @kts:这仍然没有改变你需要**数十亿次迭代以获得任何合理准确答案的事实. (2认同)
  • 是的,如果你想要n个十进制数字的精度,你需要大约10 ^ n次迭代的东西.我并不反对它收敛缓慢.OP似乎对学习练习感兴趣,而不是实际用途. (2认同)

Jam*_*lis 27

有许多用于π的数值近似的算法.


Bil*_*ill 8

作为JeffH存储每个变体的方法的替代方法,您只需存储最大位数并切断不需要的数字:

#include <string>
#include <iostream>
using std::cout; using std::endl; using std::string;

// The first 99 decimal digits taken from:
// http://www.geom.uiuc.edu/~huberty/math5337/groupe/digits.html
// Add more as needed.
const string pi =
  "1415926535"
  "8979323846"
  "2643383279"
  "5028841971"
  "6939937510"
  "5820974944"
  "5923078164"
  "0628620899"
  "8628034825"
  "342117067";

// A function in C++ that returns pi to X places
string CalcPi(const size_t decimalDigitsCount) 
{
  string returnValue = "3";
  if (decimalDigitsCount > 0)
  {
    returnValue += "." + pi.substr(0, decimalDigitsCount);
  }
  return returnValue;
} 

int main()
{
  // Loop through all the values of "pi at x digits" that we have. 
  for (size_t i = 0; i <= pi.size(); ++i) 
  {
    cout << "pi(" << i << "): " << CalcPi(i) << endl;
  } 
}
Run Code Online (Sandbox Code Playgroud)

http://codepad.org/6mqDa1zj

  • 鉴于pi不会改变,并且43个数字足以精确计算宇宙周长至*1*质子宽度的公差,这是非常合理的.不幸的是,问题是关于计算第十个数字并不一定意味着你必须得到数字X之前的数字,它不会真的是一个解决方案,因为X可能是*任何*! (5认同)

sla*_*ker 6

尝试" 在O(n ^ 2)中的任何基数中计算pi的第n位 ".它可能是最快的已知算法,不需要任意(读取巨大的)精度浮点数,并且可以直接在基数10(或任何其他)中提供结果.


Mik*_*ley 6

我相信您正在寻找的算法就是所谓的"Spigot算法".一种特殊的是BBP(Bailey-Borwein-Plouffe)配方.

我相信这就是你要找的东西.


and*_*and 5

?在MANDELBROT集合中 ”探讨了复杂平面上的点序列与如何计算其“ Mandelbrot数”(由于缺少更好的术语……确定序列中的点所需的迭代次数)之间的奇怪关系。不是Mandelbrot集的成员)与PI有关。

实际的?可能不会。

意外和有趣?我认同。