【发布时间】:2012-05-30 00:38:06
【问题描述】:
我正在使用数学库中的 sqrt() 函数,当我使用 -m64 为 64 位构建时,我得到了正确的结果,但是当我为 32 位构建时,我的行为非常不一致。
例如在 64 位上
double dx = 0x1.fffffffffffffp+1023;
sqrt(dx); // => 0x1.fffffffffffffp+511
sqrt(0x1.fffffffffffffp+1023);// => 0x1.fffffffffffffp+511
(我认为是正确的四舍五入结果,已通过 mpfr 验证)
但在 32 位相同的输入值上,它的行为会有所不同。
double dx = 0x1.fffffffffffffp+1023;
sqrt(dx); // => 0x1.0p+512
sqrt(0x1.fffffffffffffp+1023); // => 0x1.fffffffffffffp+511
当在变量中传递相同的值时,我得到了错误的结果。
我在每次通话之前和之后检查了舍入模式,所有设置都设置为最近的舍入。
什么原因?
我在 64 位机器上使用 gcc 4.6,对于 x86 和 x64 两种情况,选项都是 -mfpmath=sse 和 -march=pentium。
【问题讨论】:
-
在sources.redhat.com/bugzilla/show_bug.cgi?id=14032 上似乎存在一个错误,即使我将 -msse2 用于 32 位 i386 代码也是会被执行的。
标签: c math 32bit-64bit sqrt mpfr