- 使用while循环语句
#include<stdio.h>
#include<math.h>
int main()
{
int s=1;
double n=1,t=1,pi=0;
while((fabs(t))>1e-7)//指数
{
pi=pi+t;//1
n=n+2;//3
s=-s;//-1符号变化
t=s/n;//如果n为整数型,则该等式为0; 1/3=0 0.0000 1/3
}
pi=pi*4;//pi
printf("pi=%10.6f\n",pi);
return 0;
}
运行结果
2.使用for循环语句
#include<stdio.h>
#include<math.h>
void main()
{
int s=1;
double t=1,n,pi=1;
for(n=3;;n+=2){
if((fabs(t))>1e-7)
{
s=-s;
t=s/n;
pi+=t;
}
else break;}
printf("%f",4*pi);
return;
}
运行结果
- 使两者最后一位数不一样的原因是什么呢?
在C语言的学习中,我们也会遇到一种这种小数的一种舍入的情况,在C语言中double类型的数据在C里面通过取不同的小数位数,输出能够是实现,0到4舍,6到9进,真值为5的时候,舍入不确定。所以是通过了一个进一的一个操作才导致最后一位小数部分不一样。
稍加分析的话,可以知道第一个循环体比第二个循环体少运行一次。
这里将这个范围缩小更能直观的感受到
程序1:
#include<stdio.h>
#include<math.h>
int main()
{
int s=1;
double n=1,t=1,pi=0;
while((fabs(t))>0.1)//指数
{
pi=pi+t;//1
n=n+2;//3
s=-s;//-1符号变化
t=s/n;//如果n为整数型,则该等式为0; 1/3=0 0.0000 1/3
}
pi=pi*4;//pi
printf("pi=%f\n",pi);
return 0;
}
第二个程序:
#include<stdio.h>
#include<math.h>
void main()
{
int s=1;
double t=1,n,pi=1;
for(n=3;;n+=2){
if((fabs(t))>0.1)
{
s=-s;
t=s/n;
pi+=t;
}
else break;}
printf("%f",4*pi);
return;
}
第一个程序运行到了t=1/9,然后判断t=1/11小于0.1,停止计算。
第二个程序运行到了t=1/9时,程序继续运行,到t=1/11的时候继续运行了一次。
所以我们对第二个程序进行改进。
#include<stdio.h>
#include<math.h>
void main()
{
int s=1;
double t,n=1,pi=0;
for(t=1;(fabs(t))>1e-7;t=s/n){
pi=pi+t;
n=n+2;
s=-s;
}
printf("%f",4*pi);
return;
}