「mod」と「remainder」の違いは何ですか?


133

「mod」と「remainder」には違いがあると私の友人は言った。

もしそうなら、CとC ++の違いは何ですか?「%」はCで「mod」または「rem」を意味しますか?


2
負のオペランドの場合、おそらく正しく定義されていません。
Basile Starynkevitch

1
私はCの人ではありません:(回答ボックスでは答えられません。この記事をご覧ください:)
bonCodigo

1
%は剰余です。> -ここでの回答の詳細blogs.msdn.com/b/ericlippert/archive/2011/12/05/...
WIM

1
質問は、用語の意味を正確に定義するまで意味がありません。
David Heffernan

14
@David:質問は用語の意味についてです。質問者が意図した方法でそれを理解している人が何人かいるにもかかわらず、質問に意味がないと言う場合、「平均」という言葉の意味をより具体的にする必要があると思います;-)
Steve Jessop

回答:


140

係数と残差には違いがあります。例えば:

-21modが4ある3ため-21 + 4 x 6です3

しかし、-21で割っ4与え-5の残りの部分-1

正の値の場合、違いはありません。


22
%はCのレムを意味します
banuj

22
@Jinxiao:C89では、それは実装定義%でした:常に剰余でしたが、C89では整数除算が0ではなく負の無限大に丸めることが許可されていたため、係数(つまり、常に正)である可能性もあります。したがって、C89では-5 / 2可能性が-2残り-1、または-3残りの部分と1、ちょうどその文書に持っていた実装。C99は柔軟性を取り除いたので、今-5 / 2は常に-2です。
スティーブジェソップ

2
実際には、係数が何であるかは明らかではありません。文脈や言語に応じて、多くの異なる定義があるようです。modulo_operationに関するウィキペディアの記事を参照してください。一部のコンテキストでは、それは実際には残りと同じです。
Rudy Velthuis、2014年

9
誰かが最初の計算の手順を説明できますか?どのように-21modが4ありますか3?なぜ計算なの-21 + 4 x 6か?
Oz Edri

13
@OzEdri mod 4を取得するには、0〜3の数値を取得するために必要な4の整数倍を追加します-21 + 4 x 6
David Schwartz

47

「%」はCで「mod」または「rem」を意味しますか?

Cでは%残り1です。

...、/演算子の結果は、小数部分が破棄された代数商です...(これは、しばしば「ゼロへの切り捨て」と呼ばれます。)C11dr§6.5.56

演算子のオペランド%は整数型でなければなりません。C11dr§6.5.52

/演算子の結果は、最初のオペランドを2番目のオペランドで除算した商です。%演算子の結果は余りです... C11dr§6.5.55


「mod」と「remainder」の違いは何ですか?

Cは、ユークリッド除算その他のモジュロで使用される整数モジュラス関数などの「mod」を定義していません。「ユークリッドmod」はa%baが負の場合のCの演算とは異なります。

 // a % b
 7 %  3 -->  1  
 7 % -3 -->  1  
-7 %  3 --> -1  
-7 % -3 --> -1   

ユークリッド除算としてのモジュロ

 7 modulo  3 -->  1  
 7 modulo -3 -->  1  
-7 modulo  3 -->  2  
-7 modulo -3 -->  2   

候補モジュロコード:

int modulo_Euclidean(int a, int b) {
  int m = a % b;
  if (m < 0) {
    // m += (b < 0) ? -b : b; // avoid this form: it is UB when b == INT_MIN
    m = (b < 0) ? m - b : m + b;
  }
  return m;
}

浮動小数点に関する注意:double fmod(double x, double y)、「fmod」と呼ばれていますが、ユークリッド除算の「mod」とは異なりますが、Cの整数の剰余に似ています。

fmod 関数は、浮動小数点剰余を計算しますx/y。C11dr§7.12.10.12

fmod( 7,  3) -->  1.0  
fmod( 7, -3) -->  1.0  
fmod(-7,  3) --> -1.0  
fmod(-7, -3) --> -1.0   

