我正在使用数学库中的 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-mfpmath=sse
和-march=pentium
x64 两种情况。