【问题标题】:What Is The Purpose of Negative Modulus Operator Results?负模算子结果的目的是什么?
【发布时间】:2011-07-20 01:12:44
【问题描述】:

我之前(天真的)假设模运算符返回除法的余数。我显然错了,因为 -2 % 5 返回 3。我原以为 5 除以 -2 零次,余数为 -2。

现在我了解了如何执行此操作的机制,但我的问题是为什么?有人可以给我一个链接来解释为什么模数和余数不是同义词,或者一个有用的情况示例吗?

【问题讨论】:

  • 有谁知道为什么在 Mac 上输入 -2%5 时会给出 -2 而不是 3 的答案?谢谢
  • 您应该接受这些答案之一。就个人而言,我喜欢浮雕。

标签: operator-keyword modulus


【解决方案1】:

结果完全正确。模算术定义了以下内容(我将使用“全等”,因为我不能用三行输入等号)

a congruent b mod c iff a-b 是 c 的倍数,即 x * c = (a-b) 对于某个整数 x。

例如

0 congruent 0 mod 5 (0 * 5 = 0-0)
1 congruent 1 mod 5 (0 * 5 = 1-1)
2 congruent 2 mod 5 (0 * 5 = 2-2)
3 congruent 3 mod 5 (0 * 5 = 3-3)
4 congruent 4 mod 5 (0 * 5 = 4-4)
5 congruent 0 mod 5 (1 * 5 = 5-0)
6 congruent 1 mod 5 (1 * 5 = 6-1)
...

同样可以扩展到负整数:

-1 congruent 4 mod 5 (-1 * 5 = -1-4)
-2 congruent 3 mod 5 (-1 * 5 = -2-3)
-3 congruent 2 mod 5 (-1 * 5 = -3-2)
-4 congruent 1 mod 5 (-1 * 5 = -4-1)
-5 congruent 5 mod 5 (-1 * 5 = -5-0)
-6 congruent 4 mod 5 (-2 * 5 = -6-4)
-7 congruent 3 mod 5 (-2 * 5 = -7-3)
...

如您所见,很多整数都是全等的 3 mod 5: ..., -12, -7, -2, 3, 8, 13, ...

在数学中,这些数的集合称为由等价关系“同余”引出的等价类。我们对余数的理解和“mod”函数的定义都是基于这个等价类。 “余数”或 mod 计算的结果是等价类的代表元素。通过声明,我们选择了最小的 non-negative 元素(所以 -2 不是一个有效的候选)。

因此,当您阅读 -2 mod 5 = x 时,这将转换为“找到最小的非负 x,以便存在一个具有 y * 5 = -2 - x 的整数 y”,这与同余的定义一致。解决方案是 y=1 和 x = 3,您只需尝试 y 的其他值即可。

【讨论】:

    【解决方案2】:

    a = n (mod m) 定义为a = n + m*t,它同样适用于负数。 (另一种看是a = n (mod m) 表示(a - n)m 的倍数)

    -2 = 3 (mod 5) 因为 -2 = 3 - 5 (即 t = -1)

    约定是取modulo m 的结果是一个介于 0 和 m - 1(含)之间的数字

    【讨论】:

    • 还有-2 = -2 + 0,即t = 0,那么这有什么帮助呢?
    • 你的陈述是微不足道的,所以它什么也没说。我已经说明了如何定义模数。
    【解决方案3】:

    你得到的基本保证是

    (a % b) + b * (a / b)  == a
    

    对于有符号值,没有理由将任何一个符号作为模运算或除法运算的首选结果。一些语言修复一种形式,而另一些则将其留给实现,以便实现可以使用硬件碰巧提供的任何方式。反过来,可能已选择硬件指令来有效地操作硬件对有符号整数的表示。

    通常,在将有符号整数与除法、余数和位移运算一起使用时要非常小心。

    【讨论】:

      【解决方案4】:

      我想这取决于您是希望结果向下舍入还是向 0 舍入:

      2 / 5 = 0.4 = 5*0 + 2 在这两种情况下都有效,而
      -2 / 5 = -0.4 = 5*0 + -2 如果您向 0 舍入(截断),
      -2 / 5 = -0.4 = 5*-1 + 3 如果您向下舍入(下限)。

      请注意,在第二种情况下,结果始终为正(对于正除数),这将很有用,例如,在计算数组索引时:

      hashmapBuckets[getIntHash(obj) % hashmapBuckets.size].add(obj)

      或归一化一个角度:

      angle = angle % 360; //0-359

      实际上是另一种情况,我很难找到实际的例子:)

      --

      哦,Wikipedia page on the modulo operation 有一些不错的图表。请注意,余数始终与除数的除数具有相同的符号。

      【讨论】:

        【解决方案5】:

        将模数视为一个运算符,它将长度为 y 的线(以 y % x 表示)围绕 x 钉子圈。未完全环绕 x 的线的剩余长度是结果。

        【讨论】:

        • 我认为你在描述y % x
        猜你喜欢
        • 1970-01-01
        • 2013-08-17
        • 1970-01-01
        • 1970-01-01
        • 2018-02-14
        • 2017-05-23
        • 2017-07-12
        • 1970-01-01
        • 1970-01-01
        相关资源
        最近更新 更多