网上查了一下这个函数的使用方法,貌似没有,简单记录一下
q31是定点小数,把32位有符号整数的第一位定义为符号位,后31位为小数位,因此q31的范围是-0.9999 ~ 0.9999之间,小数的倒数必定大于1或小于-1,它的结果又是q31。所以这个函数会把大于1的整数部分存储在结果中,那么这个函数就会返回一个存储了几个bit作为整数部分的值。
简单写了个程序验证下,正数结果正确,负数不对,暂时没搞明白,如有错误欢迎指正。
extern q31_t armRecipTableQ31[64];//这个声明应该在arm_common_tables.h,但是我的STM32CubeMX没有给我这个头文件,就自己声明了下
q31_t orig_val=0.33333f*0x7FFFFFFF;//0.33333f是浮点数,下边的代码就是求它的倒数
uint32_t sb=arm_recip_q31(orig_val,&recip_val,armRecipTableQ31);
uint32_t sign=recip_val&0x80000000u;
recip_val&=0x7FFFFFFF;
uint32_t intMask=0;
uint32_t _sb=sb;
while(_sb){
intMask=intMask<<1;
intMask=intMask|1;
_sb--;
}
uint32_t intVal=(recip_val&(intMask << (31-sb)))>>(31-sb);
float recip_val_f=1.0f*((recip_val<<(sb+1)) & 0x7FFFFFFF)/0x7FFFFFFF + intVal;
recip_val_f*= sign?-1:1;
运行结果recip_val_f的值是3.001,与预期基本吻合