【发布时间】:2021-02-22 06:21:09
【问题描述】:
我试图在不牺牲太多速度的情况下获得尽可能多的正确数字,所以我发现 David Chudnovsky 和 Gregory Chudnovsky 基于 Ramanujan 的工作的收敛系列,当我运行它时,无论 k 的值如何,3 位数字都不正确后,我会达到 3.14159265358973 我还注意到 counter = 1 ,这意味着循环不起作用?我非常感谢您的帮助。 我的代码是:
#include <iostream>
#include <cmath>
#include <iomanip>
using namespace std;
long double factorial(unsigned long long int x, unsigned long long int n);
int main()
{
long double big_sum = 0.0;
unsigned long long int k = 0;
unsigned long long int n = 0;
long double numerator;
long double denominator;
long double turm;
turm = (long double)12.0;
cout << "TYPE NUMBER OF DIGITS : ";
cin >> n;
cout << endl;
/* unsigned long long int counter = 0; */
for (k = 0; k < pow(10, 10000); k++)
{
/* counter++; */
cout << setprecision(n) << fixed;
numerator = pow((-1.0), k) * factorial(6 * k, n) * (545140134 * k + 13591409);
denominator = factorial(3 * k, n) * pow(factorial(k, n), 3) * pow(640320, 3 * k + (long
double)(3.0 / 2));
big_sum += turm * (numerator / denominator);
cout << "PI IS = " << pow(big_sum, -1);
/* cout << " counter = " << counter; */
}
return 0;
}
long double factorial(unsigned long long int x, unsigned long long int n)
{
if (x == 0) return 1;
long long int factorial_of_x = 1;
for (unsigned long long int i = 1; i <= x; x++)
{
cout << setprecision(n) << fixed;
factorial_of_x *= i;
}
return factorial_of_x;
}
【问题讨论】:
-
什么计数器 = 1? cmets中的那个?那么请把 cmets 转成代码。不执行评论。严格来说,您的代码中没有
counter -
我没有检查详细信息,但是每当阶乘出现在公式中时,您不能只为阶乘保留一个术语,这会溢出。为
x = (numerator / denominator)保留一个术语并在每个迭代中更新它,即不分开。个别术语肯定会溢出(无论您使用哪种类型),但整个x将保持在接近1的某个位置 -
...请不要标记不相关的语言。即使你不关心 C 和 C++ 是不同的语言,我也不想搜索 C++ 问题然后发现答案是不同的语言
-
你正在迭代
pow(10, 10000)迭代......这些可能太多了,而且永远循环。 -
啊,但那是因为您是从循环内部打印的。而且您的
factorial永远不会以x > 0结尾,因为循环增量中有x++而不是i++。
标签: c++