为什么mod(%)是许多编程语言中的基本数学运算符?


17

有某种历史原因或其他原因,为什么模数运算符是一小套标准运算符的一部分,而这似乎是许多语言的一部分呢?(+, -, *, /%,对于Java和C,以及**在Ruby和Python中的)。

将mod包含为“基本的”似乎很奇怪(不要敲它,我经常使用它,但是我也使用幂运算,绝对值,下限/上限或其他-它们似乎同样有用且必要)。这是某个规范中做出的一个旧决定,即遵循Java,C,Ruby和Python还是它们都衍生自某种语言?据我所知,大多数Lisp方言仅包括+, -, /*

刚开始,我想知道mod是否在二进制级别上特别容易实现(关于决定什么是“基本”运算符,什么不应该?)甚至会有所作为),但似乎并非如此。它只是比我想的更常用于编程中吗?

Answers:


20

我敢肯定这很常见,因为许多CPU体系结构都将其modulus作为整数除法指令的第二个输出来实现。

我不记得它出现在1970年代的CPU(6800、8080,Z80、1604等)中,但是到了1980年代,英特尔8086和8088以及摩托罗拉6809都使用了它。

DIV尽管早期的设计中没有MUL和DIV指令,但PDP-11指令体系结构从一开始就规定了商和余数(1970年),但是可以由“未实现的指令陷阱”透明地模拟,并使用处理程序确实有点儿花哨。PDP-11功能可能鼓励使用提供该%功能的C语言的第一版。(您是否注意到百分号内有一个斜杠?这使它成为除法相关运算符的明智选择。)

模数的C单独存在可能可以解释所有现代语言中模数的存在。 C有很多后裔家族,否则影响很大。


3
自1970年代初以来,+ 1 C对几乎所有非LISP语言的影响都不能高估。
Ross Patterson

8

许多编程语言都有一个“余数”运算符,当两个操作数均为正数时,可以用作模数运算符。所述运算符通常被称为“模”运算符,因为这是其主要用途。语言通常具有这种运算符,因为许多硬件平台的除法硬件在执行除法时会自动提供余数,并且通过任何其他方式计算余数或模数会更加困难。

我不知道签名部门的硬件支持历史。多年来,许多处理器都提供了可以自动执行有符号除法的硬件,但要遵循以下规则:如果a / b产生(q,r),则-a / b或a / -b会产生(-q,-r),但是我不确定使用该规则进行除法特别有用的用例。在几乎所有对负值使用整数除法或“取模”运算的情况下,我都希望对除法进行舍入到负负无穷大并采用真模运算(例如(a + b)/ b始终等于(a / b)+1和(a + b)%b始终等于a%b。)。由于运营商的工作方式并非如此,因此有必要测试分红的符号并在分红时使用不同的代码。s否定的-从根本上来说,消除使用签名的除数指令的任何好处。我很好奇硬件中的符号分区支持实际上有什么用。

回到原始问题,模量算子通常在某些事物应该在空间(例如图形坐标)或时间上周期性发生的情况下很有用。例如,如果希望每15秒发生一次事件,则假设time_of_an_occurrence不大于time_now,则直到下一个事件的时间将为15-((time_now-time_of_an_occurrence)%15)。如果time_of_an_occurrence大于time_now,则模数运算符可以继续使用相同的公式,前提是减法没有溢出,但是余数运算符将需要不同的公式。


3
因此,Haskell具有两个运算符:rem余数和mod具有所描述属性的模数。
Ingo

@Complicatedseebio:尤其有趣的是,它通常被称为模数运算符,因为它通常用于计算模数,即使需要诸如之类的代码也是如此m = number % base; if (m < 0) m+=base;。我不知道我曾经见过任何可得自余数运算符的代码都会q = n/d; if (n%d < 0) q+=1;变为负数,除了,也许在任何情况下都可以用其他方式更好地编写。
2014年

3

模数与群和环理论密切相关,群和环理论是非常基础的数学理论。

求幂只是序列加法,乘法,求幂,四乘(这是无限序列)中的第三项操作。它确实变得很重要,主要是因为复数在计算机算术中很少见。不过,显式支持一种特定的幂运算:2 n通常写为1<<n,因为计算机是非常二进制的。

地板和天花板在比较中确实很少见:它们仅在从ℝ转换为apply时适用。(浮点数到整数)。同样,abs与从ℤ到ℕ的映射关联


ℤ是整数(and是整数的子集),必须表示从from到ℤ。
乔尼

@Joni:混合了两个示例,已修复。
MSalters

0

抱歉,但是冒着将它变成“ Call My Bluff”游戏的风险,我认为这个问题的真正答案很简单:

Mod允许以“非十进制”数量和单位(例如日期,时间,码,英寸,盎司等)进行精确计算。在十进制计算中,它还为程序员提供了一种方法,可以以超出硬件提供的数值精度工作机器的。从很小的应用程序(例如量子计算)到很大的应用程序(例如发现新质数),这具有大量的应用。

重要的是要了解我们将这些东西称为计算机的原因。有时我们需要他们给我们正确的答案!


这个答案没有道理...使用“ mod”和使用不同单位之间有什么联系?
By using our site, you acknowledge that you have read and understand our Cookie Policy and Privacy Policy.
Licensed under cc by-sa 3.0 with attribution required.