题目
求圆周率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;
}