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