【发布时间】:2012-07-22 17:44:05
【问题描述】:
数学:
如果你有这样的等式:
x = 3 mod 7
x 可以是 ... -4、3、10、17、...,或更一般地说:
x = 3 + k * 7
其中 k 可以是任何整数。我不知道为数学定义了模运算,但因子环肯定是。
Python:
在 Python 中,当您将 % 与正数 m 一起使用时,您将始终得到非负值:
#!/usr/bin/python
# -*- coding: utf-8 -*-
m = 7
for i in xrange(-8, 10 + 1):
print(i % 7)
结果:
6 0 1 2 3 4 5 6 0 1 2 3 4 5 6 0 1 2 3
C++:
#include <iostream>
using namespace std;
int main(){
int m = 7;
for(int i=-8; i <= 10; i++) {
cout << (i % m) << endl;
}
return 0;
}
将输出:
-1 0 -6 -5 -4 -3 -2 -1 0 1 2 3 4 5 6 0 1 2 3
ISO/IEC 14882:2003(E) - 5.6 乘法运算符:
二元 / 运算符产生商,二元 % 运算符 产生第一个表达式除以的余数 第二。如果 / 或 % 的第二个操作数为零,则行为是 不明确的;否则 (a/b)*b + a%b 等于 a。如果两个操作数都是 非负,则余数为非负;如果不是,的符号 余数是实现定义的 74).
和
74) 根据正在进行的 ISO C 修订工作, 整数除法的首选算法遵循定义的规则 ISO Fortran 标准 ISO/IEC 1539:1991,其中商为 总是向零舍入。
(我找不到ISO/IEC 1539:1991 的免费版本。有人知道从哪里得到它吗?)
操作好像是这样定义的:
问题:
这样定义有意义吗?
这个规范的论据是什么?创建此类标准的人是否有讨论它的地方?我在哪里可以了解他们决定这样做的原因?
大多数时候,当我使用模数时,我想访问数据结构的元素。在这种情况下,我必须确保 mod 返回一个非负值。因此,对于这种情况,最好 mod 总是返回一个非负值。 (另一种用法是Euclidean algorithm。由于您可以在使用此算法之前将两个数字都设为正数,因此模数的符号很重要。)
附加材料:
请参阅Wikipedia,了解模数在不同语言中的作用。
【问题讨论】:
-
C(以及 C++)的通常原因是现有硬件以某种方式进行数学运算。语言标准只是记录正在发生的事情(以及没有发生的事情)。
-
对这个问题的一个有用补充可能是“在 C++ 代码中获得 Python 显示的行为的一个好的替代方法是什么?”
-
这里解释了获得
mod正值的好方法:[stackoverflow.com/a/12277233/228965]