RISC-V MCU中文社区

【分享】 关于浮点指令集扩展实现你不得不了解的浮点数舍入模式问题

发表于 开源蜂鸟E203 2023-05-10 10:50:54
0
2837
2

队伍编号:CICC1449
队伍名称:礼堂盯帧电子研究所

摘要:

本文主要描述浮点扩展指令集中定义的五种舍入模式,并介绍一些实现时要注意的地方。

舍入模式介绍

首先,在riscv-spec-v2.2的浮点指令集扩展部分一共定义了五种不同的舍入模式,如下图。
图片alt
接下来,我将以需要舍入为3位精度的小数作为例子(比方说:1.010 101 和1.011 101)来分别对五种舍入模式进行解读。

1.RNE:Round to Nearest, ties to even.

即向最近偶数舍入。对于这一舍入模式,我们首先要看超出精度的第一位,对于3位精度的小数而言就是要看小数点后的第四位为0则舍去,为1则需要查看后续位数是否有1,有则进一,若无则说明这个小数位于两个数的中间(1.010 100恰好处于1.010和1.011的中间),需要向最近偶数舍入。
例1:1.010 011—->1.010
小数点后第4位为0,则不满足舍入条件,直接舍去后三位。
例2:1.010 101—->1.011
小数点后第4位为1,且后续位仍有1,则进一。
例3:1.010 100—->1.010
小数点后第四位位1,但后续位全为0,1.010是离它最近的偶数,则取1.010。
例4:1.011 100—->1.100
小数点后第四位位1,但后续位全为0,1.100是离它最近的偶数,则取1.100。

2.RTZ:Round towards Zero.

即向零舍入。对于这个舍入模式,直接截掉多余位数即可。
例1:1.010 011—->1.010
例2:1.010 101—->1.010
例3:1.010 100—->1.010
例4:1.011 100—->1.011

3.RDN: Round Down.

即向负无穷舍入。对于这一舍入模式,需要先判断符号位,正数则截取多余位数,负数则进一。
例1:-1.010 011—->-1.011
例2:1.010 101—->1.010
例3:1.010 100—->1.010
例4:-1.011 100—->-1.100

4.RUP: Round Up.

即向正无穷舍入。对于这一舍入模式,需要先判断符号位,负数则截取多余位数,正数则进一。
例1:-1.010 011—->-1.010
例2:1.010 101—->1.011
例3:1.010 100—->1.011
例4:-1.011 100—->-1.011

5.RMM: Round to Nearest, ties to Max Magnitude.

即向最大摆幅舍入。对于这一舍入模式,其实就是我们小学时所学的四舍五入。对于这一舍入模式,我们只需要看超出精度的第一位,对于3位精度的小数而言就是要看小数点后的第四位为0则舍去,为1则进一。
例1:1.010 011—->1.010
例2:1.010 101—->1.011
例3:1.010 100—->1.011
例4:1.011 100—->1.100

结束

值得注意的是,指令本身有一个rm域,而fcsr寄存器中也有一个frm域,我们应该选取哪一个编码作为舍入模式呢?
答:我们将优先使用指令中的rm域,若rm编码为111,则调用fcsr中的frm域的编码作为舍入模式。

至此,关于浮点指令集拓展的舍入模式已经介绍完毕,快动手写起来吧!
如有不足,欢迎指出。

参考资料:
The RISC-V Instruction Set Manual,Volume I: User-Level ISA v2.2
IEEE Std 754TM-2008

喜欢2
用户评论
watermelon仔

watermelon仔 实名认证

懒的都不写签名

积分
问答
粉丝
关注
  • RV-STAR 开发板
  • RISC-V处理器设计系列课程
  • 培养RISC-V大学土壤 共建RISC-V教育生态
RV-STAR 开发板