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

时间:2013-03-13 13:26:27

标签: c++ linux gcc floating-point

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

double inch = 25.399999618530273;

在计算中使用时,使用

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

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

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

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

或者它只是出现一样长(我在Eclipse CDT中查看寄存器)但实际上是在内部没有这些额外数字的情况下运行?

1 个答案:

答案 0 :(得分:2)

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

当你说你可以看到“双-0x90(%ebp)”是正确的值时,如果你没有看到25.3999996185302734375,你没有看到该位置的实际值 - 你正在使用的工具观察到的价值不正确。

如果您期望double完全代表25.399999618530273,那么您会感到失望;它没有,你必须设计你的代码以允许它或使用double以外的东西来表示这样的数字。

您使用什么工具测量精度为.000000000000001英寸的长度?这是一个非常精细的尺子,带有非常棒的放大镜和机器人增强的眼睛吗?