gpt4 book ai didi

c - 如何有效地手动计算 C 中的模数?

转载 作者:太空狗 更新时间:2023-10-29 15:33:25 26 4
gpt4 key购买 nike

我写了一个正弦函数的基本定点变体,它利用了一个查找表(针对没有 FPU 的 AVR 微 Controller )。我的实现还接受负值和超过 2π 的值,就像它在 math.h 中的浮点挂件一样。

所以我需要将给定值映射到 0 到 2π 之间的范围(即它们的定点对应物)。对于正参数,很容易使用 C 的内置余数运算符 % 来修剪它们。由于这不是负值的选项,因此我使用以下(显而易见的)方法:

    unsigned int modulus = (a - (INT_FLOOR(a / b) * b) + b) % b;

ab 是整数类型的值,INT_FLOOR() 只是暗示 (a/b) 的小数部分被截断了。此公式确保计算出的模数(用作表数组的索引)始终为正,并且负参数也映射到正对应项(在两个方向上保持相移)。

我对这种方法的问题是它似乎过于复杂,因为它涉及不少于五个算术运算。我是否缺少更有效的方法?

最佳答案

除非你的整数参数被缩放为 π 的倍数(例如 65536 表示 2π),否则尝试进行参数缩减可能会被误导,因为 2π 是无理数并且任何缩减 mod 2π 都会引入错误随着周期数的增加,直到减少的整个结果变成错误。这实际上是许多浮点触发实现中的一个严重问题。

我建议要么根本不减少参数,要么使用基于 2 的幂而不是弧度的角度刻度(因此,例如,0x10000 或 0x1000000 对应于 2π 或 360 度)。然后参数约简变成了单个按位与运算。

关于c - 如何有效地手动计算 C 中的模数?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/10438912/

26 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com