多くの言語のように見えるのに、モジュラス演算子が標準演算子の小さなセットの一部である理由、歴史的またはそれ以外の理由はありますか? (+, -, *, /
および%
、JavaおよびC、**
はRubyおよびPython)の場合)。
Modを「基本的な」ものとして含めるのは奇妙に思えます(ノックするのではなく、十分に使用しますが、指数、絶対値、床/天井なども使用します-それらは同じように有用で必要なようです)。これは、Java、C、RubyおよびPythonがすべて従う言語、またはすべての子孫の言語であるという仕様で行われた古い決定でしたか?ほとんどのLISP方言には+, -, /
と*
のみが含まれることを伝えることができます。
最初に、modがバイナリレベルで実装するのが特に簡単かどうか疑問に思いました(「基本的な」演算子と何をすべきでないかについての決定に関して、それは違いを生むでしょうか?)が、そうではないようです。それは私が思っているよりもはるかに一般的にプログラミングで使用されていますか?
多くのCPUアーキテクチャは整数除算命令の2番目の出力としてmodulus
を実装しているため、これは一般的だと確信しています。
1970年代のCPU(6800、8080、Z80、1604など)に存在していたことは覚えていませんが、1980年代までには、Intel 8086と8088、およびMotorola 6809に搭載されていました。
PDP-11命令アーキテクチャはDIV
を指定して、最初(1970年)から商と剰余を生成しましたが、MULおよびDIV命令は初期の設計には存在しませんでしたが、「実装されていない命令」によって透過的にエミュレートできましたトラップ」と少しいじったハンドラで実装されました。おそらく、PDP-11機能は、%
機能を提供するC言語の最初のエディションを奨励しました。 (パーセント記号にスラッシュが含まれていることに気づいたことはありませんか?これにより、除算関連のオペレーターにとって賢い選択になります。)
C
だけでのモジュラスの存在は、おそらくすべての現代言語でのその存在を説明することができます。 C
には子孫のファミリーが非常に多く、それ以外の点では非常に影響力がありました。
多くのプログラミング言語には、両方のオペランドが正の場合に剰余演算子として使用できる「剰余」演算子があります。この演算子は主に使用されるため、「モジュラス」演算子と呼ばれることがよくあります。多くのハードウェアプラットフォームの除算ハードウェアは除算を実行するときに自動的に剰余を供給し、他の方法で剰余または係数を計算することははるかに難しいため、言語には一般にそのような演算子があります。
署名付き除算のハードウェアサポートの履歴はわかりません。多くのプロセッサは、a/bが(q、r)を生成する場合、-a/bまたはa/-bが(-q、-r)を生成するという規則に従って、自動的に符号付き除算を実行できるハードウェアを提供してきましたが、そのルールを使用した除算が特に役立つユースケースはわかりません。負の値に整数除算または「モジュラス」演算を使用したほとんどすべてのケースで、除算で丸めの負の無限大と真のモジュラス演算((a + b)/ bが(a/b)+1と常に等しく、(a + b)%bは常にa%bと等しくなります。)演算子はそのように機能しないため、被除数の符号をテストし、それが負の場合は別のコードを使用する必要があります。つまり、最初に符号付き除算命令を使用することによる利点をすべて否定する必要があります。ハードウェアでの署名付き分割のサポートが実際にどのような目的に役立つのか知りたいです。
元の質問に戻ると、モジュラス演算子は、空間(グラフィック座標など)または時間のいずれかで特定のことが定期的に発生することが想定されている状況で役立ちます。たとえば、イベントを15秒ごとに発生させたい場合、次のイベントまでの時間は15(time_now-time_of_an_occurrence)%15)になります---(_time_of_an_occurrence
_を想定すると_time_now
_。 _time_of_an_occurrence
_が_time_now
_より大きい場合、減算がオーバーフローしなければ、モジュラス演算子は同じ式を引き続き使用できますが、残りの演算子は別の式を必要とします。
モジュラスは、非常に基本的な数学的理論であるグループ理論とリング理論に密接に関連しています。
指数は、シーケンスの加算、乗算、指数、テトラションの3番目の演算にすぎません(これは無限シーケンスです)。これは主に、コンピュータ演算ではまれな複素数で重要になります。 1つの特定の指数が明示的にサポートされていますが、次のとおりです。2ん 通常、1<<n
、コンピュータはかなりバイナリなので。
床と天井は比較すると本当にまれです:それらはfromからconvertingに変換するときにのみ適用されます。 (浮動小数点から整数)。同様に、abs
はfromからℕへのマッピングに関連付けられています
申し訳ありませんが、これを「コールマイブラフ」のゲームに変えるリスクがあるので、この質問に対する本当の答えは非常に簡単だと思います。
Modを使用すると、日付、時刻、ヤード、インチ、オンスなどの「非10進数」の量と単位で正確な計算が可能になります。10進数の計算では、ハードウェアが提供する数値精度を超えてプログラマーが作業する方法も提供しますマシンの。これには、非常に小さい(量子計算など)から非常に大きい(新しい素数の発見など)まで、非常に多くのアプリケーションがあります。
理由のためにこれらをコンピュータと呼んだことを理解することが重要です。時々、私たちは正しい答えを与えるためにそれらを必要とします!