Неужели я ошибаюсь в модуле? Потому что в Java -13 % 64
предполагается оценить значение -13
, но я получаю 51
.
Как java вычисляет модуль с отрицательными числами?
Ответ 1
Оба определения модуля отрицательных чисел используются - некоторые языки используют одно определение, а другое -.
Если вы хотите получить отрицательное число для отрицательных входов, вы можете использовать это:
int r = x % n;
if (r > 0 && x < 0)
{
r -= n;
}
Аналогично, если вы использовали язык, который возвращает отрицательный номер на отрицательном входе, и вы предпочтете положительный результат:
int r = x % n;
if (r < 0)
{
r += n;
}
Ответ 2
Так как "математически" оба правильны:
-13 % 64 = -13 (on modulus 64)
-13 % 64 = 51 (on modulus 64)
Один из вариантов должен был быть выбран разработчиками языка Java, и они выбрали:
знак результата равен знаку дивиденда.
Говорит в спецификациях Java:
https://docs.oracle.com/javase/specs/jls/se7/html/jls-15.html#jls-15.17.3
Ответ 3
Вы уверены, что работаете на Java? потому что Java дает -13% 64 = -13, как и ожидалось. Знак дивиденда!
Ответ 4
Ваш результат неверен для Java. Укажите какой-то контекст, как вы пришли к нему (ваша программа, реализация и версия Java).
15.17.3 Оператор останова%
[...]
Операция остатка для операндов, которые являются целыми числами после двоичного числового продвижения (§5.6.2), дает такое значение результата, что (a/b) * b + (a% b) равно a.
15.17.2 Оператор отдела /
[...]
Целые деления округляются до 0.
Так как/округляется к нулю (приводя к нулю), результат% должен быть отрицательным в этом случае.
Ответ 5
вы можете использовать
(x % n) - (x < 0 ? n : 0);
Ответ 6
Ваш ответ находится в Википедии: modulo operation
В нем говорится, что в Java знак по модулю работает так же, как и для дивиденда. и поскольку мы говорим о том, что остальная операция деления просто прекрасна, она возвращает -13 в вашем случае, начиная с -13/64 = 0. -13-0 = -13.
EDIT: Извините, неправильно понял ваш вопрос... Вы правы, java должен дать -13. Можете ли вы предоставить более окружающий код?
Ответ 7
Модульная арифметика с отрицательными операндами определяется разработчиком языка, который может оставить его в реализации языка, который может отложить определение до архитектуры ЦП.
Я не смог найти определение языка Java.
Спасибо Ishtar, спецификация языка Java для Оператор останова% говорит, что знак результата совпадает с знаком числителя.
Ответ 8
x = x + m = x - m
по модулю m
.
поэтому -13 = -13 + 64
по модулю 64
и -13 = 51
по модулю 64
.
предположим Z = X * d + r
, если 0 < r < X
, то в делении Z/X
назовем r
остаток. Z % X
возвращает остаток Z/X
.
Ответ 9
Чтобы преодолеть это, вы можете добавить 64
(или независимо от того, какая ваша база модулей) на отрицательное значение, пока оно не станет положительным
int k = -13;
int modbase = 64;
while (k < 0) {
k += modbase;
}
int result = k % modbase;
Результат все равно будет в том же классе эквивалентности.
Ответ 10
Функция mod определяется как количество, на которое число превышает наибольшее целое число, кратное делителю, которое не больше этого числа. Итак, в вашем случае
-13 % 64
наибольшее целое число, кратное 64, которое не превышает -13, равно -64. Теперь, когда вы вычитаете -13 из -64, оно равно 51 -13 - (-64) = -13 + 64 = 51
Ответ 11
В моей версии Java JDK 1.8.0_05 -13% 64 = -13
вы можете попробовать -13- (int (-13/64)) другими словами, деление отбрасывает целое число, чтобы избавиться от части дроби затем вычесть из числителя Поэтому числитель (int (числитель/знаменатель)) должен давать правильный остаток и знак
Ответ 12
В последних версиях Java вы получаете -13%64 = -13
. Ответ всегда будет иметь знак числителя.
Ответ 13
В соответствии с разделом 15.17.3 JLS "Операция остатка для операндов, которые являются целыми числами после двоичного числового продвижения, дает значение результата, так что (a/b) * b + (a% b) равно a. Это тождество имеет место даже в частном случае, когда дивиденд является отрицательным целым наибольшей возможной величиной для его типа, а делитель равен -1 (остаток равен 0).
Надеюсь, что это поможет.
Ответ 14
Я не думаю, что Java вернет 51 в этом случае. Я запускаю Java 8 на Mac, и я получаю:
-13 % 64 = -13
Программа:
public class Test {
public static void main(String[] args) {
int i = -13;
int j = 64;
System.out.println(i % j);
}
}