Мой друг сказал, что между «модом» и «остатком» есть различия.
Если да, то каковы эти различия в C и C ++? Означает ли '%' в C либо "mod", либо "rem"?
Мой друг сказал, что между «модом» и «остатком» есть различия.
Если да, то каковы эти различия в C и C ++? Означает ли '%' в C либо "mod", либо "rem"?
Ответы:
Есть разница между модулем и остатком. Например:
-21
мод 4
это 3
потому , что -21 + 4 x 6
есть 3
.
Но -21
деление 4
дает -5
с остатком -1
.
Для положительных значений разницы нет.
%
всегда был остатком, но он также мог быть модулем (т.е. всегда положительным), потому что в C89 целочисленное деление разрешалось округлять в сторону отрицательной бесконечности, а не в сторону 0. Итак, в C89, -5 / 2
может быть -2
с остатком -1
или -3
с остатком 1
, реализация просто должна задокументировать который. C99 убрал гибкость, теперь -5 / 2
всегда -2
.
-21
мода 4
это 3
? Почему расчет -21 + 4 x 6
?
-21 + 4 x 6
находится между 0 и 3.
Означает ли '%' в C либо "mod", либо "rem"?
В C %
- остаток 1 .
..., результатом
/
оператора является алгебраическое частное с отброшенной дробной частью ... (Это часто называется "усечением до нуля".) C11dr §6.5.5 6Операнды
%
оператора должны иметь целочисленный тип. C11dr §6.5.5 2Результатом
/
оператора является частное от деления первого операнда на второй; результат%
оператора - остаток ... C11dr §6.5.5 5
В чем разница между «модом» и «остатком»?
C не определяет «модуль», такой как целочисленная функция модуля, используемая в евклидовом делении или другом модуле . «Евклидова мода» отличается от a%b
операции C, когда 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_Euclidean(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)
которая разбивает значение аргумента на целые и дробные части, каждая из которых имеет тот же тип и знак, что и аргумент. Это не имеет ничего общего с обсуждением «мода» здесь, за исключением сходства имен.
1 До C99 определение C все %
еще было остатком от деления, но затем /
позволяло округлять отрицательные частные, а не «усечение до нуля». См. Почему вы получаете разные значения для целочисленного деления в C89? , Таким образом, при некоторой компиляции до C99 %
код может действовать точно так же, как «мод» евклидова деления. Вышеупомянутое modulo_Euclidean()
будет работать и с этим альтернативным остатком старой школы.
Модуль, в модульной арифметике, как вы говорите, - это значение, оставшееся или оставшееся значение после арифметического деления. Это обычно известно как остаток. % формально является оператором остатка в C / C ++. Пример:
7 % 3 = 1 // dividend % divisor = remainder
Осталось обсудить, как обрабатывать отрицательные входные данные для этой операции%. Современные C и C ++ создают значение остатка со знаком для этой операции, где знак результата всегда совпадает с вводом делимого, независимо от знака ввода делителя.
В C, C ++ и многих языках %
остаток НЕ является оператором модуля.
Например, в операции -21 / 4
целая часть -5
и десятичная часть -.25
. Остаток - это дробная часть, умноженная на делитель, поэтому наш остаток равен -1
. JavaScript использует оператор остатка и подтверждает это
console.log(-21 % 4 == -1);
Оператор модуля похож на «часы». Представьте себе круг со значениями 0, 1, 2 и 3 в положениях 12 часов, 3 часов, 6 часов и 9 часов соответственно. Переход по часовой стрелке на частное по часовой стрелке приводит нас к результату нашей операции модуля или, в нашем примере с отрицательным частным, против часовой стрелки, что дает 3.
Примечание. Модуль всегда имеет тот же знак, что и делитель, а остаток - тот же знак, что и частное. Добавление делителя и остатка, когда хотя бы один остаток отрицательный, дает модуль.
В математике результатом операции по модулю является остаток от евклидова деления. Однако возможны и другие соглашения. В компьютерах и калькуляторах есть различные способы хранения и представления чисел; таким образом, их определение операции по модулю зависит от языка программирования и / или базового оборудования.
7 modulo 3 --> 1
7 modulo -3 --> -2
-7 modulo 3 --> 2
-7 modulo -3 --> -1
0 ≤ r < |b|
что означает остаток ака «операции по модулю.» всегда как минимум 0. Какое определение вы используете, чтобы получить значения -2 и -1?
a%b
и a modulo b
иметь то же значение, когда a,b
позитивны. C99 определяет %
точно с отрицательными значениями. C называет это «остатком». «Modulo» имеет различные определения в мире, касающиеся отрицательных значений.