蓝森林首页 | 返回主页 | 本站地图 | 站内搜索 | 联系信箱 | -->
 您目前的位置:首页 > 自由软件 > 技术交流 > 应用编程 -->


    

蓝森林 http://www.lslnet.com 2006年8月16日 14:08

Why? It is not zero !


int main()
{
double n;
int f=16384;

n=log(f)/log(2)-(int)(log(f)/log(2)); (或者n=log(f)/log(2); n=n-(int)n;
printf("%f\n",n);

return 0;
}
Result: 1.00000


int main()
{
double n;
int f=16384;

n=log(f)/log(2);
printf("");
n=n-(int)n;

printf("%f\n",n);

return 0;

}

Result: 0.00000


Environment: RH6.1 with gcc 2.91, glib 2.1










--
Sun in the night, everyone is together,
Ascending into the heavens, life is forever.

Re: Why? It is not zero !

如果你要想取整,使用ceil(), floor(), truncate(),而不要用强制类型转换。

人类每天都在干些什么?
--制造垃圾。

怪只怪你的编程习惯太差!

你用了log函数,却不包含math.h,你想干吗?





Re: Why? It is not zero !

为什么枪支类型转换会相差一呢?
不应该有几种不同的执行结果吧?


--
Sun in the night, everyone is together,
Ascending into the heavens, life is forever.

不包含怎么啦? 有问题吗? (空)

.

人类每天都在干些什么?
--制造垃圾。

在我的机器上, redhat 7.1自带的gcc和libm, 结果都是0(空)

.

人类每天都在干些什么?
--制造垃圾。

有问题

我试了第一个程序,确实有关系的。
在不包含头文件的时候,C默认返回值是整型的,造成正确的返回值被错误的解释了。

虽然编译和连接的时候发现不了问题,但是在运行的时候就不对了。

这种问题主要出现在数学函数中,
对于其他返回类型如整型和指针类型等,即使出现这种歧义理解,但是对结果是没有影响,
所以,有错误也无法发现。

所以最好有好的编程习惯,所有函数都要包含必要的头文件。



astonia,请你试以下

main()
{
printf("%lf", log(16384)/log(2));
}
如果不包含头文件,结果为0。
包含头文件,结果为14。
哪个对呢?
况且用到了函数,就包含相应的头文件。这难道不是一个好习惯吗!



Re: 不包含怎么啦? 有问题吗? (空)

各位,我想说我包含了该包含的一切,
在我的RH6.1上,不包含math.h会报错,这是肯定的.

之所以没写是因为我以为不包含math.h的情况是肯定错误的,
所以省略了!各位请多包涵,我想问题不是在包含math.h上的.

我用ceil,floor 运行了一下,前面哪个还是等于一!!

So strange!! On HP-UX, I get the write result for all test!


--
Sun in the night, everyone is together,
Ascending into the heavens, life is forever.

哈哈,想当然了吧?

其实你听他说结果不是0,如果你对浮点运算稍微熟悉的话,就应该知道他肯定包含 math.h 了。否则结果
绝对是 0。

其结果不是 0 的原因是 glibc 缺省使用 x86 FPU 的超精度模式 (80 位),而不是通常的双精度模式 (64 位)。
可在程序内设置改变, 比如,
......
#include <fpu_control.h>
......
fpu_control_t flag;
......
_FPU_GETCW (flag);
flag &= ~ _FPU_EXTENDED;
flag |= _FPU_DOUBLE;
_FPU_SETCW (flag);

上书 code 将 FPU 置为双精度模式。将其加入他的程序,结果就是 0 了。但问题是很多 glibc 的数学函数
需要 80 位的精度。

总之要用浮点数,是很难的一件事。要是有人靠它吃饭,我奉劝最好先读读这篇经典论文:
"What every computer scientist should know about floating-point arithmetic"
David Goldberg, ACM Computing Surveys 23, 1 (1991-03), 5-48



Re: 哈哈,想当然了吧?

未必,我也是经过测试了的!
在solaris2.6和xteam linux 上试过,包含math.h就是对的,不包含math.h就是错的(非0)。
如果你对浮点运算稍微熟悉的话,就应该知道他肯定包含 math.h 了。。。
也许你是对的,但如果使用浮点数都必须象这样用,未免太累。



Re: 哈哈,想当然了吧?

在其它的UNIX平台上double是以多少位精度进行运算的呢?
为什么精度高反而运算误差大呢?
真是岂有此理!!

--
Sun in the night, everyone is together,
Ascending into the heavens, life is forever.

Re: 哈哈,想当然了吧?

还有就是搞不懂为什么加了一句printf之后,就对了呢?
这是gcc在编译时捣鬼吗?


--
Sun in the night, everyone is together,
Ascending into the heavens, life is forever.

哈哈,Rigel果然是大虾(龙虾?)

我已经把那篇文章down了下来,准备好好读一读。

人类每天都在干些什么?
--制造垃圾。



Copyright © 1999-2000 LSLNET.COM. All rights reserved. 蓝森林网站 版权所有。 E-mail : webmaster@lslnet.com