7

与えられた精度でPI〜3.14を計算するための式/アルゴリズムを探しています。

数式/アルゴリズムには、次のような非常に基本的な算術のみが必要です。

  • +:追加
  • -:減算
  • *:掛け算
  • /:ディビソン

これらの操作をC++で実装し、実装を可能な限り単純にしたいためです(bignumライブラリは許可されていません)。

円周率を計算するためのこの式は非常に単純であることがわかりました。

Pi/4 = 1 - 1/3 + 1/5 - 1/7 + ...  = sum( (-1)^(k+1)/(2*k-1) , k=1..inf )

((-1)^(k + 1)は上記の演算子で簡単に実装できることに注意してください)。

しかし、この式の問題は、計算する桁数を指定できないことです。つまり、計算をいつ停止するかを直接決定する方法はありません。

n-1おそらく、この問題の回避策は、計算された項とthの差を計算し、nそれを現在のエラーと見なすことです。

とにかく、私はこれらの特性を持ち、また円周率に速く収束する式/アルゴリズムを探しています

4

3 に答える 3

6

コードパッドリンク

#include <iostream>
#include <cmath>
int main()
{
    double p16 = 1, pi = 0, precision = 10;

    for(int k=0; k<=precision; k++)
    {
        pi += 1.0/p16 * (4.0/(8*k + 1) - 2.0/(8*k + 4) - 1.0/(8*k + 5) - 1.0/(8*k+6));
        p16 *= 16;
    }
    std::cout<<std::setprecision(80)<<pi<<'\n'<<M_PI;
}

出力:

3.141592653589793115997963468544185161590576171875
3.141592653589793115997963468544185161590576171875

これは実際にはベイリー-ボールウェイン-プルーフの公式であり、これもウィキペディアのリンクから取得したものです。

于 2010-12-19T18:57:56.023 に答える
3

元の(ゆっくりと収束する)例では、これは交代級数であるため、誤差項を計算できます。http://en.wikipedia.org/wiki/Alternating_series#Explicitimating_Sumsを参照してください

基本的に、次の計算されていない用語はエラーの限界です。

于 2010-12-19T22:41:58.767 に答える
-2

arctan(1)のテイラーエンベロープを実行すると、残りのすべての部分を合計するだけでpi/4が得られます。arctan(1)のテイラーエンベロープ

http://en.wikipedia.org/wiki/Taylor_series

また、z = 1のオイラーの公式を使用して、結果に4を掛けることもできます。

http://upload.wikimedia.org/math/2/7/9/279bed5a2ea3b80a71f5b22078090168.png

于 2014-10-07T19:47:22.213 に答える