我正在尝试让C ++应用程序为我计算pi。我试图在没有运气的情况下实施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
答案 0 :(得分:8)
您永远不会初始化pi
,因此您的代码具有未定义的行为。
您的fac
函数无法正确处理0
(fac(0)
应为1
)。
3/2
评估为1
(因为它使用整数除法,这会截断),这会使您的公式评估为完全错误的答案。
答案 1 :(得分:3)
你几乎肯定想要在双打上做所有的数学运算,以避免大量的时间杀戮转换。您可能还希望使用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;
}
答案 2 :(得分:1)
pow(-1,k)是无效的,因为它是从数学公式到代码的直接转换。
请改用:
(k%2==1?-1.0:1.0)*fac(...
编辑:
此外,您的fac代码也远非最佳。