Il mio amico ha detto che ci sono differenze tra "mod" e "restinder".
In tal caso, quali sono queste differenze in C e C ++? '%' Significa "mod" o "rem" in C?
Il mio amico ha detto che ci sono differenze tra "mod" e "restinder".
In tal caso, quali sono queste differenze in C e C ++? '%' Significa "mod" o "rem" in C?
Risposte:
C'è una differenza tra modulo e resto. Per esempio:
-21
mod 4
è 3
perché lo -21 + 4 x 6
è 3
.
Ma -21
diviso per 4
dà -5
con un resto di -1
.
Per valori positivi, non c'è differenza.
%
era sempre il resto, ma poteva anche essere il modulo (cioè sempre positivo), perché in C89 la divisione di numeri interi era autorizzata a arrotondare verso l'infinito negativo anziché verso 0. Quindi in C89, -5 / 2
potrebbe essere -2
con il resto -1
, o -3
con il resto 1
, l'implementazione doveva solo documentare quale. C99 ha rimosso la flessibilità, quindi ora lo -5 / 2
è sempre -2
.
-21
mod ? Perché il calcolo è ? 4
3
-21 + 4 x 6
-21 + 4 x 6
è compreso tra 0 e 3.
'%' Significa "mod" o "rem" in C?
In C, %
è il resto 1 .
..., il risultato
/
dell'operatore è il quoziente algebrico con qualsiasi parte frazionaria scartata ... (Questo è spesso chiamato "troncamento verso zero".) C11dr §6.5.5 6Gli operandi
%
dell'operatore devono essere di tipo intero. C11dr §6.5.5 2Il risultato
/
dell'operatore è il quoziente della divisione del primo operando per il secondo; il risultato%
dell'operatore è il resto ... C11dr §6.5.5 5
Qual è la differenza tra "mod" e "remainder"?
C non definisce "mod", come la funzione del modulo intero utilizzata nella divisione euclidea o altro modulo . La "mod euclidea" differisce dall'operazione di C a%b
quando a
è negativa.
// a % b
7 % 3 --> 1
7 % -3 --> 1
-7 % 3 --> -1
-7 % -3 --> -1
Modulo come divisione euclidea
7 modulo 3 --> 1
7 modulo -3 --> 1
-7 modulo 3 --> 2
-7 modulo -3 --> 2
Codice modulo 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 sul virgola mobile: double fmod(double x, double y)
anche se chiamato "fmod", non è lo stesso della divisione euclidea "mod", ma simile al resto intero in C:
Le
fmod
funzioni calcolano il resto in virgola mobile dix/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
Disambiguazione : C ha anche una funzione denominata similedouble modf(double value, double *iptr)
che suddivide il valore dell'argomento in parti integrali e frazionarie, ognuna delle quali ha lo stesso tipo e segno dell'argomento. Questo ha poco a che fare con la discussione "mod" qui, tranne la somiglianza dei nomi.
1 Prima di C99, la definizione di C %
era ancora il resto della divisione, tuttavia /
consentiva di arrotondare i quozienti negativi anziché "troncamento verso zero". Vedi Perché ottieni valori diversi per la divisione di numeri interi in C89? . Pertanto, con alcune compilation precedenti al C99, il %
codice può agire proprio come la divisione "mod" euclidea. Quanto sopra modulo_Euclidean()
funzionerà anche con questo resto della vecchia scuola alternativo.
Il modulo, nell'aritmetica modulare come ci si riferisce, è il valore rimasto o il valore rimanente dopo la divisione aritmetica. Questo è comunemente noto come resto. % è formalmente l'operatore residuo in C / C ++. Esempio:
7 % 3 = 1 // dividend % divisor = remainder
Ciò che resta da discutere è come trattare gli input negativi per questa operazione%. I moderni C e C ++ producono un valore residuo con segno per questa operazione in cui il segno del risultato corrisponde sempre all'input del dividendo indipendentemente dal segno dell'input del divisore.
In C e C ++ e in molti linguaggi, %
il resto NON è l'operatore del modulo.
Ad esempio, nell'operazione -21 / 4
la parte intera è -5
e la parte decimale è -.25
. Il resto è la parte frazionaria del divisore, quindi il nostro resto è -1
. JavaScript utilizza l'operatore residuo e lo conferma
console.log(-21 % 4 == -1);
L'operatore del modulo è come se avessi un "orologio". Immagina un cerchio con i valori 0, 1, 2 e 3 rispettivamente alle posizioni 12, 3, 6 e 9. Aumentare i tempi del quoziente in senso orario ci atterra sul risultato della nostra operazione del modulo o, nel nostro esempio con un quoziente negativo, in senso antiorario, ottenendo 3.
Nota: il modulo è sempre lo stesso segno del divisore e il resto lo stesso segno del quoziente. Aggiungendo il divisore e il resto quando il resto almeno uno è negativo si ottiene il modulo.
In matematica il risultato dell'operazione modulo è il resto della divisione euclidea. Tuttavia, sono possibili altre convenzioni. Computer e calcolatrici hanno vari modi di memorizzare e rappresentare numeri; pertanto la loro definizione dell'operazione modulo dipende dal linguaggio di programmazione e / o dall'hardware sottostante.
7 modulo 3 --> 1
7 modulo -3 --> -2
-7 modulo 3 --> 2
-7 modulo -3 --> -1
0 ≤ r < |b|
che significa il resto aka "operazione modulo". è sempre almeno 0. Quale definizione stai usando che risulta in -2 e -1?
a%b
e a modulo b
hanno lo stesso significato quandoa,b
sono positivi. C99 definisce %
con precisione valori negativi. C chiama questo "resto". "Modulo" ha varie definizioni nel mondo relative a valori negativi, mentre C specifica usa "modulo" solo nel contesto di numeri positivi.