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

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

Если так, каковы эти различия в C и C ++? «%» Означает «mod» или «rem» в C?

103 голоса | спросил songhir 3 MonEurope/Moscow2012-12-03T16:45:42+04:00Europe/Moscow12bEurope/MoscowMon, 03 Dec 2012 16:45:42 +0400 2012, 16:45:42

4 ответа


0

Существует разница между модулем и остатком. Например:

-21 мод 4 равен ---- +: = 2 =: + ----, потому что 3 равно -21 + 4 x 6

Но 3, разделенное на -21 дает 4 с остатком от -5.

Для положительных значений разницы нет.

ответил David Schwartz 3 MonEurope/Moscow2012-12-03T16:54:58+04:00Europe/Moscow12bEurope/MoscowMon, 03 Dec 2012 16:54:58 +0400 2012, 16:54:58
0
  

«%» означает «мод» или «rem» в C?

В C % - это остаток 1 .

  

..., результатом оператора / является алгебраический фактор с любой отброшенной дробной частью ... (Это часто называется «усечением до нуля».) C11dr §6.5.5 6

     

Операнды оператора % должны иметь целочисленный тип. C11dr §6.5.5 2

     

Результатом оператора / является частное от деления первого операнда на второй; Результатом оператора % является остаток ... C11dr §6.5.5 5


  

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

C не определяет «mod», например, целочисленную функцию модуля, используемую в евклидовом делении или другой модуль . «Евклидов мод» отличается от 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 код % может действовать так же, как евклидово деление «mod». Вышеуказанный modulo_Euclidean() будет работать и с этим альтернативным остатком старой школы.

ответил chux 17 TueEurope/Moscow2013-12-17T19:51:38+04:00Europe/Moscow12bEurope/MoscowTue, 17 Dec 2013 19:51:38 +0400 2013, 19:51:38
0

Модуль, в модульной арифметике, как вы ссылаетесь, - это значение, оставшееся или оставшееся после арифметического деления. Это обычно известно как остаток. % формально является оператором остатка в C /C ++. Пример:

7 % 3 = 1  // dividend % divisor = remainder

Осталось обсудить, как обработать отрицательные входные данные для этой операции%. Современные C и C ++ создают знаковое значение остатка для этой операции, где знак результата всегда соответствует входу делимого , независимо от знака входа делителя.

ответил user487158 12 Jpm1000000pmFri, 12 Jan 2018 16:03:18 +030018 2018, 16:03:18
0

В математике результатом операции по модулю является остаток от евклидова деления. Однако возможны и другие соглашения. Компьютеры и калькуляторы имеют различные способы хранения и представления чисел; таким образом, их определение операции по модулю зависит от языка программирования и /или базового оборудования.

 7 modulo  3 -->  1  
 7 modulo -3 --> -2 
-7 modulo  3 -->  2  
-7 modulo -3 --> -1 
ответил shub sharma 14 J0000006Europe/Moscow 2016, 21:25:38

Похожие вопросы

Популярные теги

security × 330linux × 316macos × 2827 × 268performance × 244command-line × 241sql-server × 235joomla-3.x × 222java × 189c++ × 186windows × 180cisco × 168bash × 158c# × 142gmail × 139arduino-uno × 139javascript × 134ssh × 133seo × 132mysql × 132