最有效的方式来"剪辑"要在范围内重复的值?

时间:2016-06-14 06:45:42

标签: c math

给定一个值n,将它放在[min, max]范围内的最有效方法是什么,如果它超出范围,它会重复超出范围?

我不知道这个术语,所以很难说出这个问题,但也许真相表可能有所帮助:

min = -2max = 3

的位置
 input  --> output
    -6      0
    -5      1
    -4      2
    -3      3
    -2     -2
    -1     -1
     0      0
     1      1
     2      2
     3     -2
     4     -1
     5      0
     6      1  

到目前为止我所拥有的是:

(value - min) % (max - min) + min;

哪个有效,但我担心模数运算符%对于负输入是不可靠的,从我读过的内容(输出变为实现定义,使其无用,或者至少是不可移植的)

2 个答案:

答案 0 :(得分:1)

就像这样:

min = VALUE;
max = VALUE;
x = (((x - min) + 1) % (max - min)) + min

当你重复最后一行代码

时,x将在min和max - 1之内

编辑:

并匹配您的确切表:

output = (input - min) % (max - min) + min;

编辑2:

如果没有为负数定义模数:

if (input >= min)
    output = (input - min) % (max - min) + min;
else
    output = max - ((max - input) % (max - min));

答案 1 :(得分:0)

如果我理解你的要求,这是我能想到的最简单的等式:x % (max - min) + min

here你可以找到一些优化模运算符的方法。