FPU命令FLDL在ST0中将double转换为long double

我的C ++代码中有一个双重值:

double inch = 25.399999618530273; 

在计算中使用时,将使用它加载到FPU st0寄存器中

 fldl -0x90(%ebp) 

我可以看到,在-0x90(%ebp)的双倍是正确的值。 然而,在FLDL之后,即使我用-mpc64 -mfpmath = 387编译,并且在计算和fldl命令之前立即手动将FPU设置为双精度,那么在st0寄存器中显示为double double值25.3999996185302734375:

 fpu_control_t cw; _FPU_GETCW(cw); cw &= ~_FPU_EXTENDED; cw |= _FPU_DOUBLE; _FPU_SETCW(cw); 

你能解释一下,为什么在_FPU_DOUBLE模式下FPU寄存器仍处于扩展精度模式,以及如何解决这个问题?

或者它只是显示为长双(我在Eclipse CDT中查看寄存器),但实际上在内部没有这些额外的数字运行?

编译程序时,数字将被转换为25.3999996185302734375,因为这是最接近25.399999618530273的double值(使用IEEE-754 64位二进制浮点数)。 double转换为long double没有错误。

当你说你可以看到“双-0x90(%ebp)”是正确的值,那么,如果你没有看到25.3999996185302734375,你没有看到在那个位置的实际值 – 你使用的工具观察价值已经呈现不准确。

如果你期待double代表25.399999618530273,那么你会失望; 它不,你必须设计你的代码来允许这样做,或者使用非double东西来表示这样的数字。

你用什么工具测量精度为.000000000000001英寸的长度? 这是一个很好的统治者,一个非常伟大的放大镜和机器人增强眼睛?