37

指定された小数点以下の桁数に pi (π) を返す関数を作成するにはどうすればよいですか?

速度は問題ではありません。http://bellard.org/pi/を見てきましたが、円周率の n 桁目を取得する方法がまだわかりません。

4

11 に答える 11

31

微積分には、任意の精度で多くの無理数を簡単に計算できるテイラー級数と呼ばれるものがあります。

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

必要な精度の桁数が安定するまで、これらの項を追加し続けます。

テイラーの定理は強力なツールですが、定理を使用したこの級数の導出は問題の範囲を超えています。これは標準的な 1 年生の大学の微積分であり、詳細に興味がある場合は簡単にグーグル検索できます。


これが pi を計算するための最も実用的な方法であることを暗示するつもりはありませんでした。それは、なぜ本当にそれを行う必要があるかによって異なります。実際には、公開されている多くのバージョンの 1 つから必要な数の数字をコピーする必要があります。これは、無理数を無限級数と同一視する方法の簡単な紹介として提案したものです。

于 2010-04-16T16:59:59.510 に答える
7

「 O(n^2) の任意の基数における pi の n 桁目の計算」を試してください。これはおそらく、任意の (巨大な読み取り) 精度浮動小数点数を必要とせず、基数 10 (またはその他) で結果を直接返すことができる、既知の最速のアルゴリズムです。

于 2010-04-16T18:32:20.820 に答える
6

あなたが探しているアルゴリズムは、「スピゴット アルゴリズム」として知られているものだと思います。1 つの特定の種類は、BBP (Bailey-Borwein-Plouffe) 式です。

それがあなたが探しているものだと思います。

于 2010-04-20T13:32:13.570 に答える
6

すべてのバリエーションを保存する 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;
  } 
}

http://codepad.org/6mqDa1zj

于 2010-04-16T19:01:02.357 に答える
3

π IN THE MANDELBROT SET」は、複素平面上の一連の点と、それらの「マンデルブロ数」(より適切な用語がないため...シーケンス内の点を決定するために必要な反復回数) の計算方法との間の興味深い関係を探ります。はマンデルブロー集合のメンバーではありません) は PI に関連しています。

実用的?おそらくそうではありません。

予想外で面白い?そう思います。

于 2010-04-16T20:31:20.350 に答える
3

私は式から始めます

pi = 16 arctan (1/5) - 4 arctan (1/239)

Google は、普通の人間が理解できるこの式の証明と、逆正接関数を計算する式を簡単に見つけることができます。これにより、10 進数で数千桁の pi を非常に簡単かつ迅速に計算できます。

于 2014-08-27T23:35:11.180 に答える
2

値を計算する代わりに値を調べますか?

関数が値を計算する必要があることを明示的に指定していないため、「計算」できる桁数に上限を設けたい場合の解決策は次のとおりです。

// Initialize pis as far out as you want. 
// There are lots of places you can look up pi out to a specific # of digits.
double pis[] = {3.0, 3.1, 3.14, 3.141, 3.1416}; 

/* 
 * A function that returns pi out to a number of digits (up to a point)
 */
double CalcPi(int x)
{
    // NOTE: Should add range checking here. For now, do not access past end of pis[]
    return pis[x]; 
}

int main()
{
    // Loop through all the values of "pi at x digits" that we have.
    for (int ii=0; ii<(int)sizeof(pis)/sizeof(double); ii++)
    {
        double piAtXdigits = CalcPi(ii);
    }
}

このように CalcPi() を記述すると (必要に応じて)、上限内の X の任意の値に対して等しく高速に処理されるという副次的な利点があります。

于 2010-04-16T17:52:10.353 に答える
0
pi = function () {
    let pi = 3;
    let a = 3;
    let even = false;
    let turn;

    while (a <= 90000) {
        turn = (4/((Math.pow(a, 3)) - (a)));

        if(even){
            turn = turn*-1;
            even = false;
        } else {
            even = true;
        }
        pi = pi + turn;
        a = a + 2;
    }
    return pi;
};
于 2017-11-23T15:29:01.290 に答える