|
蓝森林 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了下来,准备好好读一读。
人类每天都在干些什么?
--制造垃圾。
|
|