Warum ist mod (%) in vielen Programmiersprachen ein grundlegender mathematischer Operator?


17

Gibt es einen historischen oder sonstigen Grund, warum der Modul-Operator Teil einer kleinen Gruppe von Standard-Operatoren in scheinbar vielen Sprachen ist? ( +, -, *, /und %für Java und C mit **in Ruby und Python).

Es scheint seltsam, Mod als "grundlegend" einzuschließen (nicht um es anzuklopfen, ich verwende es häufig, aber ich verwende auch Potenzierung, absoluten Wert, Boden / Decke oder andere - sie scheinen genauso nützlich und notwendig zu sein). War dies eine alte Entscheidung, die in einer Spezifikation getroffen wurde, der Java, C, Ruby und Python folgen, oder eine Sprache, von der sie alle abstammen? Soweit ich weiß, enthalten die meisten Lisp-Dialekte nur +, -, /und *.

Zuerst habe ich mich gefragt, ob Mod auf der Binärebene besonders einfach zu implementieren ist (würde das überhaupt einen Unterschied machen, was Entscheidungen darüber betrifft, was ein "grundlegender" Operator sein soll und was nicht?), Aber es scheint nicht so zu sein. Wird es in der Programmierung nur viel häufiger verwendet, als ich denke?

Antworten:


20

Ich bin sicher, dass dies häufig vorkommt, da viele CPU-Architekturen moduluseine zweite Ausgabe des Integer-Divisionsbefehls darstellen.

Ich erinnere mich nicht, dass es in den 1970er-Jahren CPUs gab (6800, 8080, Z80, 1604 usw.), aber in den 1980er-Jahren hatten es Intel 8086 und 8088 sowie das Motorola 6809.

Die angegebene PDP-11-Befehlsarchitektur DIVerzeugte von Anfang an (1970) einen Quotienten und einen Rest, obwohl die MUL- und DIV-Befehle bei frühen Entwürfen nicht vorhanden waren, sondern durch eine "Befehl nicht implementiert-Falle" transparent emuliert und mit einem implementiert werden konnten Handler, der ein bisschen herumwirbelte. Wahrscheinlich hat die PDP-11-Funktion die allererste Ausgabe der C-Sprache gefördert, die diese %Funktion bietet . (Bemerken Sie jemals, wie ein Prozentzeichen einen Schrägstrich enthält? Das macht es zu einer klugen Wahl für einen divisionsbezogenen Betreiber.)

Das Vorhandensein von Modul Callein kann wahrscheinlich das Vorhandensein in allen modernen Sprachen erklären. Chat eine sehr große Familie von Nachkommen und war ansonsten ziemlich einflussreich.


3
Der Einfluss von +1 C auf so gut wie jede Nicht-LISP-Sprache seit Anfang der 1970er Jahre kann nicht überbewertet werden.
Ross Patterson

8

Viele Programmiersprachen haben einen "Rest" -Operator, der als Moduloperator verwendet werden kann, wenn beide Operanden positiv sind. Dieser Operator wird oft als "Modul" -Operator bezeichnet, da dies seine Hauptverwendung ist. Sprachen haben im Allgemeinen einen solchen Operator, weil die Divisionshardware vieler Hardwareplattformen beim Durchführen einer Division automatisch einen Rest liefert und das Berechnen eines Restes oder Moduls über andere Mittel viel schwieriger wäre.

Ich kenne die Geschichte der Hardwareunterstützung für signierte Divisionen nicht. Viele Prozessoren haben jahrelang Hardware bereitgestellt, die automatisch eine vorzeichenbehaftete Division durchführen kann, unter der Bedingung, dass -a / b oder a / b (-q, -r) ergeben, wenn a / b (q, r) ergibt, aber Ich bin mir nicht sicher, in welchen Anwendungsfällen die Aufteilung nach dieser Regel besonders hilfreich ist. In fast allen Fällen, in denen ich Integer-Division oder "Modul" -Operationen für negative Werte verwendet habe, wollte ich eine Unendlich-Rundung für die Division und eine echte Modul-Operation (so dass (a + b) / b) immer gleich (a / b) +1 und (a + b)% b wäre immer gleich a% b.) Da die Operatoren nicht so arbeiten, ist es notwendig, das Vorzeichen der Dividende zu testen und einen anderen Code zu verwenden, wenn es " s negativ - annulliert im Wesentlichen jeden Vorteil, der daraus resultiert, dass eine Divisionsanweisung unterzeichnet ist. Ich bin gespannt, zu welchen Zwecken die Unterstützung von Signed-Division in der Hardware tatsächlich sinnvoll ist.

