TI中文支持网
TI专业的中文技术问题搜集分享网站

C6678汇编如何对32位定点任意数进行求除数和求余数

我想用最快的时间求
x = a % b;
y = a / b;
其中a,b为32位定点的任意数。
因为C6000汇编指令没有特定的指令,调用_divi()函数很耗费时间,我只想得到a对b的除数和余数。
我现在用的是这种方法,先把用intsp指令把a,b转化为单精度浮点,然后用rcpsp求b的倒数,然后用a乘以b的倒数,然后用sptrunc将结果再转化为定点数。具体代码:
intsp a, a_sp
intsp b, b_sp
rcpsp b_sp, b_sp_1
mpysp a_sp, b_sp_1, resu_sp
sptrunc resu_sp,int_part;得到除数部分,使用浮点转定点的截断指令
mpy32 int_part,b,resu
sub a,resu,rem_part
mv rem_part,x
mv int_part,y
这样对大多数定点数是没有问题的,但是当a是b的整数倍时就会出现问题,比如a=200,b=100,用上述代码得到的不是x=0,y=2,而是x=100,y=1;
另外,当a很大的时候也会出现问题,比如a=6001,b=120,用上述代码得到的不是x=1,y=50,而是x=120,y=49;我感觉是在用intsp指令时,定点数转浮点数有精度的损失造成的,但是我给a加上0.001后,结果还是不对,而且会出现更多的情况出错。求高人分析指点,有没有更好的对32位定点任意数进行求除数和求余数的方法。

Zhan Xiang:

你可以用rcpsp求倒数,用牛顿内插提高精度,手册中有详细的介绍。

chao feng2:

回复 Zhan Xiang:

首先感谢你的回答,我想强调我现在不是卡在精度这方面,因为我只想得到a/b和a%b的整数部分就可以,我想寻求汇编语言对求任意定点数余数和除数的有效方法。

Zhan Xiang:

回复 chao feng2:

你可以试试用SPINT,该指令可以做rounding。因为rcpsp只有8bit精度,每内插一次增加8bit精度,所以你可以做2次内插之后再用SPINT进行转换,获取整数后再相称相减来获取余数。

chao feng2:

回复 Zhan Xiang:

感谢你的提示,我看过手册中牛顿内插的原理后知道了产生误差的原因,现在代码已经有了很大改进。不过你提到的用spint这种含四舍五入的指令还是不太可取,举个例子,假如a=230,b=120,那么a/b应该是1,a%b应该是110,但是如果是用spint的话a/b的结果会是2,这就会有问题的

赞(0)
未经允许不得转载:TI中文支持网 » C6678汇编如何对32位定点任意数进行求除数和求余数
分享到: 更多 (0)