圆周率的C++Chudnovsky公式
C++ Chudnovsky Formula for Pi
我正在尝试让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
您从未初始化pi
,因此您的代码具有未定义的行为。
您的fac
函数无法正确处理0
(fac(0)
应为1
)。
3/2
的计算结果为1
(因为它使用了截断的整数除法),这会使公式的计算结果完全错误。
几乎可以肯定的是,为了避免大量耗费时间的转换,您需要对双打进行所有的计算。您可能还想使用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;
}
pow(-1,k)是无效的,因为它是从数学公式到代码的直接转换。
使用这个替代:
(k%2==1?-1.0:1.0)*fac(...
编辑:
此外,你的fac代码也远不是最佳的。
相关文章:
- 如果没有数学库,我如何在C++中创建复利公式
- 输出 0 和 -0 的二次公式,与给定的项无关
- 需要反转音频步进公式
- 标准偏差 c++ 公式建议
- 此代码验证公式是什么意思?
- 标准偏差公式
- 从.txt文件中读取浮点型数字并在公式中使用它们
- 在 OpenCV 中应用公式并传输图像
- 使用莱布尼茨公式的 Pi 近似
- 关于在 c++ 中创建公式的问题
- 将公式的结果链接到用户输入,并验证它们是否匹配
- 处理所有二次公式结果
- 未来值公式显示疯狂巨大数字的输出
- 我可以更改 SAXPY 函数的公式吗?
- Excel 不愉快地显示大型 2D 范围公式数组
- OpenLayers距离公式
- 是否有函数或公式可以在 c++ 中将字符串"of letters"转换为十六进制
- 我将如何获得正确的公式结构以使我的程序C++中的侧 c?
- 如何找到由公式计算的非常大的数字的最后一位数字?
- 圆周率的C++Chudnovsky公式