固定点乘以/除以15.16的数字

Tho*_*s O 0 fixed-point

我正在寻找一种算法来乘以和除以15.16的固定点数.

我已经有加法和减法.那些很简单 - 简单的32位加法和减法.通过乘法和除法,我还可以添加许多三角函数和指数/日志函数.而且我认为我可以处理多次,因为我的库有一个互惠函数,我可以用它来实现除法:a * (1/b) = a / b.但是32位乘法不起作用,因为它忽略了小数点.

我正在研究一个16位微控制器,所以我想避免超过32位乘法,这在我的处理器上需要大约4个周期.但这并不重要,我只是想替换浮点数学.

我听说我需要移动或旋转结果,但我不确定这将如何帮助或具体如何改变它.任何建议或帮助表示赞赏!

Dou*_*rie 5

可以这样想:你的号码ab表示为(ab*65536)

如果你乘以ab*cd得到的值是(ab*65536)*(cd*65536),那么要把它放回到右边的表示中,你需要除以65536.

当你划分ab/cd时你得到的值是(ab*65536)/(cd*65536),所以要把它放回到正确的表示中你需要乘以65536.你应该在除法之前乘以65536来保存为结果中尽可能多的位.

当然,如果处理器上的速度更快,您可以将(<< 16)替换为(*65536).同样,您可以将(>> 16)替换为(/ 65536).

这是ab*cd:

uint32_t result_low = (b * d);
uint32_t result_mid = (a * d) + (b * c);
uint32_t result_high = (a * c); 
uint32_t result = (result_high << 16) + result_mid + (result_low >> 16)
Run Code Online (Sandbox Code Playgroud)