1

C++ アプリケーションに pi を計算させようとしています。チュドノフスキーの公式を実装しようとしましたが、うまくいきませんでした。

これが私のコードです:

#include <iostream>
#include <cmath>

long fac(long num) {
    if (num == 1)
        return 1;
    return fac(num - 1) * num;
}

int main() {
    using namespace std;
    double pi;
    for (long k = 0; k < 10; k++) {
        pi += (pow(-1, k) * fac(6 * k) * (13591409 + (545140134 * k))) / (fac(3 * k) * pow(fac(k), 3) * pow(640320, 3 * k + 3/2));
    }
    pi *= 12;
    cout << 1 / pi << endl;
    system("pause");
    return 0;
}

これの目標は、プログラムが Chudnovsky 公式の 10 回の反復を出力するようにすることでした。代わりに、私はこれを得ました:

call of overloaded `pow(int, long int&)' is ambiguous 
4

3 に答える 3

8

を初期化しないpiため、コードの動作は未定義です。

fac関数が正しく処理されません(0fac(0)ある必要があります1)。

3/2に評価され1ます (切り捨てられる整数除算を使用するため)。これにより、式は完全に間違った答えに評価されます。

于 2012-08-19T17:07:10.137 に答える
4

多くの時間を奪う変換を避けるために、ほとんどの場合、すべての計算を double で実行したいと考えています。また、再帰的な実装の代わりに の反復実装を使用したい場合もありますfac(再帰が大きな問題になるわけではありませんが、これは、何も得られないため、再帰を実際に回避する必要がある場合の代表的な例です)。もちろんpi、他の人がすでに指摘しているように、初期化も必要です。

#include <iostream>
#include <iomanip>
#include <cmath>

double fac(double num) {
    double result = 1.0;
    for (double i=2.0; i<num; i++)
       result *= i;
    return result;
}

int main() {
    using namespace std;
    double pi=0.0;
    for (double k = 0.0; k < 10.0; k++) {
        pi += (pow(-1.0,k) * fac(6.0 * k) * (13591409.0 + (545140134.0 * k))) 
            / (fac(3.0 * k) * pow(fac(k), 3.0) * pow(640320.0, 3.0 * k + 3.0/2.0));
    }
    pi *= 12.0;
    cout << setprecision(15) << 1.0 / pi << endl;
    return 0;
}
于 2012-08-19T17:28:28.277 に答える
1

pow(-1、k)は、数式からコードへの直接変換であるため、効果がありません。

代わりにこれを使用してください:

      (k%2==1?-1.0:1.0)*fac(...

編集:

また、facコードも最適とはほど遠いです。

于 2012-08-19T17:21:07.793 に答える