【发布时间】:2019-11-08 15:55:48
【问题描述】:
PowerPC 的浮点寄存器只支持双精度格式,因此加载和存储单精度值需要转换。在加载时从单到双的转换是有意义的,但是从双到单的转换以进行存储会造成一些令人困惑的事情。它似乎正确地截断了单精度范围内的数字,以及 NaN、无穷大和零,但对其他所有内容做了一些奇怪的移位,而不是像我预期的那样四舍五入到零或无穷大。
来自 PPC750 CPU 的示例。首先列出了给出我预期结果的示例。
double-precision input decimal approximation single-precision output decimal approximation
0x 400f ffff ffff ffff 3.99999999 0x 407f ffff 3.99999976
0x 7ff8 0000 0000 0000 QNaN 0x 7fc0 0000 QNaN
0x 7ff0 0000 0000 0000 +inf 0x 7f80 0000 +inf
0x 8000 0000 0000 0000 -0.0 0x 8000 0000 -0.0
--------------------------------------------------------------------------------------------------
0x 8000 0000 0000 0001 -4.941e-324 0x 8080 0000 -1.175e-38
0x 00a0 0000 0000 0000 1.139e-305 0x 0500 0000 6.019e-36
0x 7fe0 1234 5678 9abc 9.028e+307 0x 7f00 91a2 1.709e+38
我看了PowerPC Programming Environments Manual
看看它是否可以对此有所了解。第 C.7 节描述了“不需要非规范化”和“需要非规范化”情况的转换步骤。 (请注意,此符号中的|| 表示串联。)
然后继续说:
注意,如果要存储的值是单精度存储 浮点指令的幅度大于最大值 以单一格式表示的数字,第一种情况提到,“不 需要非规范化,”适用。然后存储在 WORD 中的结果是 一个明确定义的值,但在数值上不等于 源寄存器(即单精度加载的结果 WORD 中的浮点数不等于 原始源寄存器)。
这解释了为什么我得到了我所做的结果,但它没有解释它有什么用处。在我看来,如果再次从内存中加载这些值会导致可怕的错误。
为什么 stfs 指令不执行正常的舍入?预计结果如何不会引起问题?
【问题讨论】: