[讨论] 关于MEINVF32指令精度的讨论

dontium   2014-7-4 18:48 楼主
MEINVF32指令,是C2000系列中使用的CLA模块的指令,它独立于C28 CPU。
     CLA计算浮点数时,它的运算指令是单周期的,并且在乘、加等指令上设有并行指令。相当于一个时钟周期执行两条指令。


      MEINVF32指令完成32位的浮点数的倒数运算。然而,手册中提出它是一种近似运算,精度只能保证8位。并提示可以由牛顿-拉弗森算法(Newton-Raphson algorithm)来求得更精确的值。
             Ye = Estimate(1/X);
             Ye = Ye*(2.0 - Ye*X);
             Ye = Ye*(2.0 - Ye*X);

在它的举例中提供了这样一段程序:


             ; Calculate Num/Den using a Newton-Raphson algorithum for 1/Den
             ; Ye = Estimate(1/X)
             ; Ye = Ye*(2.0 - Ye*X)
             ; Ye = Ye*(2.0 - Ye*X)
;
             _Cla1Task1:
             MMOV32 MR1, @_Den           ; MR1 = Den
             MEINVF32 MR2, MR1           ; MR2 = Ye = Estimate(1/Den)
             MMPYF32 MR3, MR2, MR1      ; MR3 = Ye*Den
             MSUBF32 MR3, #2.0, MR3      ; MR3 = 2.0 - Ye*Den
             MMPYF32 MR2, MR2, MR3      ; MR2 = Ye = Ye*(2.0 - Ye*Den)
             MMPYF32 MR3, MR2, MR1       ; MR3 = Ye*Den
             MSUBF32 MR3, #2.0, MR3     ; MR3 = 2.0 - Ye*Den
             MMPYF32 MR2, MR2, MR3      ; MR2 = Ye = Ye*(2.0 - Ye*Den)



现在做一个实验,拿一个数: 1.2 , 求它的倒数( 1/1.2 = 0.833333333333)在MEINVF32 指令下所得的值,并且使用牛顿法逼近。


        MMOVF32                MR0, #1.2                ; X
        MEINVF32        MR2, MR0                ; Ye = Estimate(1/X); = 0.8359375
        MMPYF32                MR0, MR2, MR0        ; Ye*X;
        MSUBF32                MR3, #2.0, MR0        ; (2.0 - Ye*X);
        MMPYF32                MR1, MR3, MR2        ; Ye = Ye*(2.0 - Ye*X);= 0.8333252

        MMPYF32                MR2, MR1, MR0        ; Ye*X;
        MSUBF32                MR3, #2.0, MR2        ; (2.0 - Ye*X);
        MMPYF32                MR0, MR3, MR1        ; Ye = Ye*(2.0 - Ye*X); = 0x3F555553




经运行后观察寄存器的值,在执行MEINVF32        MR2, MR0后,1.2的倒数约为0.8359375

          经第一次牛顿法逼近,得 0.8333252
          经第二次牛顿法逼近,得(浮点表示) 0x3F555553,(十进制约0.8333331)




回复评论

暂无评论,赶紧抢沙发吧
电子工程世界版权所有 京B2-20211791 京ICP备10001474号-1 京公网安备 11010802033920号
    写回复