Почему оператор% называется оператором «модуля» вместо оператора «остатка»?
Сегодня на работе у меня была интересная беседа с одним из моих коллег. Он был удивлен, когда с ним случилось следующее:
assert(-1 % 10 == -1) //Expecting 9
Поэтому, когда он пришел спросить меня об этом, я сказал ему: «Ну, это имеет смысл. Когда вы делите -1 на 10, вы получаете 0 с оставшимся -1. Однако его аргумент состоял в том, что оператор модуля должен быть истинным для «всегда позитивная» модель. Я провел небольшое исследование и обнаружил, что модуль, на который он ссылался, выглядит следующим образом:
Пусть q целочисленное отношение a и n. Пусть г будет остаток. Затем:
a = n * q + r
ОпределениеI Однако использовалась версия модуля Кнута, которая:
Пусть q будет полом деленного на n. Пусть г будет остаток. Затем:
r = a - n * q
Итак, мой вопрос заключается в том, почему в стандарте FORTRAN (а впоследствии и в стандарте C) оказалось, что оператор модуля усекается до 0? Мне кажется неправильным называть это «модулем», а не «остатком» (в математике ответ действительно должен быть 9). Это связано с тем, как аппаратное обеспечение делает разделение?
Для справки:
Википедия о модулеЗапись MSDN об операторе "модуль"(Да, я понимаю, что это для VS2003 ... Я застрял с ним в настоящее время. Sadface)Изменения оператора модуляНе принимайте положительный остаток ...
TLDR; Является ли аппаратное обеспечение причиной, по которой оператор модуля усекается до 0?