数学在Min和Max之间循环使用Mod?

时间:2010-06-16 22:30:45

标签: math module range

我正在尝试构建一个微小的(或者可能不是那么微小的)公式,它将包含一组min和max之间的数字,但也会循环这些数字,这样如果它们超出范围就不会被剪裁。到目前为止,这就是我所拥有的。

min1 = 10
max1 = 90

val1 = 92
//will make 11, which is what i want since it loops

formula:  min(max(min1,min(val1,max1)),mod(val1,max1)+min1)

然而,我希望它也可以循环另一个方向,这样如果val1为5,即min1之外的-5,它将变为86.

我遇到的另一个问题是

max1 % max1 != max1

因为我想要它,因为max是范围的一部分

试图明确,这里有一些基于循环范围的所需输出的例子

min1 = 10
max1 = 90
----------------------------------------------
val1 = 30    //within range: stays as 30 
val1 = 90    //within range: stays as 90
val1 = -6    //below range: loops to becomes 75
val1 = 98    //above range: loops to becomes 17
val1 = 91    //above range: loops to becomes 10

我不想使用一系列if / else语句,但如果绝对需要,那就没问题了。甚至可能吗?

3 个答案:

答案 0 :(得分:3)

int loop(int val, int min, int max)
{
    int p = max-min+1;
    int mod = (val-min)%p;
    if(mod<0)
        mod += p;
    return min+mod;
}

答案 1 :(得分:1)

对不起。删除了以前的答案。试试这个:

((VAL-分钟)%(最大 - 最小)+最大值 - 最小值)%(最大 - 最小)+分钟

编辑:如果您希望max为有效值而不是溢出为min,则在所有3个位置将max替换为max + 1.

答案 2 :(得分:1)

从数学上讲,你应该能够做到这样的事情:

((val-min) `mod` (max-min+1)) + min

将您的范围向下移动到从零开始,剪掉高端,然后将其移回到正确的范围。不幸的是,C中的%运算符给出负数的负结果。所以:

3 % 10 => 3
13 % 10 => 3
-3 % 10 => -3
-13 % 10 => -3

因此,为了摆脱这些负面影响,我们需要一个额外的模数:

((val-min)%(max-min+1) + (max-min+1)) % (max-min+1) + min