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

StackOverflow https://stackoverflow.com/questions/450410

  •  19-08-2019
  •  | 
  •  

Вопрос

Perl - язык программирования

print 2 % -18;

-->

-16

Tcl

puts [expr {2 % -18}]

-->

-16

но VBScript

wscript.echo 2 mod -18

-->

2

В чем разница?

Это было полезно?

Решение

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

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

a = qn + r

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

0 <= |r| < |н|.

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

Это потому, что 2 = (-1) * -18 + (-16) и 2 = 0 * -18 + 2.

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

Другие советы

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

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

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

На многих языках просто выберите один.

Я не могу удержаться, чтобы не указать на это Обычный шепелявый предлагает и то, и другое.

python, конечно, явно информирует вас

>>> divmod(2,-18)
(-1, -16)
Лицензировано под: CC-BY-SA с атрибуция
Не связан с StackOverflow
scroll top