c++ - 计算pi的值-我的代码有什么问题

标签 c++ math pi

我正在做另一个 C++ 练习。我必须从无限级数中计算 pi 的值:

pi=4 - 4/3 + 4/5 – 4/7 + 4/9 -4/11+ 。 . .

程序必须在该系列的前 1,000 项中的每一项之后打印 pi 的近似值。 这是我的代码:

#include <iostream>
using namespace std;

int main()
{
    double pi=0.0;
    int counter=1;

    for (int i=1;;i+=2)//infinite loop, should "break" when pi=3.14159
    {
        double a=4.0;
        double b=0.0;

        b=a/static_cast<double>(i);

        if(counter%2==0)
            pi-=b;
        else
            pi+=b;

        if(i%1000==0)//should print pi value after 1000 terms,but it doesn't  
            cout<<pi<<endl;

        if(pi==3.14159)//this if statement doesn't work as well
            break;

        counter++;
    }

    return 0;
}

它编译没有错误和警告,但执行后只出现空的控制台窗口。如果我删除行“if(i%1000==0)”,我可以看到它确实运行并打印每个 pi 值,但它不会停止,这意味着第二个 if 语句也不起作用。我不知道还能做什么。我假设这可能是一个简单的逻辑错误。

最佳答案

好吧,i % 1000 永远不会 = 0,因为您的计数器从 i = 1 开始运行,然后以 2 为增量运行。因此,i 始终是奇数,永远不会是 1000 的倍数。

它永不终止的原因是算法没有精确地收敛到 3.14157 - 它将是一个更高的精度,无论是低于还是高于近似值。你想说“当在 3.14157 的给定增量内时”,所以写

if (fabs(pi - 3.14157) < 0.001)
  break

或类似的东西,无论你想在停止前“接近”什么。

关于c++ - 计算pi的值-我的代码有什么问题,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/1479291/

相关文章:

c++ - 为什么在 C++ 中将值插入类时出现运行时错误

algorithm - 是否存在用于 pi 数字的常数空间生成器?

matlab - 为什么在 matlab 中 sin(pi) 不精确但 sin(pi/2) 是精确的?

c++ - 有没有更短的方法来初始化 QByteArray?

c++ - 为什么 boost::dynamic_bitset 是一个模板?

在数学语句中保留 << 和 >> 的 C++ 到 VB.NET 的转换

c++ - 计算未输出预期答案

algorithm - 可视化水平面

java - 后增量,前增量。 JAVA

c - 需要帮助修复近似 pi 的算法