C#でPiからNの小数点以下の桁数を計算しようとしています
解決
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;
}
所属していません StackOverflow