¿Cuál es la diferencia entre “mod” y “resto”?

11 minutos de lectura

avatar de usuario
sonhir

Mi amigo dijo que hay diferencias entre “mod” y “resto”.

Si es así, ¿cuáles son esas diferencias en C y C++? ¿’%’ significa “mod” o “rem” en C?

  • Probablemente esté mal definido para operandos negativos.

    – Basile Starynkevitch

    3 de diciembre de 2012 a las 12:46

  • @BasileStarynkevitch: ¿Quiere decir que la diferencia depende de las implementaciones cuando ocurren operandos negativos? Necesito “sí” o “no” porque esta pregunta me causa problemas. ¡Gracias!

    – Songhir

    3 de diciembre de 2012 a las 12:50


  • % es resto. Detalles de la respuesta aquí -> blogs.msdn.com/b/ericlippert/archive/2011/12/05/…

    – Wim

    3 de diciembre de 2012 a las 12:52


  • @David: la pregunta es sobre el significado de los términos. Si dices que la pregunta no tiene sentido, a pesar de que varias personas la entendieron de la forma en que el interrogador pretendía, entonces creo que debes ser más específico a lo que te refieres con la palabra “significa” 😉

    –Steve Jessop

    3 de diciembre de 2012 a las 13:53


  • @SteveJessop Hay significados contrapuestos para estos términos. Si la pregunta puede especificar cuál de esos significados en competencia se utilizará, entonces será posible decir en qué se diferencian.

    –David Heffernan

    3 de diciembre de 2012 a las 13:55

avatar de usuario
david schwartz

Hay una diferencia entre módulo y resto. Por ejemplo:

-21 modificación 4 es 3 porque -21 + 4 x 6 es 3.

Pero -21 dividido por 4 da -5 con un resto de -1.

Para valores positivos, no hay diferencia.

  • @Jinxiao: en C89 estaba definido por la implementación: % siempre fue el resto, pero podría además sea ​​el módulo (es decir, siempre positivo), porque en C89 se permitió que la división de enteros redondeara hacia el infinito negativo en lugar de hacia 0. Entonces, en C89, -5 / 2 podría ser -2 con resto -1o -3 con resto 1, la implementación solo tenía que documentar cuál. C99 eliminó la flexibilidad, por lo que ahora -5 / 2 es siempre -2.

    –Steve Jessop

    3 de diciembre de 2012 a las 13:23


  • En realidad, no está claro qué es el módulo. Parece haber muchas definiciones diferentes, según el contexto y el idioma. Consulte el artículo de wikipedia sobre modulo_operation. En algunos contextos, en realidad es lo mismo que el resto.

    – Rudy Velthuis

    8 de junio de 2014 a las 17:44

  • ¿Alguien puede explicar los pasos en el primer cálculo? Cómo -21 modificación 4 es 3? porque el calculo es -21 + 4 x 6?

    –Oz ​​Edri

    5 de diciembre de 2015 a las 20:23


  • @OzEdri Para obtener un número mod 4, agrega cualquier número entero múltiplo de 4 que sea necesario para obtener un número entre 0 y 3. Para -21, ese número entero es 6 porque -21 + 4 x 6 está entre 0 y 3.

    –David Schwartz

    6 de diciembre de 2015 a las 6:53

  • En realidad esto está mal. Por definición (ver en.wikipedia.org/wiki/Euclidean_division) el resto es un número positivo, entonces -21 dividido por 4 da -6 con un resto de 3

    – marcosh

    8 de febrero de 2018 a las 10:45

el signo del resto será el mismo que el del divisible y el signo del módulo será el mismo que el del divisor.

El resto es simplemente la parte restante después de la división aritmética entre dos números enteros, mientras que el módulo es la suma del resto y el divisor cuando tienen signos opuestos y la parte restante después de la división aritmética cuando el resto y el divisor tienen el mismo signo.

Ejemplo de Resto:

10 % 3 = 1 [here divisible is 10 which is positively signed so the result will also be positively signed]

-10 % 3 = -1 [here divisible is -10 which is negatively signed so the result will also be negatively signed]

10 % -3 = 1 [here divisible is 10 which is positively signed so the result will also be positively signed]

-10 % -3 = -1 [here divisible is -10 which is negatively signed so the result will also be negatively signed]

Ejemplo de Módulo:

