我目前正在使用 Microchip 的定点库,但我认为这适用于大多数定点库。它支持 Q15 和 Q15.16 类型,分别为 16 位和 32 位数据。
我注意到的一件事是它不包括加、减、乘或除函数。
我该怎么做这些?是否像使用整数数学将它们加/减/乘/除一样简单?我可以看到加法和减法工作,但乘法或除法不会处理小数部分......?
我目前正在使用 Microchip 的定点库,但我认为这适用于大多数定点库。它支持 Q15 和 Q15.16 类型,分别为 16 位和 32 位数据。
我注意到的一件事是它不包括加、减、乘或除函数。
我该怎么做这些?是否像使用整数数学将它们加/减/乘/除一样简单?我可以看到加法和减法工作,但乘法或除法不会处理小数部分......?
Microsoft 库包含处理下溢/上溢的加法和减法函数(_Q15add 和 _Q15sub)。
乘法可以实现为汇编函数(我认为代码很好 - 这是来自内存)。
C调用原型是:
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 数字的大小总是 <= 1。
事实证明,由于数字的表示方式,所有基本的算术函数都是通过使用本机运算符来执行的。例如,divide 使用 / 运算符并使用 * 运算符,它们编译为简单的 32 位除法和乘法。