В чем разница между "мод" и "остаток"?

Мой друг сказал, что есть различия между "модом" и "остатком".

Если да, то каковы эти различия в 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 
Другие вопросы по тегам