5 % 3 = 2 [here divisible is 5 which is positively signed so the remainder will also be positively signed and the divisor is also positively signed. As both remainder and divisor are of same sign the result will be same as remainder]

-5 % 3 = 1 [here divisible is -5 which is negatively signed so the remainder will also be negatively signed and the divisor is positively signed. As both remainder and divisor are of opposite sign the result will be sum of remainder and divisor -2 + 3 = 1]

5 % -3 = -1 [here divisible is 5 which is positively signed so the remainder will also be positively signed and the divisor is negatively signed. As both remainder and divisor are of opposite sign the result will be sum of remainder and divisor 2 + -3 = -1]

-5 % -3 = -2 [here divisible is -5 which is negatively signed so the remainder will also be negatively signed and the divisor is also negatively signed. As both remainder and divisor are of same sign the result will be same as remainder]

Espero que esto distinga claramente entre resto y módulo.

  • “y el signo del módulo será el mismo que el del divisor”. y “Módulo es el …” utilizado aquí es uno de un número de definiciones de módulo. Ciertamente no es el euclidiana uno.

    – chux – Reincorporar a Monica

    18 de enero a las 22:17


  • Sospecho que la definición de módulo que estás usando es la división piso uno.

    – chux – Reincorporar a Monica

    18 ene a las 22:20

avatar de usuario
chux – Reincorporar a Monica

¿’%’ significa “mod” o “rem” en C?

Cª, % es el recordatorio1.

…, el resultado de la / operador es el cociente algebraico con cualquier parte fraccionaria descartada… (Esto a menudo se denomina “truncamiento hacia cero”.) C11dr §6.5.5 6

Los operandos de la % El operador debe tener un tipo entero. C11dr §6.5.5 2

el resultado de la / operador es el cociente de la división del primer operando por el segundo; el resultado de la % el operador es el recordatorio … C11dr §6.5.5 5


¿Cuál es la diferencia entre “mod” y “resto”?

C no define un operador/función “mod” ni “módulo”, como la función de módulo entero utilizada en división euclidiana o otro módulo.

C define recordatorio.

Comparemos el “resto” según el % operador al “mod” euclidiano.

La “modificación euclidiana” difiere de la de C a%b operación cuando a es negativo

 // a % b, the remainder after an integer division that truncates toward 0.
 7 %  3 -->  1  
 7 % -3 -->  1  
-7 %  3 --> -1  
-7 % -3 --> -1   

“Mod” o módulo como en la división euclidiana. El resultado es siempre 0 o positivo.

 7 modulo  3 -->  1
 7 modulo -3 -->  1
-7 modulo  3 -->  2
-7 modulo -3 -->  2

Código de módulo candidato:

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;
}

Nota sobre el punto flotante: double fmod(double x, double y)aunque se llama “fmod”, no es lo mismo que la división euclidiana “mod”, pero es similar al resto entero de C:

Él fmod funciones calculan el resto de punto flotante de 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

Desambiguación: C también tiene una función con nombre similar double modf(double value, double *iptr) que divide el valor del argumento en partes enteras y fraccionarias, cada una de las cuales tiene el mismo tipo y signo que el argumento. Esto tiene poco que ver con la discusión “mod” aquí, excepto la similitud de nombres.


[Edit Dec 2020]

Para aquellos que quieren una funcionalidad adecuada en todos los casos, una mejora modulo_Euclidean() que 1) detecta mod(x,0) y 2) un resultado bueno y sin UB con modulo_Euclidean2(INT_MIN, -1). Inspirado por 4 implementaciones diferentes de módulo con comportamiento completamente definido.

int modulo_Euclidean2(int a, int b) {
  if (b == 0) TBD_Code(); // perhaps return -1 to indicate failure?
  if (b == -1) return 0; // This test needed to prevent UB of `INT_MIN % -1`.
  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;
}

1 Antes de C99, la definición de C de % seguía siendo el recordatorio de la división, pero entonces / permitió que los cocientes negativos se redondearan hacia abajo en lugar de “truncarse hacia cero”. Consulte ¿Por qué obtiene valores diferentes para la división de enteros en C89?. Por lo tanto, con alguna compilación anterior a C99, % El código puede actuar como la división euclidiana “mod”. Lo anterior modulo_Euclidean() funcionará con este resto alternativo de la vieja escuela también.

  • Para implementar la división euclidiana y las funciones de módulo en C, consulte División y módulo para informáticos. Puede funcionar más rápido si sabe que solo su dividendo puede ser negativo, pero su divisor siempre es positivo: godbolt.org/g/63UqJo. Relacionado: una pregunta de x86 asm que solicita un módulo no negativo

    – Peter Cordes

    29 de noviembre de 2016 a las 12:41


