C ++ имеет оператор %
, который иногда и вводит в заблуждение как «модуль». В частности, STL имеет функтор modulus<>
в заголовке <functional>
. Заметьте, это не оператор математического модуля, потому что в модуле арифметики a mod b
по определению оценивается как неотрицательное значение для любого значения a
и любого положительного значения b
. В C ++ знак результата a % b
является определяемым реализацией , если один из аргументов является отрицательным. Таким образом, мы бы более правильно назвали оператор %
оператором Остаток .
Тем не менее, если вы действительно хотите оператор математического модуля, то вы можете определить функцию, которая будет делать именно это:
template<typename V>
V mod(const V& a, const V& b)
{
return (a % b + b) % b;
}
До тех пор, пока b
является положительным значением, вызов вышеуказанной функции даст неотрицательный результат.