简单数学 - 计算数字滚动窗口(aha!负模数/余数!!)

时间:2012-10-17 12:17:16

标签: math

我几乎很尴尬地问这个问题,因为它可能非常明显 - 但是我看不出这种方法,并且怀疑有一条方法。

我有一个我需要添加/减去值的变量 - 但是我希望将它保持在一个值范围内,在两端循环 - 例如。

范围是0-3,因此值为0,1,2,3,0,1,2,3 - 这就是

x = (x + val) MOD 4

当val为负时,我们应该看到0,3,2,1,0,3,2,1并且解决方案是FAR不那么优雅

x = (x + val) MOD 4
if (x < 0) x = 4 + x;

这很有效,但它很笨重,我不禁想到可能有一个“一线”的解决方案 - 但如果我能想到它,我该死的? :)

准备尴尬

1 个答案:

答案 0 :(得分:2)

如TaZ所示,大多数“模数”运算符实际上是余数运算符,它只对x+val >= 0的“数学模数”起作用。

在c ++中,如找到here(经过一些修改),你可以定义一个更“数学上正确”的模数,如此

double mod(double x, double y) { return y!=0 ? x-floor(x/y)*y : x; }   

(也许也是一个整数版本),这样

x = mod(x+val,4); 

适用于正面和负面x+val