使用C++计算圆周率

4
我正在尝试使用这个公式计算π: 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。 我真的找不到我的错误。 请帮我一下。 非常感谢。

3个回答

8

您正在使用错误的变量:

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'

3

您已达到浮点精度的极限:

#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;
}

2
改变你的代码,在 for 循环 中将所有的 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的范围为:

1.7E +/- 308 (15 digits)

参考此处


网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接