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

标签 c++ linux gcc floating-point

我的 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/

相关文章:

linux - 堆栈展开支持?

c - 为什么我们不能在某些进程上接受()套接字并从其子进程中接收()数据?

c++ - 用 C++ 编写原型(prototype)构造函数

c++ - 成员访问不完整类型错误: Templatized struct C++

c++ - 如何在 ios 设备中写入日志文件?

linux - 比较两个 excel 表并打印差异?

c - O1和Os有什么区别?

c++ - 无法使用 CMake 和 ncurses 进行编译

c++ - 无法将变量 ‘’ 声明为抽象类型 ‘’

c++ - 可以在 C 中更改 const 的值,但不能在 C++ 中更改