Existe-t-il une raison, historique ou autrement, pourquoi l'opérateur de modulus fait partie d'un petit ensemble d'opérateurs standard dans ce qui semble être de nombreuses langues? (+, -, *, /
et %
, pour Java et C, avec **
In Ruby et python).
Il semble étrange d'inclure le mod comme un "fondamental" (ne pas le frapper, je l'utilise beaucoup, mais j'utilise également l'exponentiation, la valeur absolue, le plancher/le plafond ou d'autres - ils semblent tout aussi utiles et nécessaires). Était-ce une ancienne décision prise dans certaines spécifications que Java, c, Ruby et Python est-ce que tous suivent ou une langue sont tous descendes? Autant que je Peut dire que la plupart des dialectes LISP n'incluent que +, -, /
et *
.
Au début, je me suis demandé si Mod était particulièrement facile à mettre en œuvre au niveau binaire (cela ferait-il même une différence concernant les décisions sur ce qui devrait être un opérateur "fondamental" et ce qui ne devrait pas?) Mais cela ne semble pas être. Est-ce juste beaucoup plus couramment utilisé dans la programmation que je pense?
Je suis sûr qu'il est courant car de nombreuses architectures de la CPU implémentent modulus
comme deuxième sortie de l'instruction de division entier.
Je ne me souviens pas qu'il soit présent dans les CPU des années 1970 (6800, 8080, Z80, 1604, etc.), mais dans les années 1980, l'Intel 8086 et 8088, ainsi que le Motorola 6809 l'avaient.
L'architecture d'instruction PDP-11 spécifiée DIV
produisant un quotient et un reste du début (1970), bien que les instructions MUL et DIV n'étaient pas présentes sur des conceptions précoces, mais pourraient être émulées de manière transparente par une "instruction non mise en œuvre piège "et mis en œuvre avec un gestionnaire qui a passé un peu twiddling. La fonctionnalité PDP-11 a probablement encouragé la toute première édition de la langue C fournissant le %
caractéristique. (N'ayez jamais remarqué comment un signe de pourcentage a une barre oblique dans celle-ci? Cela en fait un choix intelligent pour un opérateur lié à la division.)
La présence de module dans C
seul peut probablement expliquer sa présence dans toutes les langues modernes. C
a une très grande famille de descendants et était autrement assez influent.
De nombreuses langues de programmation ont un opérateur "reste" qui peut être utilisé comme opérateur de module lorsque les deux opérandes sont positifs; Ledit opérateur est souvent appelé l'opérateur "module", car c'est son utilisation principale. Les langues ont généralement un tel opérateur car de nombreuses plateformes matérielles "Division de la division" fournissent automatiquement un reste lors de la répartition d'une division et de calculer un reste ou un module via tout autre moyen serait beaucoup plus difficile.
Je ne connais pas l'histoire du support matériel pour la division signée; De nombreux processeurs ont pour des années fournis dans le matériel qui peut effectuer automatiquement une division signée sous réserve de la règle que si les rendements A/B (Q, R), alors -a/b ou A/-B donneront (-q, -r), mais Je ne suis pas sûr des cas d'utilisation où la division utilisant cette règle est particulièrement utile. Dans presque tous les cas où j'ai utilisé des opérations de division entière ou "module" sur des valeurs négatives, je souhaitais que la division et une véritable opération de module (telle que (A + B)/B Toujours égal (A/B) +1 et (A + B)% B serait toujours égal à% b.). Parce que les opérateurs ne fonctionnent pas de cette façon, il est nécessaire de tester le signe du dividende et d'utiliser un code différent lorsqu'il est négatif - nier essentiellement tout avantage d'avoir une instruction de division signée en premier lieu. Je suis curieux pour quelles utiles que le support de division signé dans le matériel est réellement utile.
Revenant à la question initiale, l'opérateur de modulus est souvent utile dans des situations où certaines choses sont censées se produire de manière périodique, que ce soit dans l'espace (par exemple, des coordonnées graphiques) ou dans le temps. Par exemple, si l'on veut que l'événement se produise toutes les 15 secondes, l'heure jusqu'à ce que le prochain événement soit 15 (Time_Now - Time_of_an_ocurrence)% 15), --- (en supposant time_of_an_occurrence
n'est pas plus grand que time_now
. Si time_of_an_occurrence
étaient supérieurs à time_now
, un opérateur de modulus pourrait continuer à utiliser la même formule à condition que la soustraction n'a pas débordé, mais l'opérateur restant nécessitera une formule différente.
Modulus est étroitement lié à la théorie des groupes et des anneaux, qui sont des théories mathématiques très fondamentales.
L'exponciation n'est que la troisième opération dans l'addition de séquence, la multiplication, l'exponentiation, la tétration (et c'est une séquence infinie). Cela devient important principalement avec des nombres complexes, qui sont plus rares en arithmétique informatique. Une exponciation particulière est supportée explicitement, bien que: 2n est généralement écrit comme 1<<n
, car les ordinateurs sont assez binaires.
Le plancher et le plafond sont vraiment rares en comparaison: ils s'appliquent uniquement lors de la conversion de ℝ à ℤ. (point flottant en entier). De même, abs
est associé à un mappage de ℤ à ℕ
Désolé, mais au risque de transformer cela dans un jeu d'"appeler mon bluff", je pense que la vraie réponse à cette question est assez simple:
MOD permet des calculs précis dans les quantités "non décimales" et les unités telles que les dates, le temps, les mètres, les pouces, les onces, etc. dans des calculs décimaux, il fournit également une méthode permettant au programmeur de travailler à une précision numérique au-delà de celle fournie par le matériel de la machine. Cela a un grand nombre d'applications des très petits (E.g Calculs quantiques) au très grand (par exemple la découverte de nouveaux nombres premiers).
Il est important de comprendre que nous avons appelé ces ordinateurs pour une raison. Parfois, nous avons besoin d'eux pour nous donner la bonne réponse!