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?
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?
Respuestas:
Hay una diferencia entre módulo y resto. Por ejemplo:
-21
mod 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.
%
siempre era el resto, pero podría también ser el módulo (es decir, siempre positivo), porque en C89 número entero división se le permitió ronda hacia el infinito negativo en lugar de hacia 0. Por lo tanto en C89, -5 / 2
podría ser -2
con el resto -1
, o -3
con el resto 1
, la implementación solo tenía que documentar qué. C99 eliminó la flexibilidad, por lo que ahora -5 / 2
es siempre -2
.
-21
mod ? ¿Por qué es el cálculo ? 4
3
-21 + 4 x 6
-21 + 4 x 6
está entre 0 y 3.
¿'%' Significa "mod" o "rem" en C?
En C, %
es el resto 1 .
..., el resultado del
/
operador es el cociente algebraico con cualquier parte fraccional descartada ... (Esto a menudo se llama "truncamiento hacia cero".) C11dr §6.5.5 6Los operandos del
%
operador deberán tener un tipo entero. C11dr §6.5.5 2El resultado del
/
operador es el cociente de la división del primer operando por el segundo; el resultado del%
operador es el resto ... C11dr §6.5.5 5
¿Cuál es la diferencia entre "mod" y "resto"?
C no define "mod", como la función de módulo entero utilizada en la división euclidiana u otro módulo . El "mod euclidiano" difiere de la a%b
operación de C cuando a
es negativo.
// 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 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 del entero C:
Las
fmod
funciones calculan el resto de coma flotantex/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 integrales 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.
1 Antes de C99, la definición de C %
todavía era el resto de la división, pero /
permitía redondear los cocientes negativos en lugar de "truncar 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 el "mod" de la división euclidiana. Lo anterior modulo_Euclidean()
también funcionará con este resto alternativo de la vieja escuela.
Módulo, en aritmética modular como se refiere, es el valor restante o el valor restante después de la división aritmética. Esto se conoce comúnmente como resto. % es formalmente el operador restante en C / C ++. Ejemplo:
7 % 3 = 1 // dividend % divisor = remainder
Lo que queda por debatir es cómo tratar las entradas negativas para esta operación%. C y C ++ modernos producen un valor de resto 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 C y C ++ y muchos lenguajes, %
el resto NO es el operador del 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 fracción parcial multiplicada por el divisor, por lo que nuestro resto es -1
. JavaScript utiliza el operador restante y confirma esto
console.log(-21 % 4 == -1);
El operador del 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 en punto, las 3 en punto, las 6 en punto y las 9 en punto, respectivamente. Pasar el cociente veces 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 sentido antihorario, dando 3.
Nota: el módulo es siempre el mismo signo que el divisor y el resto el mismo signo que el cociente. Agregar el divisor y el resto cuando el resto al menos uno es negativo produce el módulo.
En matemáticas, el resultado de la operación de 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 del 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
0 ≤ r < |b|
que significa el resto también conocido como "operación de módulo". siempre es al menos 0. ¿Qué definición estás usando que da como resultado -2 y -1?
a%b
y a modulo b
tienen el mismo significado cuando a,b
son positivos. C99 define %
con precisión con valores negativos. C llama a este "resto'. 'Modulo' tiene varias definiciones en el mundo en relación con los valores negativos C spec sólo utiliza. 'Módulo' en el contexto de los números positivos.