Почему модуль отличается на различных языках программирования?

Попробуйте приведенный ниже код:

NSString *versionString = [[UIDevice currentDevice] systemVersion];
22
задан bugmagnet 16 January 2009 в 13:31
поделиться

4 ответа

ответ Википедии довольно полезен здесь.

краткое изложение А - то, что любое целое число может быть определено как

= qn + r

, где все эти буквы являются целыми числами, и

0 < = |r | < |n |.

Почти каждый язык программирования потребует что (a/n) * n + (a%n) = a. Таким образом, определение модуля будет почти всегда зависеть от определения целочисленного деления. Существует два варианта для целочисленного деления на отрицательные числа 2/-18 = 0 или 2/-18 =-1. В зависимости от которого верен для Вашего языка, будет обычно изменять оператор %.

Это вызвано тем, что 2 = (-1) *-18 + (-16) и 2 = 0 *-18 + 2.

Для Perl ситуация является сложной. в странице руководства говорится: "Обратите внимание, что, когда целое число использования находится в объеме, "%" предоставляет Вам прямой доступ к оператору модуля, как реализовано Вашим компилятором C. Этот оператор также не определяется для отрицательных операндов, но он выполнится быстрее". Таким образом, это может выбрать любую опцию для Perl (как C), если целое число использования находится в объеме. Если целое число использования не находится в объеме, в руководстве говорится, "Если $b отрицателен, то $b % $a является $a минус самое маленькое несколько $b, который не является меньше, чем $a (т.е. результат будет меньше чем или равен нулю)".

30
ответ дан Nick Fortescue 29 November 2019 в 04:29
поделиться

Википедия "Операция по модулю" страница объясняет его вполне хорошо. Я не попытаюсь сделать немного лучше здесь, поскольку я, вероятно, сделаю тонкую, но важную ошибку.

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

9
ответ дан Jon Skeet 29 November 2019 в 04:29
поделиться

После деления числа и делителя, один из которых отрицателен, у Вас есть по крайней мере два способа разделить их на частное и остаток, такой что частное * делитель + остаток = число: Вы можете или вокруг частного к отрицательной бесконечности, или по направлению к нулю.

Много языков просто выбирают тот.

я не могу сопротивляться указанию что язык Common LISP предложения оба.

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

Python, конечно, явно сообщает Вам

>>> divmod(2,-18)
(-1, -16)
2
ответ дан popcnt 29 November 2019 в 04:29
поделиться
Другие вопросы по тегам:

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