一个c编程小问题

[复制链接]
查看11 | 回复3 | 2008-11-4 12:39:38 | 显示全部楼层 |阅读模式
话说今天练习数据结构写到双端堆,遇到一则数学代码很是不解。正在在下为之头疼之时,想到在这茫茫网络中潜藏不少高人,于是乎特发帖求助。望各位不吝赐教,在下先在此谢过。
log(8)/log(2)在下要得到int类型的结果,众所周知应该为3可是当在下写成下面的语句时结果却不一样。是因为什么原因啊?why?why?why?有哪位高手指点一二,在下必当重金酬谢,诚然金钱乃身外之物,汝高风亮节必视之如粪土。在下也知酬谢之事必有辱斯文,还望海涵。
#include
#include
int main()
{
int i=8;
int k;
double l,m;
l=log(i);
m=log(2);
l=l/m;
k=(int)l;
printf("%f\n",l);
printf("%d\n",k);

/*错误的结果写法*/
l=log(i)/log(2);
k=(int)l;
printf("%f\n",l);
printf("%d\n",k);
}
输出:
3.000000
3
3.000000
2

回复

使用道具 举报

千问 | 2008-11-4 12:39:38 | 显示全部楼层
NB,写的不错,LZ你的程序是正确的,VC编译通过,不过由于计算机计算LOG的方法是逼近,所以自然存在精度的问题,事实上,在l=log((double)i)/log((double)2); 这里,l=2.9999999996,然后你将其转化为int,自然变为2.0,至于解决方案有很多啦,你可以进行四射五入,也可以换个编译器试试,因为我觉得VC可能太落后了...
回复

使用道具 举报

千问 | 2008-11-4 12:39:38 | 显示全部楼层
与你的编译器有关,你用的是什么编译器啊?估计比较低级吧。我在VS2005上,也没有这样的问题。#include #includeint main() { int i=8; int k; double l,m; l=log((double)i); m=log((double)...
回复

使用道具 举报

千问 | 2008-11-4 12:39:38 | 显示全部楼层
我在VC下编译,调用log时需要指定类型,我用double作类型转换。但没有发现类似楼主的问题,一切正常。#include #includeint main() {
int i=8;
int k;
double l,m;
l=log((doubl...
回复

使用道具 举报

您需要登录后才可以回帖 登录 | 立即注册

本版积分规则

主题

0

回帖

4882万

积分

论坛元老

Rank: 8Rank: 8

积分
48824836
热门排行