1


1

C#でPiからN桁の小数を計算しようとしています

注:私はすでにhttps://stackoverflow.com/questions/39395/how-do-i-calculate-pi-in-c [このトピック]を読んでいますが、私はそれを理解しておらず、提供していません私が使用できる解決策。 私は数の問題でひどいです。

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

3 Answer


5


「pi」の桁を計算するための古典的なアルゴリズムは、Gauss-Legendreアルゴリズムです。 いくつかの最新のアルゴリズムほど高速ではありませんが、理解しやすいという利点があります。

Let

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

Then

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

Then

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

ここで( `= .`は「ほぼ等しい」ことを意味します)このアルゴリズムは2次収束を示します(正確な小数点以下の桁数は各反復で2倍になります)。

任意精度の算術ライブラリーの発見を含め、これをC#に変換することはあなたにお任せします。


2


https://stackoverflow.com/questions/39395/how-do-i-calculate-pi-in-c [あなたの話しているトピック]は、テイラーシリーズを使用してPIの値を計算します。 そのトピックで書かれた関数「double F(int i)」を使用すると、「i」項の後のPIの値が得られます。

このPIの計算方法は少し遅いです。http://numbers.computation.free.fr/Constants/PiProgram/pifast.html [PI fast algorithm]をご覧になることをお勧めします。

計算PIをn番目の桁に取得する1つの実装http://www.omegacoder.com/?p=91 [こちら]を見つけることもできます。

がんばろう!


1


この本当に良いガイドを詳しく見てみましょう。

あなたはこのかわいい実装を見つけることができます(私の側からのマイナーチェンジ)。

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;
}