学习C语言时碰到的一个问题

题目是谭浩强编写的C程序设计中的例题:用Π/4≈1-1/3+1/5-1/7+……公式求Π的近似值,直到发现某一项的绝对值小于10^-6为止(该项不累加)。编写的代码见截图,同样的代码在VC6.0中可以运行出正确确结果,但在TurboC 3.0中却运行不出结果(但无语法错误)请教一下这是为什么?
我把代码写一下:
#include <stdio.h>
#include <math.h>
void main ()
{int n;
float pi,t,s;
s=1.0,pi=0,t=1,n=1;
while (fabs(t)>=1e-6)
{pi=pi+t;
n=n+2;
s=-s;
t=s/n;
}
pi=pi*4;
printf("pi is %f\n",pi);}
将循环条件改为fabs(t)>=1e-4却可以在Turbo C3.0中运行以上代码得到π的近似值,这是为什么??

第1个回答  2011-09-03
可能是数据类型(精度)的限制,把“float pi,t,s”改为“double pi,t,s”还有“printf("pi is %f\n",pi)”改为“printf("pi is %lf\n",pi)”。
请自己试试看。追问

感觉不像是,执行代码是时好像没有执行printf语句,是变成死循环了吗

追答

你看看你的程序编译运行后有没有一直占用CPU时间,如果是则就像你说的那样,或者就像我说的数据类型的限制了。

追问

我最不能理解的是我将循环条件从fabs(t)>=1e-6改成fabs(t)>=1e-4,便可以运行出结果了。。。况且我原来的循环条件不可能永远为真啊

追答

1e-6和1e-4是不一样的,1e-6即是10的-6次方,1e-6比1e-4更小,因该说1e-6小数位位数更多,但是说来也奇怪,不是都是声明为float了吗?为什么不行?因此猜测是这个循环条件表达式出现问题了。
呵呵,看看“while (fabs(t)>=1e-6)”的1e-6,我想如果在其中加个(float)转换1e-6为单精度数值则程序可以正常运行了。

第2个回答  2011-09-04
float精度不够 只有6位
你可以改成double类型的再试试追问

改成的double也不行,难道真是我的Turbo C有问题???

第3个回答  2011-09-05
据我所知,tc是两位的吧,而vc是四位的,应该有点关系吧
第4个回答  2011-09-03
TC 好像不支持c99 吧
第5个回答  2011-09-03
运行不出结果是什么意思?一直没用输出(也就是没输出 pi is 3.14... ?)还是什么?问题没描述清楚追问

具体就是运行后无任何结果,只有光标停在那里。就连原样输出的普通字符也看不到。

追答

从你的问题的描述来看(1e-4 可以,但 1e-6 不可以),是 TC3 不支持数据精度的问题。
按道理来说,应该是不存在这方面问题的。可能是代码在 while (fabs(t)>=1e-6) 表达式中执行的时间过长,以至于只有光标闪烁。
总结:代码的编写提正确的,是编译器的问题(可能是 TC3 的问题,比如安装不完整?)

本回答被提问者采纳
相似回答
大家正在搜