wsb1991abc 发表于 2024-2-23 21:38:21

用r/4=1-1/3+1/5-1/7+...求r的值,直到发现某一项的绝对值小于1.0e-6为止(该项不累加))

#include<stdio.h>
#include<math.h>
int main()
{
double m=1.0,r,u=0.0;
int n=1,k=1;
for(n=1;fabs(m)>=0.1e-7;n++)
{
    m=k/(2*n-1);
        k=k*(-1);
        u=u+m;
}
r=u*4.0;
printf("%f\n",r);
return 0;
}
我这个程序为什么当n为2时,m为0,不为-1/3,且不执行循环了,和我要的r的值为3.14159065相差甚远

FishC 发表于 2024-2-23 21:38:43

问题出在循环条件的判断上。你使用了`fabs(m)>=0.1e-7`作为循环的条件,但是在每次循环中计算m的时候,你是用了`k/(2*n-1)`。由于`k`是一个整数,当`n`为2时,`k/(2*n-1)`的结果被截断为0,所以导致了`m`的值变为0。

为了解决这个问题,你可以将循环条件改为`fabs(m)>=1.0e-6`,这样当`m`的绝对值小于1.0e-6时,循环就会停止。

另外,你在循环中的步骤也有一些小问题。首先,你需要将`u`初始化为0,然后在每次循环中累加`m`的值。另外,你可以通过直接在循环条件中增加一个变量来控制`k`的取值,而不用在每次循环中进行乘法操作。

下面是修改后的代码:

#include <stdio.h>
#include <math.h>

int main()
{
    double r = 0.0;
    double m = 1.0;
    int n = 1;
    int k = 1;

    for (; fabs(m) >= 1.0e-6; n++)
    {
      r += m;
      k *= -1;
      m = k / (2.0 * n - 1);
    }

    r *= 4.0;
    printf("%f\n", r);
    return 0;
}

这样修改后,程序会正确计算出r的值为3.141591。

以上回复来自 FishC AI 小助理,如未能正确解答您的问题,请继续追问。
页: [1]
查看完整版本: 用r/4=1-1/3+1/5-1/7+...求r的值,直到发现某一项的绝对值小于1.0e-6为止(该项不累加))