avatar de usuario
elEpsilon

En C y C++ y muchos lenguajes, % es el resto NO el operador de módulo.

Por ejemplo en la operación -21 / 4 la parte entera es -5 y la parte decimal es -.25. El resto es la parte fraccionaria por el divisor, por lo que nuestro resto es -1. JavaScript usa el operador resto y lo confirma

console.log(-21 % 4 == -1);

El operador de módulo es como si tuvieras un “reloj”. Imagine un círculo con los valores 0, 1, 2 y 3 en las posiciones de las 12, las 3, las 6 y las 9, respectivamente. Pasar los tiempos del cociente alrededor del reloj en el sentido de las agujas del reloj nos lleva al resultado de nuestra operación de módulo o, en nuestro ejemplo con un cociente negativo, en el sentido contrario a las agujas del reloj, dando 3.

Nota: El módulo siempre tiene el mismo signo que el divisor y el resto el mismo signo que el cociente. Sumar el divisor y el resto cuando al menos uno es negativo produce el módulo.

avatar de usuario
SridharKritha

% is a remainder(leftover after dividend / divisor) NOT modulus. 

Podrías escribir tu propia función de módulo usando el resto (%) por la relación

  ((n%m)+m)%m

  where `n` is the given number and `m` is the modulus

Encuentre a continuación la diferencia entre los valores de resto y módulo para el rango n = (-7,7) y 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

Consejos para recordar:

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

avatar de usuario
usuario487158

El módulo, en la aritmética modular a la que te refieres, es el valor sobrante o el valor restante después de la división aritmética. Esto se conoce comúnmente como resto. % es formalmente el operador de resto en C/C++. Ejemplo:

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

Lo que queda por discutir es cómo tratar las entradas negativas a esta operación de %. C y C++ modernos producen un valor restante con signo para esta operación donde el signo del resultado siempre coincide con la entrada de dividendos sin tener en cuenta el signo de la entrada del divisor.

En matemáticas, el resultado de la operación módulo es el resto de la división euclidiana. Sin embargo, otras convenciones son posibles. Las computadoras y las calculadoras tienen varias formas de almacenar y representar números; por lo tanto, su definición de la operación de módulo depende del lenguaje de programación y/o del hardware subyacente.

 7 modulo  3 -->  1  
 7 modulo -3 --> -2 
-7 modulo  3 -->  2  
-7 modulo -3 --> -1 

  • Él wiki división euclidiana afirma 0 ≤ r < |b| lo que significa que el resto también conocido como “operación de módulo”. siempre es al menos 0. ¿Qué definición está usando que da como resultado -2 y -1?

    – chux – Reincorporar a Monica

    14/06/2016 a las 18:51


  • señor, no lo sé, pero busqué en Google 7 módulo -3 –> -2 .y.-7 módulo -3 –> -1, por favor explique señor por qué sucedió esto

    – shub sharma

    15 de junio de 2016 a las 7:17


  • Google usa una definición diferente de módulo (¿módulo firmado?) que la división euclidiana de Wiki (como lo describe Raymond T. Boute). Este discute más las diferencias. Moraleja de la historia: a%b y a modulo b tienen el mismo significado cuando a,b son positivos. C99 define % precisamente con valores negativos. C llama a esto “resto”. “Módulo” tiene varias definiciones en el mundo con respecto a los valores negativos. C spec solo usa “módulo” en el contexto de números positivos.

    – chux – Reincorporar a Monica

    15 de junio de 2016 a las 14:21

¿Ha sido útil esta solución?

Esta web utiliza cookies propias y de terceros para su correcto funcionamiento y para fines analíticos y para mostrarte publicidad relacionada con sus preferencias en base a un perfil elaborado a partir de tus hábitos de navegación. Al hacer clic en el botón Aceptar, acepta el uso de estas tecnologías y el procesamiento de tus datos para estos propósitos. Configurar y más información
Privacidad