【发布时间】:2021-10-23 03:43:29
【问题描述】:
我目前正在开发自己的 RISC-V (rv64gc) 模拟器。到目前为止一切都很顺利,但是浮点舍入模式让我很头疼。
RV ISA 包含以下 5 种浮点舍入模式:
- RNE(四舍五入,与偶数相关)
- RTZ(向零舍入)
- RDN(向下舍入/向负无穷大)
- RUP(向上取整/向正无穷方向取整)
- RMM(四舍五入,与最大量级相关)
在考虑将浮点数转换为整数的指令时(例如 FCVT.W.S),这些模式都是有意义的。然而,这些并不是唯一具有编码舍入模式的。将整数转换为浮点数的指令也具有用于舍入模式的 3 位编码空间,以及所有浮点算术指令。
现在假设我们有 2 个浮点数并想将它们加在一起。如果其中一个是大数,另一个是浮点数后面有很多位数的小数,我们可能会超过浮点数的存储容量。每当发生这种情况时,是否会丢弃最低位/数字?如果是,那么为什么会有舍入模式呢?否则,不同的模式将如何工作?它们将四舍五入到什么程度?
通常舍入后舍入(这是必须做的,没有任何额外的可用位)实际上没有任何意义,因为在丢弃最低有效位之后,没有必要通过舍入进一步降低精度,因为存储现在足够原始数字的剩余部分。那么舍入是否发生在最后一位被切断之前,然后丢弃产生的零?
例子:
假设我们在添加两个数字后有一个 011010111 的尾数,但实际上尾数的大小最大为 8 位(所以我们必须去掉 1 位)。
RNE:选项 1 是 011010110(向下),选项 2 是 011011000(向上)
这是平局:它会选择哪个选项?
在这两个选项中的任何一个之后,都不会丢失更多数据,因为只有一个 0 被丢弃。
RTZ:唯一的选项是 011010110(朝向零/向下)
现在可以丢弃最后一个零,而不会丢失任何进一步的数据。
RDN 和 RUP:取决于符号位,总是只有一条路可走,最后一位将变为 0,因此丢弃该位时不会丢失更多数据。
RMM:这也总是只有一个选项(在本例中远离 0 / 向上)。
当查看另一个当前设置为最低有效位 0 的示例时,它是否根本不舍入,因为增加/减少数字实际上会增加此处的精度?
如果在丢弃位之前发生舍入,CPU是否只是在执行指令时暂时保持较大的结果,然后用于获得正确大小的舍入结果?
如果我从根本上说错了,请纠正我,同样感谢任何帮助!
【问题讨论】:
-
不会随意丢弃比特。从概念上讲,浮点舍入被指定为精确结果的函数(通过对操作数进行实际实数运算获得的结果,也称为“无限精确”结果)。如果
+的操作数是 x 和 y 并且 x 比 y 大得多,则确切的结果是x + y,并根据选择的舍入方法进行舍入。如果它与偶数关系最接近,则结果是 x,因为 y 很小的事实意味着没有可表示的数字更接近于 x i> + y 比 x 是…… -
... 如果舍入方法接近零,如果 x 和 y 均为正数,则结果为 x 或两者都是负面的。否则,它是从 x 到零的下一个可表示值。如果舍入方法向上,则如果 y 为正,则结果是大于 x 的下一个可表示值。否则为x。向下舍入是对称的,并且与最大数量级的关系四舍五入到最接近与甚至相同,因为当 y 如此小时没有关系。
-
IEEE 实现使用三个额外的位进行算术:guard、round、sticky。例如,请参阅stackoverflow.com/questions/19146131/…。
标签: floating-point rounding riscv