-->

C ++ Chudnovsky公式裨(C++ Chudnovsky Formula for Pi)

2019-09-29 11:31发布

我试图做一个C ++应用程序计算皮我。 我试图实现Chudnovsky公式,没有运气。

这里是我的代码:

#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 

Answer 1:

你永远不会初始化pi ,因此您的代码是未定义行为。

您的fac函数不正确处理0fac(0)应为1 )。

3/2计算结果为1 (因为它使用整数除法,这截断),这使得您的公式计算结果为完全错误的答案。



Answer 2:

几乎可以确定你想要做的所有的数学上的双打,以避免大量的时间消耗转换。 你可能也想用一个迭代实现的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;
}


Answer 3:

POW(-1,k)是无效的,因为它是从数学公式的代码直接翻译。

使用这个来代替:

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

编辑:

此外,您的FAC码是很不理想了。



文章来源: C++ Chudnovsky Formula for Pi
标签: c++ formula pi