报名编号:CICC1327
团队名称:301小队
为什么要舍入? 因为单精度浮点数只取23位尾数(除去隐藏位),而一些运算不可避免的得到的尾数会超过23位,因此需要考虑舍入。
根据 IEEE-754 标准, 浮点数运算需要指定舍入模式(Rounding Mode), RISC-V 架构浮点运算的舍入模式可以通过两种方式指定。
(1)静态舍入模式:浮点指令的编码中有3位作为舍入模式域,RISC-V架构支持五种合法的舍入模式。除此之外,如果舍入模式编码为101或者110 ,则为非法模式;如果舍入模式编码111 ,则意味着使用动态舍入模式。
并不是所有的指令都有舍入模式,根据指令编码格式,以下的指令存在舍入模式的:
浮点运算指令: fadd fsub fmul fdiv fsqrt
浮点乘加指令:fmadd fmsub fnmadd fnmsub
浮点转换指令:fcvt.w.s fcvt.s.w fcvt.uw.s fcvt.s.uw
(2)动态舍入模式:如果使用动态舍入模式,则使用fcsr寄存器中的舍入模式域。fcsr 寄存器包含舍入模式域。不同的舍入模式编码同样下图所示,仅支持五种合法的舍入模式。如果 fcsr 寄存器中的舍入模式域指定为非法的舍入模式,则后续浮点指令会产生非法指令异常。
最近舍入,向偶数舍入 :如果舍入的数超过0.5,则尾数加1,小于0.5,直接舍去。如果等于0.5,向偶数舍入,即得到的尾数的最后一位为0,是偶数,则舍去,如果为1,则加1。
假定需要舍入的尾数为4位
如果其值小于1000,则最终得到的尾数不变,直接舍去;
如果其值大于1000,则最终得到的尾数需要加1;
如果其值为1000,且得到的尾数最后1位为0意味着为偶数,直接舍去,得到的尾数最后1位为1,则最终得到的尾数需要加1,使其变为偶数。
向0舍入:向靠近0的方向舍入,无论需要舍入的尾数为多少,直接舍去。
向负无穷舍入:对于正数,无论需要舍入的尾数为多少,直接舍去;对于负数,如果需要舍入的尾数不为0,向负无穷舍入意味着需要加1。
向正无穷舍入:对于负数,无论需要舍入的尾数为多少,直接舍去;对于正数,如果需要舍入的尾数不为0,向负无穷舍入意味着需要加1。
最近舍入,向最大量级舍入:如果需要舍入的尾数大于0.5,则加1,否者舍去。