C语言笔记2:如何使用循环结构求π的近似值(解决数据类型不匹配的问题)
作者:互联网
题目:使用π/4=1-1/3+1/5-1/7……的表达式求解π的近似值,直到发现有一项的绝对值小于10^6
谭浩强《C语言程序设计》P127
我首先想到的是使用for循环实现表达式
#include <stdio.h>
#include <math.h>
int main() {
int i=1,t=1;
double sum=0.0,j=1.0;
for(i,j;fabs(j)>=1e-6;i=i+2){
j=1.0/i;
sum=sum+j*t;
t=-t;
}
printf("π的近似值是%f\n",4*sum);
return 0;
}
但是在做的过程中并不是一帆风顺,经过无数次改版,始终没有解决一个问题,如下:
#include <stdio.h>
#include <math.h>
int main() {
int i=1,t=1;
double sum=0.0,j=1.0;
for(i,j;fabs(j)>=1e-6;i=i+2){
j=1/i;
sum=sum+j*t;
t=-t;
}
printf("π的近似值是%f\n",4*sum);
return 0;
}
这个算法与最终的算法只有一个差别就是j的表达式。在第一个算法中j=1.0/i,在第二个算法中,j的表达式是j=1/i,两个式子几乎没有区别,但是输出结果却天差地别,第一个算法输出为3.1415926,但是第二个算法的输出结果为4。这是为什么呢?
我们在最开始的时候定义了i为i整型变量,j为双精度浮点型变量,表达式1/i的结果数据类型应该与i保持一致,也就是整型,但是我们将1/i这个结果赋值给j浮点型变量,这就导致j 只能取到1/i 的整型部分数值。也就是说,从第二次循环开始,j 的数值就一直为0,所以最后结果就是4。
通过这个例子我发现了数据类型不匹配这个问题。很多细节问题隐藏在算法中,只有真正到编译器运行才能发现问题。在以后的学习中,应该积极动手敲代码,主动寻找问题。
最后附上答案算法
#include<stdio.h>
#include <math.h>
int main(){
int s=1;
double pi=0.0,n=1.0,term=1.0;
while (fabs(term)>=1e-6){
pi+=term;
n+=2;
s=-s;
term=s/n;
}
pi=pi*4;
printf("π的近似值是%f\n",pi);
return 0;
}
标签:pi,1.0,int,sum,数据类型,算法,C语言,近似值,include 来源: https://blog.csdn.net/qq_45680196/article/details/113665494