【问题标题】:How does arithmetic floating point rounding in RISC-V work?RISC-V 中的算术浮点舍入如何工作?
【发布时间】:2021-10-23 03:43:29
【问题描述】:

我目前正在开发自己的 RISC-V (rv64gc) 模拟器。到目前为止一切都很顺利,但是浮点舍入模式让我很头疼。

RV ISA 包含以下 5 种浮点舍入模式:

  1. RNE(四舍五入,与偶数相关)
  2. RTZ(向零舍入)
  3. RDN(向下舍入/向负无穷大)
  4. RUP(向上取整/向正无穷方向取整)
  5. RMM(四舍五入,与最大量级相关)

在考虑将浮点数转换为整数的指令时(例如 FCVT.W.S),这些模式都是有意义的。然而,这些并不是唯一具有编码舍入模式的。将整数转换为浮点数的指令也具有用于舍入模式的 3 位编码空间,以及所有浮点算术指令。

现在假设我们有 2 个浮点数并想将它们加在一起。如果其中一个是大数,另一个是浮点数后面有很多位数的小数,我们可能会超过浮点数的存储容量。每当发生这种情况时,是否会丢弃最低位/数字?如果是,那么为什么会有舍入模式呢?否则,不同的模式将如何工作?它们将四舍五入到什么程度?

通常舍入后舍入(这是必须做的,没有任何额外的可用位)实际上没有任何意义,因为在丢弃最低有效位之后,没有必要通过舍入进一步降低精度,因为存储现在足够原始数字的剩余部分。那么舍入是否发生在最后一位被切断之前,然后丢弃产生的零?

例子:

假设我们在添加两个数字后有一个 011010111 的尾数,但实际上尾数的大小最大为 8 位(所以我们必须去掉 1 位)。

RNE:选项 1 是 011010110(向下),选项 2 是 011011000(向上)

这是平局:它会选择哪个选项?

在这两个选项中的任何一个之后,都不会丢失更多数据,因为只有一个 0 被丢弃。

RTZ:唯一的选项是 011010110(朝向零/向下)

现在可以丢弃最后一个零,而不会丢失任何进一步的数据。

RDN 和 RUP:取决于符号位,总是只有一条路可走,最后一位将变为 0,因此丢弃该位时不会丢失更多数据。

RMM:这也总是只有一个选项(在本例中远离 0 / 向上)。

当查看另一个当前设置为最低有效位 0 的示例时,它是否根本不舍入,因为增加/减少数字实际上会增加此处的精度?

如果在丢弃位之前发生舍入,CPU是否只是在执行指令时暂时保持较大的结果,然后用于获得正确大小的舍入结果?

如果我从根本上说错了,请纠正我,同样感谢任何帮助!

【问题讨论】:

  • 不会随意丢弃比特。从概念上讲,浮点舍入被指定为精确结果的函数(通过对操作数进行实际实数运算获得的结果,也称为“无限精确”结果)。如果+ 的操作数是 xy 并且 xy 大得多,则确切的结果是x + y,并根据选择的舍入方法进行舍入。如果它与偶数关系最接近,则结果是 x,因为 y 很小的事实意味着没有可表示的数字更接近于 x i> + yx 是……
  • ... 如果舍入方法接近零,如果 xy 均为正数,则结果为 x 或两者都是负面的。否则,它是从 x 到零的下一个可表示值。如果舍入方法向上,则如果 y 为正,则结果是大于 x 的下一个可表示值。否则为x。向下舍入是对称的,并且与最大数量级的关系四舍五入到最接近与甚至相同,因为当 y 如此小时没有关系。
  • IEEE 实现使用三个额外的位进行算术:guard、round、sticky。例如,请参阅stackoverflow.com/questions/19146131/…

标签: floating-point rounding riscv


【解决方案1】:

对于 RNE,当且仅当没有其他 1 下溢时,011010111 将舍入为 011010110。 011010110 是偶数,因为 LSb 为 0。RNE 是最常见和默认的模式(根据 IEEE):

       LGRS
011010111??
        ^^^
        underflow bits

L = LSb
G = "Guard bit"
R = "Rounding bit"
S = "Sticky bit" (is "latched", once set to 1 it stays at 1)

LGRS
x11x round up
x101 round up
0100 tie, round to even which in this case is down
1100 tie, round to even which in this case is up

【讨论】:

    猜你喜欢
    • 2013-02-04
    • 2018-06-14
    • 2012-01-20
    • 2015-08-13
    • 2018-09-01
    • 2016-03-31
    • 2018-08-17
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多