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

FPU command FLDL converts double to long double in ST0

本文关键字:双精度 转换 命令 FLDL ST0 FPU      更新时间:2023-10-16

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

double inch = 25.399999618530273;

用于计算时,使用

将其加载到FPU的st0寄存器中。
fldl -0x90(%ebp)

我可以看到double在-0x90(%ebp)是正确的值。然而,在FLDL之后,它在st0寄存器中显示为长双精度值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寄存器仍然处于扩展精度模式以及如何解决这个问题?

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

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

当你说你可以看到"double at -0x90(%ebp)"是正确的值时,那么,如果你没有看到25.3999996185302734375,你没有看到那个位置的实际值-你正在使用的工具观察值已经不准确地呈现出来了。

如果您期望double精确地代表25.399999618530273,那么您将会失望;它不能,你必须设计你的代码来允许这种情况,或者使用double以外的东西来表示这样的数字。

你用什么工具测量长度的精度为0.0000000000001英寸?那是一把非常好的尺子,有非常大的放大镜和机器人强化的眼睛吗?