質問

注記:もう読みました このトピック, しかし、理解できず、使用できる解決策も提供されません。私は数字の問題が苦手です。

ユーザーが希望する小数点以下の桁数まで円周率を生成する簡単な方法は何ですか?これは宿題ではなく、ここにリストされているプロジェクトのいくつかを完了しようとしているだけです。

リンク

役に立ちましたか?

解決

piの桁数を計算するための古典的なアルゴリズムは、ガウス - ルジャンドルのアルゴリズムです。それは、より現代的なアルゴリズムのいくつかのように高速ではありませんが、それは理解できるという利点を持っています。

してみましょう。

a_0 = 1
b_0 = 1/Sqrt(2)
t_0 = 1/4
p_0 = 1

そして、

a_(n+1) = (a_n + b_n) / 2
b_(n+1) = Sqrt(a_n * b_n)
t_(n+1) = t_n - p_n * (a_n - a_(n+1))^2
p_(n+1) = 2 * p_n

そして、

pi =. (a_n + b_n)^2 / (4 * t_n)

ここで(=.は「ほぼ等しい」を意味する)このアルゴリズムは、(正しい小数点の数は、各反復で倍)二次収束を示す。

私は、任意精度演算ライブラリを発見するなど、C#1にこれを翻訳するためにあなたにそれを残しておきます。

他のヒント

あなたが話している話題 テイラー級数を使用して PI の値を計算します。そのトピックで書かれた関数「double F (int i)」を使用すると、「i」項後のPIの値が得られます。

この PI の計算方法は少し遅いので、次の方法を参照することをお勧めします。 PI高速アルゴリズム.

実装も 1 つ見つかります ここ n 番目の桁までの計算 PI を取得します。

幸運を!

あなたはこれは本当に良いガイドに近い見てみる場合:

並列プログラミングのための

パターン:理解と.NET Framework 4 にして並列パターンを適用する。

あなたは(私の側からのマイナーな変更で)ページ70このかわいい実装を見つけることができます:

static decimal ParallelPartitionerPi(int steps)
{
    decimal sum = 0.0;
    decimal step = 1.0 / (decimal)steps;
    object obj = new object();
    Parallel.ForEach(Partitioner.Create(0, steps),
        () => 0.0,
        (range, state, partial) =>
            {
                for (int i = range.Item1; i < range.Item2; i++)
            {
                decimal x = (i + 0.5) * step;
                partial += 4.0 / (1.0 + x * x);
            }
            return partial;
        },
        partial => { lock (obj) sum += partial; });
    return step * sum;
}
ライセンス: CC-BY-SA帰属
所属していません StackOverflow
scroll top