「mod」と「remainder」には違いがあると私の友人は言った。
もしそうなら、CとC ++の違いは何ですか?「%」はCで「mod」または「rem」を意味しますか?
「mod」と「remainder」には違いがあると私の友人は言った。
もしそうなら、CとC ++の違いは何ですか?「%」はCで「mod」または「rem」を意味しますか?
回答:
係数と残差には違いがあります。例えば:
-21
modが4
ある3
ため-21 + 4 x 6
です3
。
しかし、-21
で割っ4
与え-5
の残りの部分-1
。
正の値の場合、違いはありません。
%
でした:常に剰余でしたが、C89では整数除算が0ではなく負の無限大に丸めることが許可されていたため、係数(つまり、常に正)である可能性もあります。したがって、C89では-5 / 2
可能性が-2
残り-1
、または-3
残りの部分と1
、ちょうどその文書に持っていた実装。C99は柔軟性を取り除いたので、今-5 / 2
は常に-2
です。
-21
modが4
ありますか3
?なぜ計算なの-21 + 4 x 6
か?
-21 + 4 x 6
。
「%」はCで「mod」または「rem」を意味しますか?
Cでは%
、残り1です。
...、
/
演算子の結果は、小数部分が破棄された代数商です...(これは、しばしば「ゼロへの切り捨て」と呼ばれます。)C11dr§6.5.56演算子のオペランド
%
は整数型でなければなりません。C11dr§6.5.52
/
演算子の結果は、最初のオペランドを2番目のオペランドで除算した商です。%
演算子の結果は余りです... C11dr§6.5.55
「mod」と「remainder」の違いは何ですか?
Cは、ユークリッド除算やその他のモジュロで使用される整数モジュラス関数などの「mod」を定義していません。「ユークリッドmod」はa%b
、a
が負の場合の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()
は、この代替の古い学校の残りでも動作します。
モジュラス演算とは、モジュラー演算では、算術除算後に残った値または残りの値です。これは一般に剰余として知られています。%は正式にはC / C ++の剰余演算子です。例:
7 % 3 = 1 // dividend % divisor = remainder
議論の余地は、この%演算への負の入力をどのように扱うかです。最新のCおよびC ++は、この演算に対して符号付き剰余値を生成します。この場合、結果の符号は、除数入力の符号に関係なく常に被除数入力と一致します。
CとC ++および多くの言語で%
は、剰余演算子ではなく、剰余演算子です。
たとえば、演算で-21 / 4
は整数部は-5
で、小数部は-.25
です。剰余は小数部に除数を掛けたものなので、残りは-1
です。JavaScriptは剰余演算子を使用してこれを確認します
console.log(-21 % 4 == -1);
モジュラス演算子は、「クロック」のようなものです。12時、3時、6時、9時の位置にそれぞれ0、1、2、3の値を持つ円を想像してください。時計回りに商時間を進めると、モジュラス演算の結果が表示されます。この例では、負の商を使用すると反時計回りに3になります。
注:係数は常に除数と同じ符号で、残りは商と同じ符号です。剰余の少なくとも1つが負であるときに除数と剰余を加算すると、係数が生成されます。
数学では、剰余演算の結果はユークリッド除算の残りの部分です。ただし、他の規則も可能です。コンピュータと計算機には、数値を保存および表現するさまざまな方法があります。したがって、それらのモジュロ演算の定義は、プログラミング言語や基盤となるハードウェアに依存します。
7 modulo 3 --> 1
7 modulo -3 --> -2
-7 modulo 3 --> 2
-7 modulo -3 --> -1
0 ≤ r < |b|
別名余りを意味し、「モジュロ演算」を は常に少なくとも0です。どの定義を使用すると、-2と-1になりますか?
a%b
をa modulo b
持ちa,b
ます。C99は%
、負の値で正確に定義します。Cは、この「。残り」 『モジュロ』が負の値についての世界では様々な定義を持っているCのみを使用していますスペック。 『と呼んで正の数の文脈で』モジュロを。