2

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

double inch = 25.399999618530273;

在计算中使用时,它被加载到 FPU st0 寄存器中,使用

fldl -0x90(%ebp)

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

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

4

1 回答 1

2

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

当您说您可以看到“-0x90(%ebp) 处的双倍”是正确的值时,如果您没有看到 25.3999996185302734375,那么您看不到该位置的实际值——您使用的工具观察价值呈现不准确。

如果您期望double准确地表示 25.399999618530273,那么您将感到失望;它没有,您必须设计您的代码以允许这样做或使用其他东西double来表示这样的数字。

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

于 2013-03-13T13:48:08.417 回答