为什么输出结果不正确

为什么输出结果为1 ,而不是Π

#include<iostream>
#include<cmath>
using namespace std;
double findpi()
{
    double sqr1 = 0.2 * 0.2, sqr2 = pow(1.0 / 239.0, 2.0);
    double e1 = 0.2, e2 = 1.0 / 239.0;
    double r1 = 0.0, r2 = 0.0, f, q = pow(10, -15);
    int i = 1;
    while (e1 / i > q)
    {
        f = e1 / i;
        r1 = (i % 4 == 1) ? r1 + f : r1 - f;
        e1 = e1 * sqr1;
        i = i + 2;
    }
    i = 1;
    while (e2 / i > q)
    {
        f = e2 / i;
        r2 = (i % 4 == 1) ? r2 + f : r2 - f;
        e2 = e2 * sqr2;
        i = i + 2;
    }
    return 16.0 * r1 - 4.0 * r2;
}
int main()
{
    cout<<"pi的值为:"<<findpi<<endl;
    return 0; 
}

函数调用少了括号

你是说的结果是如下吗?,如果是你输出应该是调用方法,而不是返回方法地址 findpi()

img

【以下回答由 GPT 生成】

问题出现在代码中的计算部分,具体来说是在while循环中计算Pi的近似值的过程中。

代码中使用了两个while循环来计算Pi的近似值,分别使用两个变量e1和e2来表示不断逼近Pi的值。在每次循环中,变量e1和e2会分别乘以sqr1和sqr2,这两个值是误差逐渐趋近于0的平方。

对于e1,初始值为0.2,每次循环都会乘以0.2的平方,而对于e2,初始值为1.0/239.0,每次循环都会乘以(1.0/239.0)的平方。由于0.2的平方小于1.0/239.0的平方,所以在每次循环中,e2的值都会比e1的值要小,导致e2的收敛速度更快,最终e2的值会先趋近于0,而e1的值仍然较大。

在计算r1和r2的时候,r1使用的是e1/i,而r2使用的是e2/i。正常情况下,r1和r2应该是分别乘以4和1的,但由于e2的值会先趋近于0,所以r2的值也会趋近于0,从而导致最后计算出的结果不正确。

为了解决这个问题,我们可以对代码进行简单的修改:

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

double findPi()
{
    double sqr1 = 0.2 * 0.2, sqr2 = pow(1.0 / 239.0, 2.0);
    double e1 = 0.2, e2 = 1.0 / 239.0;
    double r1 = 0.0, r2 = 0.0, f, q = pow(10, -15);
    int i = 1;
    while (e1 / i > q || e2 / i > q) // 修改判断条件,当e1和e2都小于q时结束循环
    {
        f = e1 / i;
        r1 = (i % 4 == 1) ? r1 + f : r1 - f;
        e1 = e1 * sqr1;
        f = e2 / i; // 在循环内部再次计算f的值
        r2 = (i % 4 == 1) ? r2 + f : r2 - f;
        e2 = e2 * sqr2;
        i = i + 2;
    }
    return 16.0 * r1 - 4.0 * r2;
}

int main()
{
    cout << "pi的值为:" << findPi() << endl;
    return 0;
}

在修改后的代码中,我们将判断条件从e1/i > q和e2/i > q修改为e1/i > q || e2/i > q,即只有当e1和e2都小于q时才结束循环。这样可以保证e1和e2都足够接近于0,避免了e2比e1先趋近于0的问题。

另外,我们还在第一个while循环内部添加了计算f的步骤,使得r2能够正确地加上或减去f,从而避免了r2趋近于0的问题。

通过以上修改,代码就能够正确输出π的值了。



【相关推荐】



如果你已经解决了该问题, 非常希望你能够分享一下解决方案, 写成博客, 将相关链接放在评论区, 以帮助更多的人 ^-^