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;
}
  • 4
    点赞
  • 20
    收藏
    觉得还不错? 一键收藏
  • 1
    评论
评论 1
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值