FPU命令FLDL在ST0中将双精度转换为长双精度
FPU command FLDL converts double to long double in ST0
我的c++代码中有一个双值:
double inch = 25.399999618530273;
用于计算时,使用
将其加载到FPU的st0寄存器中。fldl -0x90(%ebp)
我可以看到double在-0x90(%ebp)是正确的值。然而,在FLDL之后,它在st0寄存器中显示为长双精度值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寄存器仍然处于扩展精度模式以及如何解决这个问题?
或者它只是显示作为长双(我在Eclipse CDT中查看寄存器),但实际上在没有这些额外数字的情况下内部操作?
您的数字在编译程序时被转换为25.3999996185302734375,因为这是最接近25.399999618530273的double
值(使用IEEE-754 64位二进制浮点数)。double
到long double
的转换没有错误
当你说你可以看到"double at -0x90(%ebp)"是正确的值时,那么,如果你没有看到25.3999996185302734375,你没有看到那个位置的实际值-你正在使用的工具观察值已经不准确地呈现出来了。
如果您期望double
精确地代表25.399999618530273,那么您将会失望;它不能,你必须设计你的代码来允许这种情况,或者使用double
以外的东西来表示这样的数字。
你用什么工具测量长度的精度为0.0000000000001英寸?那是一把非常好的尺子,有非常大的放大镜和机器人强化的眼睛吗?
相关文章:
- 为什么将双精度转换为 int 似乎在第 16 位数字之后将其四舍五入?
- 在 c++ 中从双精度转换为字符串
- 使用 sprintf 和 %g 将双精度转换为字符串的意外结果
- 从双精度转换为整数的显式类型是否始终检查整数溢出?
- C++,遇到将双精度转换为整数的问题
- 在C++中将双精度转换为intptr_t
- 将大双精度转换为科学记数法以用作字符串?
- 了解双精度转换与整数转换中的整数与截断关系
- 将 OLE 自动化日期 (OADate) 双精度转换为结构 tm,而不使用 VariantTime到SystemTime
- 无法在赋值中将"双精度 (*)[4]"转换为"双精度**"
- 将大双精度转换为无符号 int 期间堆栈损坏
- 将双精度转换为本地8位
- 警告从"双精度"转换为"int"
- 如何将双精度转换为浮点指针
- 将双精度转换为整数时出错
- 使用并集将双精度转换为十六进制再转换为双精度
- 是否有可以将每个双精度转换为唯一uint64_t,保持精度和顺序的功能?(为什么我找不到?
- 使用定点表示法将双精度转换为字符串,没有尾随零和机智的冲刺
- 在C++中将双精度转换为字符*/字符串
- 无法将双精度 [] [] 转换为双精度 **