我当前正在使用Microchip的定点库,但是我认为这适用于大多数定点库。它支持Q15和Q15.16类型,分别为16位和32位数据。
我注意到的一件事是它不包括加,减,乘或除函数。
我应该怎么做?它像使用整数数学将它们相加/相减/相乘/相除一样简单吗?我可以看到加法和减法的工作原理,但是乘或除法不会处理小数部分...?
最佳答案
Microsoft库包括用于添加和减去处理下溢/上溢的函数(_Q15add和_Q15sub)。
乘法可以实现为汇编函数(我认为代码不错-这是从内存中获得的)。
C调用原型(prototype)是:
extern _Q15 Q15mpy(_Q15 a, _Q15 b);
该例程(放在项目中的.s源文件中)是:
.global _Q15mpy
_Q15mpy:
mul.ss w0, w1, w2 ; signed multiple parameters, result in w2:w3
SL w2, w2 ; place most significant bit of W2 in carry
RLC w3, w0 ; rotate left carry into w3; result in W0
return ; return value in W0
。结束
记住要包含libq.h
此例程对结果进行左移一位,而不是对结果进行右移15位。无需担心溢出问题,因为Q15数始终具有
关于fixed-point - 定点算法,我们在Stack Overflow上找到一个类似的问题:https://stackoverflow.com/questions/4356635/