【发布时间】:2013-03-13 13:26:26
【问题描述】:
我的 C++ 代码中有一个双精度值:
double inch = 25.399999618530273;
在计算中使用时,使用加载到FPU st0寄存器中
fldl -0x90(%ebp)
我可以看到 -0x90(%ebp) 处的 double 值是正确的值。然而,在 FLDL 之后,它在 st0 寄存器中显示为 long double value 25.3999996185302734375,即使我使用 -mpc64 -mfpmath=387 编译并在计算和 fldl 命令之前立即将 FPU 手动设置为双精度:
fpu_control_t cw;
_FPU_GETCW(cw);
cw &= ~_FPU_EXTENDED;
cw |= _FPU_DOUBLE;
_FPU_SETCW(cw);
您能否解释一下,为什么在 _FPU_DOUBLE 模式下 FPU 寄存器仍处于扩展精度模式以及如何解决这个问题?
或者它只是出现为 long double(我在 Eclipse CDT 中查看寄存器),但实际上是在内部没有这些额外数字的情况下运行的?
【问题讨论】:
-
我不得不承认,我还没有读过《每个程序员都应该知道的浮点运算知识》这本圣经。
标签: c++ linux gcc floating-point