Сегодня на работе у меня была интересная дискуссия с одним из моих коллег. Он был удивлен, когда он имел следующие с ним случиться:Почему оператор% называется оператором «модуль» вместо оператора «остатка»?
assert(-1 % 10 == -1) //Expecting 9
Так что, когда он пришел, чтобы спросить меня об этом, я сказал ему: «хорошо, что имеет смысл, если вы разделите -1 на 10, вы получите 0. с остатком -1. Однако его аргумент заключался в том, что оператор модуля должен придерживаться «всегда положительной» модели. Я провел небольшое исследование и обнаружил, что модуль, который он имел в виду, выглядит следующим образом:
Пусть q - целое число a и n. Пусть r - остаток. Затем:
a = n * q + r
Определение я использовал, однако, по-видимому, версия Кнут модуля, который является:
Пусть q- пол разделенный на п. Пусть г - остаток. Тогда:
г = а - п * д
Итак, мой вопрос, почему он оказался в стандарте FORTRAN (и впоследствии C-стандарт), чтобы оператор модуля усечение в сторону 0? Мне кажется неправильным, чтобы назвать его «модулем», а не «остатком» (в математике ответ действительно должен быть 9). Связано ли это с тем, как аппаратное обеспечение выполняет разделение?
Для справки:
- Wikipedia on Modulus
- MSDN entry on the "modulus" operator
(. Да, я понимаю его для VS2003 ... Я застрял с ним в настоящее время Sadface) - Modulus operator changes
- Don't assume positive remainder...
TLDR; Является ли аппаратное обеспечение причиной того, что оператор модуля усекает в направлении 0?
Вы понимаете, что этот вопрос и ссылки полны причин, чтобы избежать по модулю с отрицательными операндами? –
Избегайте, это не вопрос. –
Действительно ли это называется «модуль» или «мода»? Сколько слогов имеет «мода»? Как насчет «остатка»? – supercat