乔宽 发表于 2019-5-29 16:30:32

课后作业拾遗,根据以下已知公式求Pi的近似值,要求正确计算出小数点后前七位

看了答案也不是很明白。
#include <stdio.h>
#include <math.h>

int main()
{
      int sign = 1; // 表示符号
      double pi = 0.0, n = 1, term = 1.0; // n表示分母,term表示当前项的值

      while (fabs(term) >= 1e-8) // 1e-8表示10^(-8)
      {
                pi = pi + term;
                n = n + 2;
                sign = -sign;
                term = sign / n;
      }

      pi = pi * 4;
      printf("pi = %10.7f\n", pi);

      return 0;
}
希望能解读下这段代码的意思

暗pluto 发表于 2019-5-29 17:33:56

首先,公式给你了,
提示1,分子永远都是1,包括第一个,1=1/1,那么我们可以设一个常数1,来表示分子,也就是代码中的sign=1
提示2,分母的规律就是从1开始,后面每一项都加2,那么,我们可以设分母一开始为1,每循环一次,加2,也就是代码中的n=1
提示3,每次前一个数和后一个数的符号都相反,所以,在循环的时候要变号,也就是sign=-sign
提示4,因为我们是把每一项的值加起来,而每一项会越来越小,因为分母越来越大,题目要我们求小数点后七位,所以到最后一项为八位的时候,就可以停下来了

好,开始看代码,首先我们要明白,这题是要用循环,把每一项加起来求和。
1.double pi = 0.0, n = 1, term = 1.0;    pi就是我们要求的总和,一开始是0,n就是分母,term是我们要求的每一项的值,一开始是1,从1加起的
2.然后 while (fabs(term) >= 1e-8),循环,到小数点第8位的时候停下来(代码第9位才停下来的原因可能是取第8位,保持精准度),注意,要取绝对值,因为循环中term的值会变成负数
3.            pi = pi + term;                  一开始总和pi和第一项相加,得到前一项的总和
                n = n + 2;                     然后分母加2
                sign = -sign;                     下一项是负数,所以,把sign变为负数
                term = sign / n;                然后得出下一项的值
                                                      然后循环
4.这样,得出pi是所有项的总和,然后乘4,得出真正的pi,一共循环到小数点的后八位,保持前七位的精度
5.输出结果,10.7f表示输出10位位宽输出,其中小数占7位,不足的右边补空格。

王尧 发表于 2019-5-29 19:07:17

#include <stdio.h>

void main()
{
    double pi = 0,num;
    int i = 1;

    do
    {
      num =(double)1/(i*2-1);
      if(num < 1e-8)
      {
            break;
      }
      else
      {
            if(i % 2 == 1)
            {
                pi += num;
            }
            else
            {
                pi -= num;
            }
      }
      i++;
    }
    while(1);

    pi *= 4;

    printf("pi = %.7lf\n",pi);

可以不用fabs函数
页: [1]
查看完整版本: 课后作业拾遗,根据以下已知公式求Pi的近似值,要求正确计算出小数点后前七位