【问题标题】:Most efficient way to "clip" a value to repeat through a range?“剪辑”一个值以在一个范围内重复的最有效方法?
【发布时间】:2016-06-14 06:45:41
【问题描述】:

给定一个值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;

这可行,但我担心的是模数运算符 % 对于负输入不可靠,从我读到的内容(输出变成实现定义,使其无用,或至少不可移植)

【问题讨论】:

  • 为什么不取绝对值的模​​数?
  • 显示您尝试过的内容。
  • 这是您正在寻找的方程式吗? x % (max - min) + min
  • @MichaelWalz - 我添加了它,还修复了真值表(最后三个条目不正确)
  • 3 的输出不应该是 3...???!!!!

标签: c math


【解决方案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));

【讨论】:

  • 如果(input - min) 的结果为负数,这会起作用吗?我读过 C/C++,负数的模不是由语言定义的(结果的符号可能是负数)
【解决方案2】:

如果我正确理解了您的要求,这是我能想到的最简单的公式:x % (max - min) + min

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

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 2021-10-03
    • 2016-05-16
    • 1970-01-01
    • 1970-01-01
    • 2022-10-15
    • 2011-05-12
    • 2016-01-23
    • 1970-01-01
    相关资源
    最近更新 更多