题目:使用π/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;
}
本博文源于胡凡的《算法笔记》,根号2求解无非是在区间内找个近似它的值进行代替,这里假设已经知道根号2,就是在1和2之间,那么满足一定进度就可以了,先两者除以2,也就是1.5发现他是2,25然后2大,然后把区间右端点等于1.5依次类推。 完整代码 代码效果...
π/4=1-1/3+1/5-1/7+… 根据这个表达式,我们可以从数学角度来思考,这里的每一项可以构成一个数列。 也就是一分之一+负的三分之一+五分之一+负的七分之一 不难发现每一项的分母是2n-1,然后偶数项为负,奇数项为正 具体操作如下: 这里的(2 * n) - 1 <= pow(10 * 1.0, 6)是用来确定精度。...
...
用 π/4 ≈1-1/3+1/5-1/7+ …公式求π的近似值,直到发现某一项的绝对值小于10的-6次方为止(该项不累加) 这个程序很简单 复习: 1.1e-6的意思是1*10的-6次方 2.fabs的使用 说明: 1.当我把i变量定义成int型时,输出结果是4.000000,当换成float型时,输出结果是3.141598 2.第二次运行出现E:[Error...
请利用“正多边形逼近”的方法求出π的近似值 *问题分析与算法设计 利用“正多边形逼近”的方法求出π值在很早以前就存在,我们的先人祖冲之就是用这种方法在世界上第一个得到精确度达小数点后第6位的π值的。 利用圆内接正六边形边长等于半径的特点将边数翻番,作出正十二边形,求出边长,重复这一过程,就可获得所需精度的π的近似值。 假设单位...
39.跨组件状态共享 导入插件: 导入包 : 核心代码 : 效果: 40.对话框 效果:...
查找算法...
【问题描述】 某小学最近得到了一笔赞助,打算拿出其中一部分为学习成绩优秀的前5名学生发奖学金。期末,每个学生都有3门课的成绩:语文、数学、英语。先按总分从高到低排序,如果两个同学总分相同,再按语文成绩从高到低排序,如果两个同学总分和语文成绩都相同,那么规定学号小的同学排在前面,这样,每个学生的排序是唯一确定的。 任务:先根据输入的3门课的成绩计算总分,然后按上述规则排序,最后按排名顺序输出前五名名...
es6模块化实现 核心:导入 导出 首先,在HTML代码中引入两个js文件,而且类型type需要设置为module import指令用于导入模块中的内容 比如 aam.js 导入 aaa.js里面的内容 导出 用export 如果导入内容很多...