モジュラスが間違っていますか? Java _-13 % 64
は-13
と評価されるはずですが、51
を取得するためです。
負の数のモジュラスの両方の定義が使用されています-一部の言語は1つの定義を使用し、他の一部は使用します。
負の入力に対して負の数を取得したい場合、これを使用できます:
int r = x % n;
if (r > 0 && x < 0)
{
r -= n;
}
同様に、負の入力で負の数を返す言語を使用していて、正の値を好む場合:
int r = x % n;
if (r < 0)
{
r += n;
}
「数学的に」両方とも正しいので:
-13 % 64 = -13 (on modulus 64)
-13 % 64 = 51 (on modulus 64)
オプションの1つはJava言語開発者が選択する必要があり、彼らは以下を選択しました。
結果の符号は配当の符号と等しくなります。
Java仕様でそれを言う:
https://docs.Oracle.com/javase/specs/jls/se7/html/jls-15.html#jls-15.17.
本当にJavaで作業していますか? 'Javaは、期待どおり-13%64 = -13を与えるためです。配当のサイン!
Javaの結果は間違っています。それに到達した経緯(プログラム、実装、Javaのバージョン)を提供してください。
Java言語仕様 から
15.17.3剰余演算子%
[...]
。
15.17.2除算演算子/
[...]
整数除算は0に向かって丸めます。
/はゼロに丸められる(ゼロになる)ため、この場合、%の結果は負になるはずです。
使用できます
(x % n) - (x < 0 ? n : 0);
あなたの答えはウィキペディアにあります: modulo operation
Javaでは、モジュロ演算の符号は被除数の符号と同じであると言います。除算の残りの部分については話をしているので、-13/64 = 0なので、-13を返します。-13-0= -13です。
編集:申し訳ありませんが、あなたの質問を誤解している...あなたは正しい、Javaは-13を与えるべきです。周囲のコードをもっと提供できますか?
負のオペランドを使用したモジュロ演算は、言語設計者によって定義されます。言語設計者は、それを言語実装に任せ、CPUアーキテクチャに定義を委ねることができます。
Java言語定義を見つけることができませんでした。
ありがとう、Ishtar、Java 剰余演算子の言語仕様% は、結果の符号が分子のサイン。
x = x + m = x - m
モジュラスm
。
so -13 = -13 + 64
モジュラス64
および-13 = 51
モジュラス64
。
_Z = X * d + r
と仮定し、0 < r < X
の場合、部門Z/X
で残りをr
と呼びます。Z % X
は、Z/X
の残りを返します。
これを克服するには、正の値になるまで、負の値に64
(またはモジュラスベース)を追加します。
int k = -13;
int modbase = 64;
while (k < 0) {
k += modbase;
}
int result = k % modbase;
結果は同じ等価クラスに残ります。
Mod関数は、数値がその数値以下の除数の最大整数倍を超える量として定義されます。だからあなたの場合
-13 % 64
-13を超えない64の最大整数倍数は-64です。さて、-64から-13を引くと51 -13 - (-64) = -13 + 64 = 51
になります
JLSのセクション15.17.3によると、「2進数の昇格後の整数であるオペランドの剰余演算は、(a/b)* b +(a%b)がaと等しくなるような結果値を生成します。特別なケースでは、被除数はその型の可能な最大の負の整数であり、除数は-1(余りは0)です。」
お役に立てば幸いです。
Java最新バージョンでは、-13%64 = -13
を取得します。答えには常に分子の符号が付きます。
私のバージョンのJava JDK 1.8.0_05 -13%64 = -13
-13-(int(-13/64))を試すことができます。つまり、整数に除算して小数部を取り除き、分子から減算することができます。したがって、numerator-(int(numerator/denominator))は正しい残りとサイン