Qual è la differenza tra "mod" e "remainder"?


133

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?


2
Probabilmente è mal definito per operandi negativi.
Basile Starynkevitch,

1
Non sono una persona C :(, quindi non posso davvero rispondere a questa domanda nella casella di risposta. Ma per favore dai un'occhiata a questo articolo :)
bonCodigo,

1
% è il resto. Dettagli di risposta qui -> blogs.msdn.com/b/ericlippert/archive/2011/12/05/…
wim

1
La domanda non significa nulla fino a quando non si definisce esattamente cosa significano i termini.
David Heffernan,

14
@ David: la domanda riguarda i significati dei termini. Se dici che la domanda non ha significato, nonostante diverse persone lo capiscano nel modo in cui intendeva l'interrogante, allora penso che devi essere più specifico cosa intendi con la parola "dire" ;-)
Steve Jessop

Risposte:


140

C'è una differenza tra modulo e resto. Per esempio:

-21mod 4è 3perché lo -21 + 4 x 6è 3.

Ma -21diviso per 4-5con un resto di -1.

Per valori positivi, non c'è differenza.


22
% significa rem in C.
banuj

22
@Jinxiao: in C89 era definito dall'implementazione: %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 / 2potrebbe essere -2con il resto -1, o -3con il resto 1, l'implementazione doveva solo documentare quale. C99 ha rimosso la flessibilità, quindi ora lo -5 / 2è sempre -2.
Steve Jessop,

2
In realtà, non è chiaro quale sia il modulo. Sembra che ci siano molte definizioni diverse, a seconda del contesto e della lingua. Vedi l'articolo di Wikipedia su modulo_operation. In alcuni contesti, in realtà è lo stesso del resto.
Rudy Velthuis

9
Qualcuno può spiegare i passaggi del primo calcolo? Quanto è -21mod ? Perché il calcolo è ? 43-21 + 4 x 6
Oz Edri,

13
@OzEdri Per ottenere un numero mod mod 4, aggiungi qualunque multiplo intero di 4 per ottenere un numero compreso tra 0 e 3. Per -21, quel numero intero è 6 perché -21 + 4 x 6è compreso tra 0 e 3.
David Schwartz

47

'%' 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 6

Gli operandi %dell'operatore devono essere di tipo intero. C11dr §6.5.5 2

Il 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%bquando 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 di 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   

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.


1
Per implementare le funzioni di divisione e modulo euclidee in C, vedere Divisione e modulo per informatici . Può correre più veloce se sai che solo il tuo dividendo può essere negativo, ma il tuo divisore è sempre positivo: godbolt.org/g/63UqJo . Correlato: una domanda asm x86 che richiede un modulo non negativo
Peter Cordes,

La solita definizione dell'operatore modulo è più simile a:
Mike Housky,

2

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.


1

In C e C ++ e in molti linguaggi, %il resto NON è l'operatore del modulo.

Ad esempio, nell'operazione -21 / 4la parte intera è -5e 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.


-2

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 

2
La divisione euclidea di wiki afferma 0 ≤ r < |b|che significa il resto aka "operazione modulo". è sempre almeno 0. Quale definizione stai usando che risulta in -2 e -1?
chux - Ripristina Monica

signore, no no ma ho solo google 7 modulo -3 -> -2 .e.-7 modulo -3 -> -1 per favore spiegate signore perché è successo
shub sharma,

1
Google utilizza una definizione diversa di modulo (modulo firmato?) Rispetto alla divisione euclidea di Wiki (come descritto da Raymond T. Boute). Questo discute di più le differenze. Morale della storia: a%be a modulo bhanno 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.
chux - Ripristina Monica il
Utilizzando il nostro sito, riconosci di aver letto e compreso le nostre Informativa sui cookie e Informativa sulla privacy.
Licensed under cc by-sa 3.0 with attribution required.