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

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

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

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

-21 mod 4 es 3 porque -21 + 4 x 6 es 3 .

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

Para valores positivos, no hay diferencia.

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

En C, % es el rest.

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

Los operandos del operador % tendrán un tipo de entero. C11dr §6.5.5 2

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


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

C no define “mod”, como la función de módulo entero utilizada en la división euclidiana u otro módulo . La “mod euclidiana” difiere de la operación de C en a%b cuando a es negativa.

  // a % b 7 % 3 --> 1 7 % -3 --> 1 -7 % 3 --> -1 -7 % -3 --> -1 

Módulo como división euclidiana

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

Código del módulo candidato:

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

Nota sobre el punto flotante: double fmod(double x, double y) , aunque se llame "fmod", no es lo mismo que "división" de la división euclidiana, pero es similar al rest entero en C:

Las funciones fmod calculan el rest en coma 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 

Nota: C también tiene una función con nombre similar double modf(double value, double *iptr) que divide el valor del argumento en partes integrales y fraccionarias, cada una de las cuales tiene el mismo tipo y signo que el argumento.

Módulo, en aritmética modular como se refiere, es el valor que queda o el valor restante después de la división aritmética. Esto se conoce comúnmente como rest. % es formalmente el operador restante 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%. Los modernos C y C ++ producen un valor de rest firmado para esta operación en el que el signo del resultado siempre coincide con la entrada del dividendo sin tener en cuenta el signo de la entrada del divisor.

En matemáticas, el resultado de la operación módulo es el rest 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 del funcionamiento del módulo depende del lenguaje de progtwigción y / o del hardware subyacente.

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