多くのプログラミング言語でmod(%)が基本的な数学演算子であるのはなぜですか?


17

モジュラス演算子が多くの言語のように見える標準演算子の小さなセットの一部である理由は、歴史的であろうとなかろうと、ありますか?(+, -, *, /および%、JavaおよびCの場合**、RubyおよびPythonの場合)。

modを「基本」として含めるのは奇妙に思えます(たたくのではなく、たくさん使いますが、累乗、絶対値、下限/天井なども使用します。これは、Java、C、Ruby、Pythonがすべて従う特定の仕様で行われた古い決定でしたか、それともすべての派生言語ですか?私の知る限り、ほとんどのLisp方言には+, -, /とのみが含まれてい*ます。

最初は、modがバイナリレベルで実装するのが特に簡単かどうか疑問に思いました(「基本的な」演算子とすべきでないものに関する決定に関して違いが生じるのでしょうか)。それは私が考えるよりもプログラミングではるかに一般的に使用されていますか?

回答:


20

多くのCPUアーキテクチャmodulusが整数除算命令の2番目の出力として実装されているため、これは一般的だと確信しています。

1970年代のCPU(6800、8080、Z80、1604など)に存在していたことは思い出せませんが、1980年代にはIntel 8086と8088、およびMotorola 6809に搭載されました。

PDP-11命令アーキテクチャDIVは、初期(1970年)から商と剰余を生成することを指定しましたが、MULおよびDIV命令は初期設計には存在しませんでしたが、「命令未実装トラップ」によって透過的にエミュレートでき、少しいじっていたハンドラ。おそらくPDP-11機能は、この%機能を提供するC言語の最初のエディションを奨励しました。(パーセント記号にスラッシュが含まれていることに気付いたでしょうか。これは、部門に関連する演算子にとって賢明な選択になります。)

モジュラスのC単独での存在は、おそらくすべての現代言語でのその存在を説明できます。 C子孫の非常に大きな家族を持ち、他の点では非常に影響力がありました。


3
1970年代初頭以来、ほとんどすべての非LISP言語に対するCの影響は誇張することはできません。
ロスパターソン

8

多くのプログラミング言語には、「オペランド」演算子があります。これは、両方のオペランドが正の場合にモジュラス演算子として使用できます。この演算子は主に「モジュラス」演算子と呼ばれます。多くのハードウェアプラットフォームの除算ハードウェアは、除算を実行するときに自動的に剰余を提供し、他の手段で剰余またはモジュラスを計算することははるかに難しいため、言語には一般にこのような演算子があります。

署名済み部門のハードウェアサポートの歴史は知りません。多くのプロセッサは、a / bが(q、r)を生成する場合、-a / bまたはa / -bが(-q、-r)を生成するというルールに従って、符号付き除算を自動的に実行できるハードウェアを長年提供してきましたが、そのルールを使用した除算が特に役立つユースケースがわかりません。負の値で整数除算または「モジュラス」演算を使用したほとんどすべての場合、除算で負の無限大への丸めと真のモジュラス演算((a + b)/ b常に(a / b)+1に等しく、(a + b)%bは常にa%bに等しくなります。)演算子はそのように機能しないため、配当の符号をテストし、それが発生したときに別のコードを使用する必要があります s否定-そもそも符号付き除算命令を使用することの利点を本質的に無効にします。ハードウェアでの符号付き分割サポートが実際にどのような目的に役立つのか興味があります。

元の質問に戻ると、モジュラス演算子は、特定の事柄が空間(たとえば、グラフィック座標)または時間のいずれかで定期的に発生することになっている状況で役立つことがよくあります。1がイベントを持っているしたい場合たとえば、15秒ごとに起こる、次のイベントまでの時間は15になります- ((TIME_NOW - time_of_an_occurrence)%15)、仮定がtime_of_an_occurrenceより大きくありませんtime_nowtime_of_an_occurrenceがより大きい場合time_now、モジュラス演算子は減算がオーバーフローしなければ同じ式を使用し続けることができますが、剰余演算子には別の式が必要になります。


3
そのため、Haskellには2つの演算子があります。それremは、剰余とmod、記述したプロパティを持つモジュラスです。
インゴ

@Complicatedseebio:特に面白いのは、モジュラス演算子のようなコードが必要な場合でも、モジュラスの計算に一般的に使用されるため、モジュラス演算子と呼ばれることm = number % base; if (m < 0) m+=base;です。おそらくを除いて、剰余演算子が負になることで恩恵を受けるコードを見たことがあるかどうかはわかりませんq = n/d; if (n%d < 0) q+=1;
supercat 14年

3

モジュラスは、非常に基本的な数学的理論であるグループおよびリング理論と密接に関連しています。

べき乗は、シーケンスの加算、乗算、べき乗、テトラションの3番目の演算にすぎません(これは無限シーケンスです)。これは主に複素数で重要になりますが、これはコンピューターの演算ではまれです。ただし、1つの特定のべき乗が明示的にサポートされていますが、コンピューターは非常にバイナリであるため、2 nは一般的にとして記述され1<<nます。

床と天井は、比較すると非常にまれです:Theyからconvertingに変換する場合にのみ適用されます。(浮動小数点から整数へ)。同様に、absisからℤへのマッピングに関連付けられています


は整数(およびℕは整数のサブセット)です。、からmeanまでを意味する必要があります。
ジョニ

@Joni:2つの例の混合、修正。
–MSalters

0

申し訳ありませんが、これを「Call My Bluff」のゲームに変えるリスクがあるため、この質問に対する本当の答えは非常に簡単だと思います。

Modは、日付、時刻、ヤード、インチ、オンスなどの「10進数ではない」数量と単位で正確な計算を可能にします。マシンの。これには、非常に小さい(例えば、量子計算)から非常に大きい(例えば、新しい素数の発見)まで、膨大な数のアプリケーションがあります。

これらのことを何らかの理由でコンピューターと呼んだことを理解することが重要です。時々、私たちは彼らに正しい答えを与える必要があります!


この答えは意味がありません...「mod」の使用と異なるユニットの使用との関係は何ですか?
弊社のサイトを使用することにより、あなたは弊社のクッキーポリシーおよびプライバシーポリシーを読み、理解したものとみなされます。
Licensed under cc by-sa 3.0 with attribution required.