0

円周率を計算するプログラムを作成しました。ただし、1,000万回の反復を行っても、私の結果は少しずれています。私は3.1415927535897831を取得ますが、すでに早い段階でそれは間違っています。3.141592653589793238 ..。_

だから私の質問は:少なくとも10^-16までの正確な答えを得るために必要な反復の量は何ですか

誰かが興味を持っているなら、これが私のコードです:

#include <iostream>
#include <iomanip>
using namespace std;

int main()
{
long double pi = 4.0;
long double tempPi;
for (int i = 1, j = 3; i <= 10000000; i++, j+=2)
{
    tempPi = static_cast<double>(4)/j;
    if (i%2 != 0)
    {
            pi -= tempPi;
    }
    else if (i%2 == 0)
    {
         pi += tempPi;
    }
}        
cout << "Pi has the value of: " << setprecision(16) << fixed << pi << endl;
system("pause");
return 0;

}

パフォーマンス関連のヒントもいただければ幸いです。

4

4 に答える 4

6

収束が非常に遅いライプニッツシリーズを使用しています。使用しているような交代級数では、最初の省略された項は、推定の誤差の適切な推定を提供します。最初に省略された用語は4/2000005であるため、ここでは有効数字6桁未満の精度を期待する必要があります。

注意:丸め誤差、倍精度数の使用は、ここでの精度の欠如とは何の関係もありません。唯一の要因は、くだらないアルゴリズムを使用していることです。

于 2011-07-08T15:57:29.720 に答える
4

円周率を計算する方法はたくさんあります。一部は他よりも速く収束します。

「モダンフォーミュラ」もご覧ください

the sequence 1 / a converges quartically to pi, giving about 100 digits in three steps and over a trillion digits after 20 steps.
于 2011-07-08T15:50:01.503 に答える
4

問題は、doubleあなたが望むほど正確ではないということです。10進数の1.2を100%の精度で表すことさえできません。

他に問題があるかどうかを確認するためにコードを詳しく調べませんでした。

于 2011-07-08T15:50:18.957 に答える
0

丸め誤差のために1000万回の反復後に結果が間違っているため、ループを増やすと正しい答えが得られず、エラーが追加されるだけです。

于 2011-07-08T15:50:40.953 に答える