队伍编号:CICC1449
队伍名称:礼堂盯帧电子研究所
本文主要描述浮点扩展指令集中定义的五种舍入模式,并介绍一些实现时要注意的地方。
首先,在riscv-spec-v2.2的浮点指令集扩展部分一共定义了五种不同的舍入模式,如下图。
接下来,我将以需要舍入为3位精度的小数作为例子(比方说:1.010 101 和1.011 101)来分别对五种舍入模式进行解读。
即向最近偶数舍入。对于这一舍入模式,我们首先要看超出精度的第一位,对于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。
即向零舍入。对于这个舍入模式,直接截掉多余位数即可。
例1:1.010 011—->1.010
例2:1.010 101—->1.010
例3:1.010 100—->1.010
例4:1.011 100—->1.011
即向负无穷舍入。对于这一舍入模式,需要先判断符号位,正数则截取多余位数,负数则进一。
例1:-1.010 011—->-1.011
例2:1.010 101—->1.010
例3:1.010 100—->1.010
例4:-1.011 100—->-1.100
即向正无穷舍入。对于这一舍入模式,需要先判断符号位,负数则截取多余位数,正数则进一。
例1:-1.010 011—->-1.010
例2:1.010 101—->1.011
例3:1.010 100—->1.011
例4:-1.011 100—->-1.011
即向最大摆幅舍入。对于这一舍入模式,其实就是我们小学时所学的四舍五入。对于这一舍入模式,我们只需要看超出精度的第一位,对于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