【发布时间】:2016-07-20 18:03:43
【问题描述】:
我已经创建了一个函数g,它能够在一定程度上逼近一个函数,这个函数给出了精确到小数点后 5 位的结果(1,23456xxxxxxxxxxxx,其中 x 位置只是舍入错误/垃圾)。
为避免将错误传播到将使用g 结果的其他计算,我想将所有 x 位置设置为零,更好的是,只需将小数点后 5 位的所有内容设置为 0。
我在 X87 和 SSE 文献中没有找到任何可以让我以我想要的方式使用 IEEE 754 位或其表示的内容。
对 X87 的 FISTP 指令有一个旧的引用,它显然在 SSE 世界中与 FISTTP 相映成趣,其好处是 FISTTP 不需要修改控制字,因此速度更快。
我注意到FISTTP 被称为“切碎模式”,但现在在更现代的文献中只是“向零舍入”或“截断”,这让我感到困惑,因为“切碎”意味着完全删除“向零舍入”的东西零”对我来说不一定意味着同样的事情。
我不需要四舍五入到零,我只需要保留最多 5 位小数作为函数的最后一步,然后将结果存储到内存中;如何在 X87(标量 FPU)和 SSE(矢量 FPU)中执行此操作?
【问题讨论】:
-
等等...我很困惑。您提到 IEEE 和 bits,这意味着您了解 FP 表示。但同时你问如何截断 decimals 这在二进制浮点中是不可能的。我错过了什么吗?
-
@user354900 我不同意,尽可能精确地工作,并截断或舍入显示。通过在计算过程中截断,您将“传播”更大的错误,而不是更少。
-
@user354900 IEEE 浮点中的“斩波模式”只是截断二进制表示。除非您恰好四舍五入为整数,否则它绝不会映射到十进制数字。
-
浮点值(通常)没有有“十进制值”——这是一种人类可读格式的转换。如果您不需要它们,那么您就不会对这些值进行任何进一步的计算。因此,您不妨保留精度并处理输出截断。如果您要进行更多计算,那么您确实需要最大精度。
-
@user354900 如果你真的在问这个问题。那我想你不知道浮点数学。所以我推荐你这个:docs.oracle.com/cd/E19957-01/806-3568/ncg_goldberg.html