注:このトピックは既に読みましたが、理解できず、使用できる解決策がありません。数の問題が苦手です。
ユーザーが希望する小数点以下の桁数まで Pi を生成する簡単な方法は何ですか? これは宿題ではなく、ここにリストされているプロジェクトのいくつかを完了しようとしているだけです。
の桁を計算するための古典的なアルゴリズム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)
ここで(=.
「ほぼ等しい」を意味します)このアルゴリズムは2次収束を示します(正しい小数点以下の桁数は反復ごとに2倍になります)。
任意精度の算術ライブラリの検出を含め、これをC#に変換するのはあなたに任せます。
あなたが話しているトピックでは、テイラー級数を使用して PI の値を計算します。そのトピックに書かれた関数「double F (int i)」を使用すると、「i」項の後の PI の値が得られます。
PI を計算するこの方法はちょっと遅いので、PI 高速アルゴリズムを参照することをお勧めします。
また、計算 PI を n 桁目に取得する1 つの実装もここで見つけることができます。
幸運を!
この非常に優れたガイドをよく見ると、次のようになります。
並列プログラミングのパターン: .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;
}