1

円周率を計算するためのChudnovsky アルゴリズムを実装しようとしています。

これが私の実装です:

int fact(int n)
{
    if(n<=1)
        return 1;
    else
        return fact(n-1)*n;
}

double calcPi(long n)
{
    double z=0;
    for(int k=0; k<n; k++)
    {
        z+=(pow(-1, k)*fact(6*k)*(13591409 + 545140134.0*k))/(fact(3*k)*pow(fact(k), 3)*pow(640320.0, 3.0*k+3.0/2));
    }
    z*=12;
    return 1/z;
}

私は小さなエラーに遭遇しています。12 より大きい N の値を差し込むと、-nan が得られます。これは、限られた精度、ある種の整数オーバーフロー、または絶対にひどい階乗の実装に関係していると推測しています (はい、私は怠け者で再帰を使用していました。今は午前 2 時です)。

とにかく、以前にこれを経験したことがあり、簡単な修正を提案できるなら、それは素晴らしいことです.

多分私はPythonを使うべきで、オーバーフローについて心配するのをやめるべきです.

明けましておめでとうございます!

4

1 に答える 1

3

浮動小数点演算それは些細なことではなく、あなたの問題を考えると、私はあなたの質問にいくつかのヒントで答えることを好みます。

この問題はGMPMPFRなどのライブラリで解決できます。これは、どちらにも適した FAQ です

ほぼすべての主要なプログラミング言語でこれを本当にマスターしたい場合は、必ず IEEE 754 を読むことから始める必要があります。

于 2012-12-29T10:32:35.283 に答える