我编写了一个使用查找表的正弦函数的基本定点变体(针对不带 FPU 的 AVR 微控制器)。我的实现也接受负值和超过 2π 的值,就像它在math.h中的浮点挂件一样。
所以我需要将给定值映射到 0 到 2π 之间的范围(即它们的固定点对应物)。对于积极的论点,很容易用 C 的内置余数运算符%来修剪它们。由于这不是负值的选项,因此我使用以下(明显)方法:
unsigned int modulus = (a - (INT_FLOOR(a / b) * b) + b) % b;
a和b是整数类型的值,而 INT_FLOOR() 只是暗示 (a/b) 的小数部分被截断。该公式确保计算出的模数(用作表格数组的索引)始终为正,并且负参数也映射到它们的正对应物(保持两个方向的相移)。
我对这种方法的问题是它似乎过于复杂,因为它涉及不少于五个算术运算。我缺少更有效的方法吗?