gpt4 book ai didi

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

转载 作者:太空狗 更新时间:2023-10-29 12:19:07 25 4
gpt4 key购买 nike

我的 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 设置为 double :

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

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

或者它只是出现 long double(我在 Eclipse CDT 中查看寄存器)但实际上在内部操作时没有这些额外的数字?

最佳答案

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

当你说你可以看到“double at -0x90(%ebp)”是正确的值时,如果你没有看到 25.3999996185302734375,你就没有看到那个位置的实际值——你正在使用的工具观察值显示不准确。

如果您希望 double 准确表示 25.399999618530273,那么您会失望的;它不会,您必须设计您的代码以允许这样做,或者使用 double 以外的东西来表示这样的数字。

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

关于c++ - FPU 命令 FLDL 在 ST0 中将 double 转换为 long double,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/15386668/

25 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com