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