C++ FPU命令FLDL在ST0中将双精度转换为长双精度

C++ FPU命令FLDL在ST0中将双精度转换为长双精度,c++,linux,gcc,floating-point,C++,Linux,Gcc,Floating Point,在计算中使用时,使用以下命令将其加载到FPU st0寄存器中 fldl -0x90(%ebp) 我可以看出-0x90(%ebp)处的double是正确的值。然而,在FLDL之后,它在st0寄存器中显示为长双精度值25.3999966185302734375,即使我使用-mpc64-mfpmath=387编译,并在计算和FLDL命令之前立即手动将FPU设置为双精度: fpu_control_t cw; _FPU_GETCW(cw); cw &= ~_FPU_EXTENDED; cw |=

在计算中使用时,使用以下命令将其加载到FPU st0寄存器中

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

fpu_control_t cw;
_FPU_GETCW(cw);
cw &= ~_FPU_EXTENDED;
cw |= _FPU_DOUBLE;
_FPU_SETCW(cw);
请您解释一下,为什么在双模式下,FPU寄存器仍处于扩展精度模式,以及如何解决这个问题


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

编译程序时,您的数字被转换为25.399996185302734375,因为这是
双精度
值(使用IEEE-754 64位二进制浮点)最接近25.39999618530273。将
双精度
转换为
长双精度
没有错误

当您说您可以看到“double at-0x90(%ebp)”是正确的值时,如果您没有看到25.39996185302734375,则您没有看到您正在使用的工具在该位置的实际值。观察值显示不准确

如果您希望
double
准确地表示25.3999618530273,那么您会失望;它不是,您必须设计代码以允许这样做,或者使用除
double
以外的其他方法来表示这样的数字


您使用什么工具测量长度,精度为.00000000000000 1英寸?那是一把非常好的尺子,有非常大的放大镜和自动增强的眼睛吗?

我必须承认,我没有读过《每个程序员都应该知道浮点算术》圣经。25.399996185302734375在Windows VS2010和Eclipse CDT watch窗口中都显示为25.39999618530273。我有点困惑,它们在这里都显示了不正确的双精度值。Eclipse显示25.399996185302734375L为25.399996185302734375,这就是为什么我认为它是长双精度的,而25.39999618530273是双精度的。@queen3:25.399996185302734375在十六进制中正好是0x19.66666;它适合于
双精度
。25.3999618530273(十六进制)约为0x19.66665FFFFFFFE0798CA9EB295A3085。由于位不匹配,因此不能用双精度
表示;双精度
的有效位只有53位。如果某个软件告诉您一个
双精度
正好包含25.39999618530273,那么它是在说谎。Hm,那么在Windows/Linux调试器中验证真正浮点/双精度值的正确方法是什么?@queen3查看十六进制表示法?(调试器之间的操作方式会有所不同。)@us2012很好,但这不会给出浮点值。无论如何,这是另一个故事和/或问题。