C++ FPU命令FLDL在ST0中将双精度转换为长双精度
在计算中使用时,使用以下命令将其加载到FPU 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 |=
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很好,但这不会给出浮点值。无论如何,这是另一个故事和/或问题。