В чем разница между "мод" и "остаток"?
Мой друг сказал, что есть различия между "модом" и "остатком".
Если да, то каковы эти различия в C и C++? "%" Означает "мод" или "rem" в C?
7 ответов
Существует разница между модулем и остатком. Например:
-21
модификация 4
является 3
так как -21 + 4 x 6
является 3
,
Но -21
деленное на 4
дает -5
с остатком -1
,
Для положительных значений разницы нет.
"%" Означает "мод" или "rem" в C?
В С, %
это остаток.
..., результат
/
оператор - это алгебраический фактор с любой отброшенной дробной частью... (Это часто называют "усечением до нуля".) C11dr §6.5.5 6Операнды
%
Оператор должен иметь целочисленный тип. C11dr §6.5.5 2Результат
/
оператор является частным от деления первого операнда на второй; результат%
оператор - остаток... C11dr §6.5.5 5
В чем разница между "мод" и "остаток"?
C не определяет "mod", такой как целочисленная функция модуля, используемая в евклидовом делении, или другое по модулю. "Евклидов мод" отличается от C a%b
операция, когда a
отрицательно.
// a % b
7 % 3 --> 1
7 % -3 --> 1
-7 % 3 --> -1
-7 % -3 --> -1
Модуло как евклидово деление
7 modulo 3 --> 1
7 modulo -3 --> 1
-7 modulo 3 --> 2
-7 modulo -3 --> 2
Код кандидата по модулю:
int modulo_Euclidian(int a, int b) {
int m = a % b;
if (m < 0) {
// m += (b < 0) ? -b : b; // avoid this form: it is UB when b == INT_MIN
m = (b < 0) ? m - b : m + b;
}
return m;
}
Примечание о плавающей запятой: double fmod(double x, double y)
хотя и называется "fmod", это не то же самое, что евклидово деление "mod", но похоже на целочисленный остаток C:
fmod
функции вычисляют остаток с плавающей точкойx/y
, C11dr §7.12.10.1 2
fmod( 7, 3) --> 1.0
fmod( 7, -3) --> 1.0
fmod(-7, 3) --> -1.0
fmod(-7, -3) --> -1.0
Примечание: C также имеет аналогичную именованную функцию double modf(double value, double *iptr)
который разбивает значение аргумента на целые и дробные части, каждая из которых имеет тот же тип и знак, что и аргумент.
знак остатка будет таким же, как у делимого, а знак модуля будет таким же, как у делителя.
Остаток - это просто оставшаяся часть после арифметического деления между двумя целыми числами, тогда как модуль - это сумма остатка и делителя, когда они имеют противоположные знаки, и оставшаяся часть после арифметического деления, когда и остаток, и делитель имеют одинаковый знак.
Пример остатка:
10% 3 = 1 [здесь делимое число равно 10, которое имеет положительный знак, поэтому результат также будет иметь положительный знак]
-10% 3 = -1 [здесь делится -10, который имеет отрицательный знак, поэтому результат также будет иметь отрицательный знак]
10% -3 = 1 [здесь делимое число равно 10, которое имеет положительный знак, поэтому результат также будет иметь положительный знак]
-10% -3 = -1 [здесь делится -10, который имеет отрицательный знак, поэтому результат также будет иметь отрицательный знак]
Пример модуля:
5% 3 = 2 [здесь делимое равно 5, которое имеет положительный знак, поэтому остаток также будет иметь положительный знак и делитель также будет иметь положительный знак. Поскольку и остаток, и делитель имеют один и тот же знак, результат будет таким же, как и остаток]
-5% 3 = 1 [здесь делимое -5 имеет отрицательный знак, поэтому остаток также будет иметь отрицательный знак, а делитель - положительный. Поскольку и остаток, и делитель имеют противоположные знаки, результатом будет сумма остатка и делителя -2 + 3 = 1]
5% -3 = -1 [здесь делимое равно 5, которое имеет положительный знак, поэтому остаток также будет иметь положительный знак, а делитель - отрицательный. Поскольку и остаток, и делитель имеют противоположные знаки, результатом будет сумма остатка и делителя 2 + -3 = -1]
-5% -3 = -2 [здесь делимое -5 имеет отрицательный знак, поэтому остаток также будет иметь отрицательный знак, а делитель также будет иметь отрицательный знак. Поскольку и остаток, и делитель имеют один и тот же знак, результат будет таким же, как и остаток]
Я надеюсь, что здесь будет четкое различие между остатком и модулем.
В C и C++ и многих языках %
остаток НЕ является оператором модуля.
Например в операции -21 / 4
целая часть -5
и десятичная часть -.25
. Остаток - это дробная часть, умноженная на делитель, поэтому наш остаток равен-1
. JavaScript использует оператор остатка и подтверждает это
console.log(-21 % 4 == -1);
Оператор модуля похож на "часы". Представьте себе круг со значениями 0, 1, 2 и 3 в положениях 12 часов, 3 часов, 6 часов и 9 часов соответственно. Перемещение частного времени по часовой стрелке приводит нас к результату нашей операции модуля или, в нашем примере с отрицательным частным, против часовой стрелки, что дает 3.
Примечание. Модуль всегда имеет тот же знак, что и делитель, а остаток - тот же знак, что и частное. Добавление делителя и остатка, когда хотя бы один остаток отрицательный, дает модуль.
Модуль в модульной арифметике, как вы говорите, это значение, оставшееся или оставшееся после арифметического деления. Это обычно известно как остаток. % формально является оператором остатка в C / C++. Пример:
7 % 3 = 1 // dividend % divisor = remainder
Осталось обсудить, как обрабатывать отрицательные входные данные для этой% операции. Современные C и C++ создают значение остатка со знаком для этой операции, где знак результата всегда совпадает с входом дивиденда, независимо от знака входа делителя.
% is a remainder(leftover after dividend / divisor) NOT modulus.
Вы можете написать свою собственную функцию модуля, используя остаток (%) по отношению
((n%m)+m)%m
where `n` is the given number and `m` is the modulus
Найдите ниже разницу между значениями остатка и модуля для диапазона n = (-7,7) и m = 3.
n -7 -6 -5 -4 -3 -2 -1 0 1 2 3 4 5 6 7
-------------------------------------------------------------------------
%(-m) -1 0 -2 -1 0 -2 -1 0 1 2 0 1 2 0 1 => remainder
% m -1 0 -2 -1 0 -2 -1 0 1 2 0 1 2 0 1 => remainder
mod m 2 0 1 2 0 1 2 0 1 2 0 1 2 0 1 => ((n%m)+m)%m
mod(-m) -1 0 -2 -1 0 -2 -1 0 -2 -1 0 -2 -1 0 -2 => ((n%m)+m)%m
Полезные советы:
n%(-m) = +(remainder)
(-n)%(m) = -(remainder)
sign of 'm' doesn't matter
n mod (-m) = -(result)
(-n) mod m = +(result)
sign of 'n' doesn't matter
For +ve 'n' and '%(-m)' or '%m' or 'mod m' gives the same remainder
В математике результатом операции по модулю является остаток от евклидова деления. Однако возможны и другие соглашения. Компьютеры и калькуляторы имеют различные способы хранения и представления чисел; таким образом, их определение операции по модулю зависит от языка программирования и / или базового оборудования.
7 modulo 3 --> 1
7 modulo -3 --> -2
-7 modulo 3 --> 2
-7 modulo -3 --> -1