Операция модуля со значениями отрицательных сторон - странная вещь?

int** ary = new int[sizeY][sizeX]

должен быть:

int **ary = new int*[sizeY];
for(int i = 0; i < sizeY; ++i) {
    ary[i] = new int[sizeX];
}

, а затем очистить будет:

for(int i = 0; i < sizeY; ++i) {
    delete [] ary[i];
}
delete [] ary;

EDIT: как отметил Дитрих Эпп в комментариях, это не совсем легкое решение. Альтернативным подходом было бы использование одного большого блока памяти:

int *ary = new int[sizeX*sizeY];

// ary[i][j] is then rewritten as
ary[i*sizeY+j]
17
задан Nayuki 16 September 2015 в 14:12
поделиться

11 ответов

Между прочим: большинство языков программирования не согласилось бы с Python и дало бы результат -2. В зависимости от интерпретации модуля это корректно. Однако самое согласованное математическое определение указывает, что модуль и b является (строго положительным) отдыхом r подразделения / b. Более точно, 0 < = r < b по определению.

16
ответ дан 30 November 2019 в 10:29
поделиться

Результат операции модуля на отрицательных сторонах, кажется, зависимый языка программирования и здесь является списком http://en.wikipedia.org/wiki/Modulo_operation

13
ответ дан 30 November 2019 в 10:29
поделиться

Ваш интерпретатор Python корректен. Один (глупый) способ вычислить модуль состоит в том, чтобы вычесть или добавить модуль, пока получающееся значение не между 0 и (в€ модуля’ 1).

, например: 13 модификаций 5 = (13 в€’ 5) модификация 5 = (13 в€’ 10) модификация 5 = 3

или в Вашем случае: в€ ’2 модификации 5 = (в€ ’2 + 5) модификация 5 = 3

12
ответ дан 30 November 2019 в 10:29
поделиться

Ну,-2 разделенных 5 были бы 0 с остатком от 3. Я не полагаю, что это должно быть очень зависимым платформы, но я видел более странные вещи.

0
ответ дан 30 November 2019 в 10:29
поделиться

Это действительно 3. В арифметика в остаточных классах , модуль является просто остатком от подразделения, и остаток от-2 разделенных 5 равняется 3.

0
ответ дан 30 November 2019 в 10:29
поделиться

Как объяснено в других ответах, существует много вариантов для операции по модулю с отрицательными величинами. На общих различных языках (и различной архитектуре машины) даст другой результат.

Согласно справочник ,

Python оператор по модулю всегда приводит к результату с тем же знаком как его второй операнд (или нуль); абсолютное значение результата строго меньше, чем абсолютное значение второго операнда.

выбор, взятый Python. В основном по модулю определяется так, чтобы это всегда содержало:

x == (x/y)*y + (x%y)

, таким образом, это имеет смысл что (-2) %5 =-2 - (-2/5) *5 = 3

3
ответ дан 30 November 2019 в 10:29
поделиться

Ну, 0% 5 должны быть 0, правильно?

-1% 5 должны быть 4, потому что это - следующая позволенная цифра, входящая в обратное направление (т.е. это не может быть 5, так как это вне диапазона).

И после вперед той логикой,-2 должен быть 3.

самый легкий способ думать, как это будет работать, состоит в том, что Вы продолжаете добавлять или вычитать 5, пока число не падает между 0 (содержащий) и 5 (эксклюзивный).

я не уверен в зависимости машины - я никогда не видел реализацию, которая была, но я не могу сказать, что она никогда не делается.

4
ответ дан 30 November 2019 в 10:29
поделиться

Результат зависит от языка. Python возвращает знак делителя, куда, например, c# возвращает знак дивиденда (т.е.-2% 5 возвратов-2 в c#).

0
ответ дан 30 November 2019 в 10:29
поделиться

Одно объяснение могло бы состоять в том, что отрицательные числа хранятся с помощью 2's дополнение . Когда интерпретатор Python пытается сделать операцию по модулю, это преобразовывает в неподписанное значение. Как таковой вместо того, чтобы делать (-2) % 5 это на самом деле вычисляет 0xFFFF_FFFF_FFFF_FFFD % 5, который равняется 3.

0
ответ дан 30 November 2019 в 10:29
поделиться

Бойтесь полагаться на это ультрасовременное поведение в C/C++ на всех Ose и архитектуре. Если я вспоминаю правильно, я пытался полагаться на код C/C++ как

float x2 = x % n;

для хранения x2 в диапазоне от 0 до n-1, но отрицательные числа закрались, когда я скомпилирую на одной ОС, но вещи хорошо работали бы на другой ОС. Это сделало в течение злого времени, отладив, так как это только произошло половина времени!

0
ответ дан 30 November 2019 в 10:29
поделиться

Как сказано в документации в разделе Двоичные арифметические операции, Python гарантирует, что:

Операторы целочисленного деления и модуляции связаны следующим тождеством: x == (x/y)*y + (x%y). Целочисленное деление и модуло также связаны встроенной функцией divmod(): divmod(x, y) == (x/y, x%y).

И действительно,

>>> divmod(-2, 5)
(-1, 3).

Еще один способ визуализировать единообразие этого метода - вычислить divmod для небольшой последовательности чисел:

>>> for number in xrange(-10, 10):
...     print divmod(number, 5)
...
(-2, 0)
(-2, 1)
(-2, 2)
(-2, 3)
(-2, 4)
(-1, 0)
(-1, 1)
(-1, 2)
(-1, 3)
(-1, 4)
(0, 0)
(0, 1)
(0, 2)
(0, 3)
(0, 4)
(1, 0)
(1, 1)
(1, 2)
(1, 3)
(1, 4)
6
ответ дан 30 November 2019 в 10:29
поделиться
Другие вопросы по тегам:

Похожие вопросы: