我的 C++ 代码中有一个 double 值:
double inch = 25.399999618530273;
在计算中使用时,使用以下方式将其加载到FPU st0寄存器中
fldl -0x90(%ebp)
我可以看到 -0x90(%ebp) 处的 double 是正确的值。然而,在 FLDL 之后,它在 st0 寄存器中显示为长 double 值 25.3999996185302734375,即使我使用 -mpc64 -mfpmath=387 进行编译,并在计算和 fldl 命令之前立即手动将 FPU 设置为 double :
fpu_control_t cw;
_FPU_GETCW(cw);
cw &= ~_FPU_EXTENDED;
cw |= _FPU_DOUBLE;
_FPU_SETCW(cw);
您能否解释一下,为什么在 _FPU_DOUBLE 模式下 FPU 寄存器仍处于扩展精度模式以及如何解决这个问题?
或者它只是看起来为长 double (我在 Eclipse CDT 中查看寄存器),但实际上在内部操作时没有这些额外的数字?
最佳答案
编译程序时,您的数字将转换为 25.3999996185302734375,因为这是最接近 25.399999618530273 的 double
值(使用 IEEE-754 64 位二进制浮点)。将 double
转换为 long double
没有错误。
当您说您可以看到“double at -0x90(%ebp)”是正确的值时,如果您没有看到 25.3999996185302734375,则您在该位置(您正在使用的工具)上看不到实际值观察到该值的呈现不准确。
如果您期望 double
准确地表示 25.399999618530273,那么您会感到失望;事实并非如此,您必须设计代码以允许这种情况,或者使用 double
以外的其他内容来表示这样的数字。
您使用什么工具来测量长度,精度为 0.000000000000001 英寸?这是一把非常精细的尺子,带有一个非常大的放大镜和机器人增强的眼睛吗?
关于c++ - FPU 命令 FLDL 将 ST0 中的 double 转换为 long double,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/15386668/