Как java вычисляет модуль с отрицательными числами?

Неужели я ошибаюсь в модуле? Потому что в 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;
}

Ответ 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).

Из Спецификация языка 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);
    }
}