0

我刚刚做了一个计算圆周率的程序。然而,即使有 1000 万次迭代,我的结果还是有点偏离。我得到 3.141592 7535897831,而早已经是错误的了。它应该是 3.141592 653589793238 ...

所以我的问题是:需要多少次迭代才能得到至少一个准确的答案,一直到 10^-16

如果有人感兴趣,这是我的代码:

#include <iostream>
#include <iomanip>
using namespace std;

int main()
{
long double pi = 4.0;
long double tempPi;
for (int i = 1, j = 3; i <= 10000000; i++, j+=2)
{
    tempPi = static_cast<double>(4)/j;
    if (i%2 != 0)
    {
            pi -= tempPi;
    }
    else if (i%2 == 0)
    {
         pi += tempPi;
    }
}        
cout << "Pi has the value of: " << setprecision(16) << fixed << pi << endl;
system("pause");
return 0;

}

任何与性能相关的提示也将不胜感激。

4

4 回答 4

6

您正在使用莱布尼茨级数,收敛速度非常非常慢。在交替序列(例如您正在使用的序列)中,第一个省略的项提供了对估计误差的良好估计。您的第一个省略项是 4/2000005,因此您应该期望这里的精度少于六位有效数字。

请注意:舍入误差,使用双精度数字与此处缺乏精度无关。唯一的因素是您使用的算法很糟糕。

于 2011-07-08T15:57:29.720 回答
4

计算 pi的方法有很多。有些收敛速度比其他的快。

另见“现代公式”

the sequence 1 / a converges quartically to pi, giving about 100 digits in three steps and over a trillion digits after 20 steps.
于 2011-07-08T15:50:01.503 回答
4

问题是这double并不像您希望的那样准确。你甚至不能以 100% 的准确度表示十进制 1.2。

我没有仔细看代码,看看是否还有其他问题。

于 2011-07-08T15:50:18.957 回答
0

由于四舍五入导致 1000 万次迭代后结果是错误的,因此循环越多,您将不会得到正确的答案,只会增加更多的错误。

于 2011-07-08T15:50:40.953 回答