2012-10-17 17 views
2

我几乎不好意思问这个问题,因为它可能非常明显 - 但我看不出这个整齐的方式,怀疑有一个。简单的数学 - 计算一个数字的滚动窗口(aha!负模量/余数!!)

我有一个变量,我需要添加/减去值 - 但我想保持它的值范围内,在任何一端循环 - 例如,

范围是0-3这样的值是0,1,2,3,0,1,2,3 - 这这是否

x = (x + val) MOD 4 

当val为负,但是,我们应该看到0 ,3,2,1,0,3,2,1和解决方案远不如优雅

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

这样的作品,但它是笨重,我不禁想有可能是一个“一条线”解决方案对此 - 但如果我能想到它,我会被诅咒吗? :)

准备尴尬

+1

为什么它必须是一行? – Raedwald

+0

适当的模数运算符已经这样做了。如果使用余数运算符(在编程语言中通常使用'%')来实现这一点,那么行为会随着负数而变化,并且需要您发布的两行代码。换句话说:您可能使用了余数运算符而不是正确的模数运算符。 – TaZ

+0

@raedwald它可能是50行,如果它是优雅的,看起来和感觉像一个bodge :) – shrewdlogarithm

回答

2

正如塔兹表示,最“模”运营商是真正其余运营商,只有工作就像一个“数学模”为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

+0

我的特别需要是使用Javascript - 以及我在之前评论中引用的问题暗示... ((a + b)%a + b)%b 这真的很优雅,但我正在涂鸦在笔记本上检查它:) – shrewdlogarithm