Существует ли какая-либо историческая или иная причина, почему оператор модуля является частью небольшого набора стандартных операторов в том, что выглядит как многие языки? ( +, -, *, /
а %
для Java и C - **
в Ruby и Python).
Кажется странным включать мод как «фундаментальный» (чтобы не выбивать его, я его часто использую, но я также использую возведение в степень, абсолютное значение, пол / потолок или другие - они кажутся такими же полезными и необходимыми). Было ли это старое решение, принятое в какой-то спецификации, которой следуют все Java, C, Ruby и Python, или язык, от которого они произошли? Насколько я могу сказать, большинство диалектов Lisp включают только +, -, /
и *
.
Сначала я задавался вопросом, было ли мод особенно легко реализовать на бинарном уровне (будет ли это вообще иметь значение, принимая решение о том, что должно быть «фундаментальным» оператором, а что нет?), Но, похоже, это не так. Это просто гораздо чаще используется в программировании, чем я думаю?
источник
Многие языки программирования имеют оператор «остаток», который может использоваться как оператор модуля, когда оба операнда положительны; Указанный оператор часто называют оператором «модуль», потому что это его основное использование. В языках, как правило, есть такой оператор, потому что во многих аппаратных платформах аппаратное обеспечение автоматически предоставляет остаток при выполнении деления, и вычисление остатка или модуля с помощью любых других средств будет намного сложнее.
Я не знаю историю аппаратной поддержки для подписанного подразделения; многие процессоры на протяжении многих лет предоставляют аппаратное обеспечение, которое может автоматически выполнять подписанное деление в соответствии с правилом, согласно которому, если a / b даст (q, r), то -a / b или / -b приведут к (-q, -r), но Я не уверен в случаях использования, где деление с использованием этого правила особенно полезно. Почти в каждом случае, когда я использовал целочисленные операции деления или «модуля» для отрицательных значений, я хотел, чтобы округление в сторону отрицательной бесконечности деления и операция истинного модуля (чтобы (a + b) / b всегда равно (a / b) +1 и (a + b)% b всегда будет равно a% b.). Поскольку операторы не работают таким образом, необходимо проверить знак дивиденда и использовать другой код, когда он ' отрицательный - по сути, сводит на нет любую выгоду от наличия в первую очередь подписанной инструкции деления. Мне интересно, для каких целей поддержка аппаратного обеспечения с подписанным разделением действительно полезна.
Возвращаясь к исходному вопросу, оператор модуля часто полезен в ситуациях, когда определенные вещи должны происходить на периодической основе, либо в пространстве (например, в графических координатах), либо во времени. Например, если кто-то хочет, чтобы событие происходило каждые 15 секунд, время до следующего события будет 15 - ((time_now - time_of_an_occurrence)% 15), если предположить
time_of_an_occurrence
time_now
, что оно не больше, чем . Если значениеtime_of_an_occurrence
больше чемtime_now
, оператор модуля мог бы продолжать использовать ту же формулу, если вычитание не переполняется, но для оператора остатка потребуется другая формула.источник
rem
для остатка иmod
для модуля со свойствами, которые вы описываете.m = number % base; if (m < 0) m+=base;
. Я не знаю, видел ли я когда-нибудь код, который получал выгоду от отрицательного оператора оператора, за исключением, возможноq = n/d; if (n%d < 0) q+=1;
, того, что в любом случае могло бы быть написано лучше другими способами.Модуль тесно связан с теорией групп и колец, которые являются очень фундаментальными математическими теориями.
Возведение в степень - это только третья операция в сложении, умножении, возведении в степень, тетратации (и это бесконечная последовательность). Это становится важным в основном с комплексными числами, которые являются более редкими в компьютерной арифметике. Одно конкретное возведение в степень поддерживается явно, хотя: 2 n обычно записывается как
1<<n
, так как компьютеры довольно двоичные.Пол и потолок действительно редки по сравнению: они применяются только при конвертации из ℝ в ℤ. (с плавающей точкой в целое число). Точно так же
abs
связано с отображением из ℤ в ℕисточник
Извините, но рискуя превратить это в игру "Call My Bluff", я думаю, что реальный ответ на этот вопрос довольно прост:
Мод позволяет выполнять точные вычисления в «недесятичных» количествах и единицах, таких как даты, время, ярды, дюймы, унции и т. Д. В десятичных вычислениях он также предоставляет программисту метод для работы с числовой точностью, превышающей ту, которую обеспечивает аппаратное обеспечение. машины. Это имеет огромное количество применений от очень маленьких (например, квантовые вычисления) до очень больших (например, обнаружение новых простых чисел).
Важно понимать, что мы назвали эти вещи компьютерами не без причины. Иногда нам нужно, чтобы они дали нам правильный ответ!
источник