Чому mod (%) є основним математичним оператором у багатьох мовах програмування?


17

Чи є причина, історична чи інша, чому оператор модуля є частиною невеликого набору стандартних операторів, що здається багатьма мовами? ( +, -, *, /і %для Java та C, з **Ruby та Python).

Мабуть дивно включати мод як "фундаментальний" (не стукати його, я його вдосталь використовую, але я також використовую експоненцію, абсолютне значення, підлогу / стелю чи інші - вони здаються настільки ж корисними та необхідними). Це старе рішення, яке було прийнято в якійсь специфікації, якої Java, C, Ruby і Python дотримуються, або мова, з якої вони походять? Наскільки я можу сказати, більшість діалектів Lisp включають лише +, -, /та *.

Спочатку я замислювався над тим, чи мод є особливо простим у впровадженні на бінарному рівні (чи це навіть змінить питання щодо рішень щодо того, що має бути "основним" оператором, а чого не слід?), Але, здається, це не так. Це просто набагато частіше використовується в програмуванні, ніж я думаю?

Відповіді:


20

Я впевнений, що це звичайно, оскільки багато архітектури процесора реалізують modulusяк другий вихід інструкції про ціле поділ.

Я не пам'ятаю, щоб він був присутній у процесорах 1970-х років (6800, 8080, Z80, 1604 тощо), але до 1980-х його мали Intel 8086 та 8088, а також Motorola 6809.

Вказана архітектура інструкцій PDP-11 DIVстворює коефіцієнт та решту з початку (1970 р.), Хоча інструкції MUL та DIV не були представлені на ранніх розробках, але могли бути прозоро емульовані "інструкцією не реалізованої пастки" та реалізованою за допомогою обробник, який зробив трохи подвійний. Ймовірно, функція PDP-11 заохочує найперше видання мови С, що надає цю %функцію. (Ви коли-небудь помічаєте, як знак відсотка має похилу риску? Це робить його розумним вибором для оператора, що стосується поділу.)

Наявність модуля в Cодному може, ймовірно, пояснити його наявність у всіх сучасних мовах. Cмає дуже велику родину нащадків і в іншому випадку була досить впливовою.


3
+1 Вплив С на майже кожну мову, що не є LISP, з початку 1970-х років неможливо переоцінити.
Росс Паттерсон

8

Багато мов програмування мають оператор "залишок", який може використовуватися як оператор модуля, коли обидва операнди є позитивними; зазначений оператор часто називають оператором "модуль", оскільки це його первинне використання. Мови, як правило, мають такого оператора, оскільки багато апаратних платформ підрозділів апаратного забезпечення автоматично постачають залишок під час виконання поділу, а обчислення залишку або модуля будь-якими іншими засобами було б набагато складніше.

Я не знаю історії апаратної підтримки підписаного підрозділу; багато процесорів роками пропонують обладнання, яке може автоматично виконувати підписаний поділ за умови, що якщо a / b дасть (q, r), то -a / b або / -b дасть (-q, -r), але Я не впевнений у випадках використання, коли поділ із використанням цього правила особливо корисний. Майже в кожному випадку, коли я використовував операції з цілим поділом або "модулем" на від'ємних значеннях, я хотів обернути в бік нескінченність безперервності на поділ і дійсну модульну операцію (таку, що (a + b) / b завжди рівний (a / b) +1 і (a + b)% b завжди буде рівний% b.). Оскільки оператори не працюють таким чином, необхідно перевірити ознаку дивіденду та використовувати інший код, коли він ' s негатив - по суті, заперечуючи будь-яку вигоду від того, щоб в першу чергу мати підписану інструкцію про поділ. Мені цікаво, для яких цілей корисна підтримка підписаного підрозділу в апараті.

Повертаючись до початкового питання, оператор модуля часто корисний у ситуаціях, коли певні речі повинні відбуватися періодично, або в просторі (наприклад, графічні координати), або в часі. Наприклад, якщо ви хочете, щоб подія відбувалась кожні 15 секунд, час до наступної події становитиме 15 - ((time_now - time_of_an_occurrence)% 15), припустимоtime_of_an_occurrencetime_now , що це не більше ніж . Якщо time_of_an_occurrenceбільше, ніж time_nowоператор модуля може продовжувати використовувати ту саму формулу, якщо віднімання не переповнюється, але оператор, що залишився, потребує іншої формули.


3
З цієї причини Haskell має два оператори: remна залишок та modна модуль із описаними вами властивостями.
Інго

@Complicateseebio: Що особливо смішно, це те, що його часто називають оператором модуля, тому що він, як правило, використовується для обчислення модуля, навіть коли для цього потрібен код типу m = number % base; if (m < 0) m+=base;. Я не знаю, що я ніколи не бачив, щоб якийсь код, який виграв від оператора, що залишився, став негативним, за винятком, можливо q = n/d; if (n%d < 0) q+=1;, який у будь-якому випадку можна було б записати краще іншими способами.
supercat

3

Модуль тісно пов'язаний з груповою та кільцевою теорією, які є дуже фундаментальними математичними теоріями.

Експоненціація - це лише третя операція з додавання послідовностей, множення, експоненції, тетрації (і це нескінченна послідовність). Це стає важливим головним чином при складних числах, які рідше зустрічаються в комп'ютерній арифметиці. Однак одне конкретне експоненцію підтримується явно: 2 n зазвичай пишеться як 1<<n, оскільки комп'ютери є досить бінарними.

Підлога і стеля є насправді рідкісними в порівнянні: вони застосовуються лише при перетворенні з ℝ в ℤ. (плаваюча точка до цілого числа). Аналогічно absпов'язане зі відображенням від ℤ до ℕ


ℤ - цілі числа (і ℕ підмножина цілих чисел), ви повинні мати на увазі від ℝ до ℤ.
Джоні

@Joni: два змішані приклади, виправлені.
MSalters

0

Вибачте, але, ризикуючи перетворити це на гру «Call My Bluff», я думаю, що реальна відповідь на це питання досить проста:

Мод дозволяє проводити точні обчислення в "недесяткових" кількостях та одиницях, таких як дати, час, ярди, дюйми, унції і т. Д. У десяткових обчисленнях він також забезпечує метод роботи програміста з числовою точністю, що перевищує передбачене обладнанням машини. Це величезна кількість застосувань від дуже малих (наприклад, квантових обчислень) до дуже великих (наприклад, виявлення нових простих чисел).

Важливо розуміти, що ми називали ці речі комп'ютерами не просто так. Іноді нам потрібні вони, щоб дати нам правильну відповідь!


Ця відповідь не має сенсу ... Який зв’язок між використанням "mod" та використанням різних одиниць ???
Використовуючи наш веб-сайт, ви визнаєте, що прочитали та зрозуміли наші Політику щодо файлів cookie та Політику конфіденційності.
Licensed under cc by-sa 3.0 with attribution required.