曖昧性除去:Cにも同様の名前付き関数がdouble modf(double value, double *iptr)あり、引数の値を整数部分と小数部分に分割します。各部分は、引数と同じ型と符号を持っています。これは、名前の類似性を除いて、ここでの「mod」の説明とはほとんど関係ありません。


1 C99より前は、Cの定義%は依然として除算の残りでしたが、/負の商は「ゼロへの切り捨て」ではなく切り捨てることができました。C89で整数除算の値が異なるのはなぜですか?を参照してください。したがって、C99より前のコンパイルでは、%コードはユークリッド除算の「mod」のように機能します。上記modulo_Euclidean()は、この代替の古い学校の残りでも動作します。


1
Cでユークリッド除算および剰余関数を実装するには、「コンピュータ科学者のための除算および係数」を参照してください。配当のみがマイナスになる可能性があることを知っていれば、より速く実行できますが、除数は常にプラスになります:godbolt.org/g/63UqJo。関連:非負のモジュロを求めるx86 asm質問
Peter Cordes

モジュロ演算子の通常の定義は、より多くのようなものです:
マイクHousky

2

モジュラス演算とは、モジュラー演算では、算術除算後に残った値または残りの値です。これは一般に剰余として知られています。%は正式にはC / C ++の剰余演算子です。例:

7 % 3 = 1  // dividend % divisor = remainder

議論の余地は、この%演算への負の入力をどのように扱うかです。最新のCおよびC ++は、この演算に対して符号付き剰余値を生成します。この場合、結果の符号は、除数入力の符号に関係なく常に被除数入力と一致します。


1

CとC ++および多くの言語で%は、剰余演算子ではなく、剰余演算子です。

たとえば、演算で-21 / 4は整数部は-5で、小数部は-.25です。剰余は小数部に除数を掛けたものなので、残りは-1です。JavaScriptは剰余演算子を使用してこれを確認します

console.log(-21 % 4 == -1);

モジュラス演算子は、「クロック」のようなものです。12時、3時、6時、9時の位置にそれぞれ0、1、2、3の値を持つ円を想像してください。時計回りに商時間を進めると、モジュラス演算の結果が表示されます。この例では、負の商を使用すると反時計回りに3になります。

注:係数は常に除数と同じ符号で、残りは商と同じ符号です。剰余の少なくとも1つが負であるときに除数と剰余を加算すると、係数が生成されます。


-2

数学では、剰余演算の結果はユークリッド除算の残りの部分です。ただし、他の規則も可能です。コンピュータと計算機には、数値を保存および表現するさまざまな方法があります。したがって、それらのモジュロ演算の定義は、プログラミング言語や基盤となるハードウェアに依存します。

 7 modulo  3 -->  1  
 7 modulo -3 --> -2 
-7 modulo  3 -->  2  
-7 modulo -3 --> -1 

2
ウィキユークリッド除算がアサート0 ≤ r < |b|別名余りを意味し、「モジュロ演算」を は常に少なくとも0です。どの定義を使用すると、-2と-1になりますか?
chux-モニカを2016年

サー、私はいけませんが、私はグーグル7モジュロ-3-> -2 .and.-7モジュロ-3-> -1で、なぜこれが起こったのか説明してください
shub sharma

1
GoogleはWikiユークリッド除算(Raymond T. Bouteによる記述)とは異なるモジュロ(符号付きモジュロ?)の定義を使用しています。 これは違いをより詳しく議論します。ストーリーのモラル:ポジティブなときに同じ意味a%ba modulo b持ちa,bます。C99は%、負の値で正確に定義します。Cは、この「。残り」 『モジュロ』が負の値についての世界では様々な定義を持っているCのみを使用していますスペック。 『と呼んで正の数の文脈で』モジュロを。
chux -復活モニカ
弊社のサイトを使用することにより、あなたは弊社のクッキーポリシーおよびプライバシーポリシーを読み、理解したものとみなされます。
Licensed under cc by-sa 3.0 with attribution required.