【问题标题】:Simple Maths - calculating a rolling window of numbers (aha! negative modulus/remainders!!)简单数学 - 计算数字的滚动窗口(啊哈!负模数/余数!!)
【发布时间】:2012-10-17 12:17:16
【问题描述】:

我几乎不好意思问这个问题,因为它可能非常明显 - 但我看不出有什么办法摆脱这个问题,我怀疑有办法。

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

范围是 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;

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

准备好尴尬

【问题讨论】:

  • 为什么一定要一行长?
  • 正确的模数运算符已经这样做了。如果您使用余数运算符(在编程语言中通常为%)实现此操作,则行为会随着负数而变化,您需要发布的两条线。换句话说:您可能使用了余数运算符而不是正确的模运算符。
  • @raedwald 如果它是优雅的并且看起来和感觉像一个酒窝,它可能是 50 行 :)
  • @TaZ aha - 现在我意识到这不是一个不常见的问题,并且语言如何处理 Modulus 变化很大(并且建议似乎是这两种方法都不“正确” - 你只需要工作周围...)!?

标签: math


【解决方案1】:

正如 TaZ 所指出的,大多数“模”运算符实际上是余数运算符,它们只能像 x+val &gt;= 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

【讨论】:

  • 我特别需要 Javascript - 我之前在 cmets 中引用的问题表明... ((a+b)%a+b)%b 这真的很优雅,但我正在涂鸦记事本检查它:)
猜你喜欢
  • 1970-01-01
  • 2018-07-10
  • 2018-09-28
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多