用 C++ 计算圆周率
Computing Pi with C++
我正在尝试使用以下公式计算 Pi:
http://functions.wolfram.com/Constants/Pi/06/01/01/0005/
这是代码:
#include <iostream>
#include <cmath>
using namespace std;
int main() {
long double n;
cin >> n;
long double first_part = 0.0, second_part = 0.0, pi = 0.0;
for(int i = 0; i <= n; i++)
{
first_part += (pow(-1, n)) / ((2 * n + 1) * pow(5, 2 * n + 1));
second_part += (pow(-1, n)) / ((2 * n + 1) * pow(239, 2 * n + 1));
}
pi = (first_part * 16) - (second_part * 4);
cout << pi << endl;
return 0;
}
但是出了点问题。例如,对于 n = 300,它输出 6.65027e-420。
我真的找不到我的错误。
请帮我。
非常感谢。
您使用了错误的变量:
for(int i = 0; i <= n; i++)
^^^^^
iterating over 'i'
但是:
first_part += (pow(-1, n)) / ((2 * n + 1) * pow(5, 2 * n + 1));
second_part += (pow(-1, n)) / ((2 * n + 1) * pow(239, 2 * n + 1));
^^^^^^^^^^ ^^^^^ ^^^^^^^^^^^
all operations use 'n'
您达到了浮点精度的极限:
#include <cmath>
#include <iostream>
int main()
{
// This will print inf (infinite)
std::cout << std::pow(5.0, 600.0) << "\n"; // pow(5, 2 * n + 1))
return 0;
}
更改您的代码,将 for loop
中的所有 n
替换为 i
:
#include <iostream>
#include <cmath>
using namespace std;
int main() {
long double n;
cin >> n;
long double first_part = 0.0, second_part = 0.0, pi = 0.0;
for(int i = 0; i <= n; i++)
{
first_part += (pow(-1, i)) / ((2 * i + 1) * pow(5, 2 * i + 1));
second_part += (pow(-1, i)) / ((2 * i + 1) * pow(239, 2 * i + 1));
}
pi = (first_part * 16) - (second_part * 4);
cout << pi << endl;
return 0;
}
我运行上面的代码,发现:
3.14159
注意:pow(239, 2 * n + 1))
会溢出second_part
!因为 double
有 运行ge:
1.7E +/- 308 (15 digits)
参考here.
我正在尝试使用以下公式计算 Pi: http://functions.wolfram.com/Constants/Pi/06/01/01/0005/
这是代码:
#include <iostream>
#include <cmath>
using namespace std;
int main() {
long double n;
cin >> n;
long double first_part = 0.0, second_part = 0.0, pi = 0.0;
for(int i = 0; i <= n; i++)
{
first_part += (pow(-1, n)) / ((2 * n + 1) * pow(5, 2 * n + 1));
second_part += (pow(-1, n)) / ((2 * n + 1) * pow(239, 2 * n + 1));
}
pi = (first_part * 16) - (second_part * 4);
cout << pi << endl;
return 0;
}
但是出了点问题。例如,对于 n = 300,它输出 6.65027e-420。 我真的找不到我的错误。 请帮我。 非常感谢。
您使用了错误的变量:
for(int i = 0; i <= n; i++)
^^^^^
iterating over 'i'
但是:
first_part += (pow(-1, n)) / ((2 * n + 1) * pow(5, 2 * n + 1));
second_part += (pow(-1, n)) / ((2 * n + 1) * pow(239, 2 * n + 1));
^^^^^^^^^^ ^^^^^ ^^^^^^^^^^^
all operations use 'n'
您达到了浮点精度的极限:
#include <cmath>
#include <iostream>
int main()
{
// This will print inf (infinite)
std::cout << std::pow(5.0, 600.0) << "\n"; // pow(5, 2 * n + 1))
return 0;
}
更改您的代码,将 for loop
中的所有 n
替换为 i
:
#include <iostream>
#include <cmath>
using namespace std;
int main() {
long double n;
cin >> n;
long double first_part = 0.0, second_part = 0.0, pi = 0.0;
for(int i = 0; i <= n; i++)
{
first_part += (pow(-1, i)) / ((2 * i + 1) * pow(5, 2 * i + 1));
second_part += (pow(-1, i)) / ((2 * i + 1) * pow(239, 2 * i + 1));
}
pi = (first_part * 16) - (second_part * 4);
cout << pi << endl;
return 0;
}
我运行上面的代码,发现:
3.14159
注意:pow(239, 2 * n + 1))
会溢出second_part
!因为 double
有 运行ge:
1.7E +/- 308 (15 digits)
参考here.