题目

求圆周率PI的近似值,直到发现某一项的绝对值小于10-6为止(该项不累加)。
要求输出的结果总宽度占10位,其中小数部分为8位。
程序中使用浮点型数据时,请定义为双精度double类型。
如果需要计算绝对值,可以使用C语言数学库提供的函数fabs,如求x的绝对值,则为fabs(x).;
用到的用圆周率公式如下:

π = (4/1) - (4/3) + (4/5) - (4/7) + (4/9) - (4/11) + (4/13) - (4/15) …

遇到的问题

代码实现很简单,也不需要太复杂的条件判断什么的(虽然一开始我想复杂了),具体如下:

#include <cstdio>
#include <cmath>
int main()
{
    double pi = 0.0;
    double mid = 1.0;
    double n = 1;
    int sign = 1;

    while(fabs(mid) >= 1e-6){
        pi += mid;
        n += 2;
        sign = -sign;
        mid = sign / n;

    }
    printf("PI=%10.8f\n", 4 * pi);
    return 0;
}

 或者:

#include <cstdio>
#include <cmath>
int main()
{
    double pi = 0.0;
    double mid = 1.0;
    double n = 1;
    int sign = 1;

    while(n){
        pi += mid;
        n += 2;
        sign = -sign;
        mid = sign / n;
        if (fabs(mid) < 1e-6) break;

    }
    printf("PI=%10.8f\n", 4 * pi);
    return 0;
}

再或者:

#include <cstdio>
#include <cmath>
int main()
{
    double pi = 0.0;
    double mid = 1.0;
    double n = 1;
    int sign = 1;

    do{
        pi += mid;
        n += 2;
        sign = -sign;
        mid = sign / n;
    }while (fabs(mid) >= 1e-6);
    printf("PI=%10.8f\n", 4 * pi);
    return 0;
}

……方法很多。

### 但是!!!

如果写成这样:

#include <cstdio>
#include <cmath>
int main()
{
    double pi = 0.0;
    double mid = 1.0;
    double n = 1;
    int sign = -1;

    do{
        sign = -sign;
        mid = sign / n;
        pi += mid;
        n += 2;
    }while (fabs(mid) >= 1e-6);
    printf("PI=%10.8f\n", 4 * pi);
    return 0;
}

 

好像思路没问题,但是答案是不一样的……
错在哪里了呢?
一步一步写出来看看是怎么实现的:
1/1 - 1/3 + 1/5…… 好像还是没问题啊?
观察这两个答案,差别在哪里?

PI=3.14159465
PI=3.14159065

是不就是差了四倍的1e-6?
看到题目条件的括号了嘛?该项不累加……所以。。。现在懂了吧!

最后

把最开始想到的那个很复杂的实现修改成题目的意思,如下:

#include <cstdio>
#include <cmath>
int main()
{
    double pi = 0.0;
    double mid = 0.0;
    int n = 1;
    double sign = 1.0;
    do{
        if(n % 2 == 0){
            sign = -1.0;
        }
        else{
            sign = 1.0;
        }
        pi += mid;
        mid = sign / double(2 * n - 1);
        n++;

    }while(fabs(mid) > 1e-6);

    printf("PI=%10.8f", 4 * pi);
    return 0;
}