其他分享
首页 > 其他分享> > C语言笔记2:如何使用循环结构求π的近似值(解决数据类型不匹配的问题)

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