Zurück zur ursprünglichen Frage: Der Modulusoperator ist häufig in Situationen nützlich, in denen bestimmte Dinge periodisch geschehen sollen, entweder räumlich (z. B. grafische Koordinaten) oder zeitlich. Wenn ein Ereignis beispielsweise alle 15 Sekunden stattfinden soll, beträgt die Zeit bis zum nächsten Ereignis 15 - ((time_now - time_of_an_occurrence)% 15), vorausgesetzttime_of_an_occurrencetime_now , sie ist nicht größer als . Wenn time_of_an_occurrencegrößer als wäre time_now, könnte ein Moduloperator weiterhin dieselbe Formel verwenden, vorausgesetzt, die Subtraktion läuft nicht über, aber der Restoperator benötigt eine andere Formel.


3
Aus diesem Grund verfügt Haskell über zwei Operatoren: remfür den Rest und modfür den Modul mit den von Ihnen beschriebenen Eigenschaften.
Ingo

@Complicatedseebio: Besonders lustig ist, dass es oft als Modul-Operator bezeichnet wird, da es im Allgemeinen zur Berechnung des Moduls verwendet wird, auch wenn dafür Code wie erforderlich ist m = number % base; if (m < 0) m+=base;. Ich weiß nicht, dass ich jemals einen Code gesehen habe, der davon profitiert hat, dass der Restoperator negativ wird, außer vielleicht q = n/d; if (n%d < 0) q+=1;, der auf jeden Fall besser auf andere Weise geschrieben werden könnte.
Superkatze

3

Der Modul ist eng mit der Gruppen- und Ringtheorie verwandt, die sehr grundlegende mathematische Theorien sind.

Exponentiation ist nur die dritte Operation in der Sequenz Addition, Multiplikation, Exponentiation, Tetration (und das ist eine unendliche Sequenz). Es wird vor allem bei komplexen Zahlen wichtig, die in der Computerarithmetik seltener sind. Eine bestimmte Exponentiation wird jedoch explizit unterstützt: 2 n wird allgemein als geschrieben 1<<n, da Computer ziemlich binär sind.

Boden und Decke sind im Vergleich wirklich selten: Sie gelten nur bei Umrechnung von ℝ nach ℤ. (Gleitkomma zu Ganzzahl). Ebenso absist mit einer Zuordnung von ℤ zu ℕ verbunden


ℤ sind die ganzen Zahlen (und ℕ ist eine Teilmenge von ganzen Zahlen), Sie müssen von ℝ bis ℤ bedeuten.
Joni

@ Joni: Gemischte zwei Beispiele, behoben.
MSalters

0

Entschuldigung, aber auf die Gefahr, daraus ein Spiel von "Call My Bluff" zu machen, denke ich, dass die wirkliche Antwort auf diese Frage ganz einfach ist:

Mod ermöglicht genaue Berechnungen in "nicht-dezimalen" Mengen und Einheiten wie Datum, Uhrzeit, Yard, Zoll, Unze usw. Bei Dezimalberechnungen bietet es auch eine Methode, mit der der Programmierer mit einer numerischen Genauigkeit arbeitet, die über die von der Hardware bereitgestellte hinausgeht der Maschine. Dies hat eine große Anzahl von Anwendungen, von sehr kleinen (z. B. Quantenberechnungen) bis sehr großen (z. B. das Entdecken neuer Primzahlen).

Es ist wichtig zu verstehen, dass wir diese Dinge aus einem bestimmten Grund Computer genannt haben. Manchmal brauchen wir sie, um die richtige Antwort zu geben!


Diese Antwort macht keinen Sinn ... Was ist der Zusammenhang zwischen der Verwendung von "mod" und der Verwendung verschiedener Einheiten?
Durch die Nutzung unserer Website bestätigen Sie, dass Sie unsere Cookie-Richtlinie und Datenschutzrichtlinie gelesen und verstanden haben.
Licensed under cc by-sa 3.0 with attribution required.