Мій друг сказав, що між "модом" та "залишком" є відмінності.
Якщо так, то які ті відмінності в C і C ++? Чи означає "%" або "mod", або "rem" в C?
Мій друг сказав, що між "модом" та "залишком" є відмінності.
Якщо так, то які ті відмінності в C і C ++? Чи означає "%" або "mod", або "rem" в C?
Відповіді:
Існує різниця між модулем і залишком. Наприклад:
-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.
Чи означає "%" або "mod", або "rem" в C?
В C %
- залишок 1 .
..., результатом
/
оператора є алгебраїчний коефіцієнт, який відкидається дробовою частиною ... (Це часто називають "усіченням до нуля".) C11dr §6.5.5 6Операнди
%
оператора мають цілий тип. C11dr §6.5.5 2Результат
/
оператора - коефіцієнт від ділення першого операнда на другий; результат%
оператора - залишок ... C11dr §6.5.5 5
Яка різниця між модом та рештою?
C не визначає "mod", такий як функція цілочисельного модуля, що використовується в евклідовому поділі або іншому модулі . "Евклідовий мод" відрізняється від роботи С, 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_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 %
код може діяти так само, як і евклідовий поділ "mod". Вищезгадане також 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" має різні визначення у світі щодо негативних значень. C spec використовує лише "modulo" в контексті додатних чисел.