Was ist der Unterschied zwischen "Mod" und "Rest"?

133

Mein Freund sagte, dass es Unterschiede zwischen "Mod" und "Rest" gibt.

Wenn ja, was sind diese Unterschiede in C und C ++? Bedeutet '%' in C entweder "mod" oder "rem"?

Songhir
quelle
2
Es ist wahrscheinlich für negative Operanden schlecht definiert.
Basile Starynkevitch
1
Ich bin keine C-Person :( kann dies also nicht wirklich im Antwortfeld beantworten. Aber bitte schauen Sie sich diesen Artikel an :)
bonCodigo
1
% ist Rest. Beantworten
Sie
1
Die Frage bedeutet nichts, bis Sie genau definieren, was die Begriffe bedeuten.
David Heffernan
14
@ David: Die Frage betrifft die Bedeutung der Begriffe. Wenn Sie sagen, dass die Frage keine Bedeutung hat, obwohl mehrere Leute sie so verstehen, wie es der Fragesteller beabsichtigt hat, dann müssen Sie genauer sagen, was Sie mit dem Wort "meinen" meinen ;-)
Steve Jessop

Antworten:

140

Es gibt einen Unterschied zwischen Modul und Rest. Beispielsweise:

-21Mod 4ist 3weil -21 + 4 x 6ist 3.

Aber -21geteilt durch 4gibt -5mit einem Rest von -1.

Bei positiven Werten gibt es keinen Unterschied.

David Schwartz
quelle
22
% bedeutet Rem in C.
Banuj
22
@ Jinxiao: In C89 war es implementierungsdefiniert: %war immer der Rest, aber es könnte auch der Modul sein (dh immer positiv), da in C89 die Ganzzahldivision in Richtung negativer Unendlichkeit statt in Richtung 0 gerundet werden durfte. In C89 also -5 / 2könnte -2mit dem Rest sein -1, oder -3mit dem Rest 1musste die Implementierung nur dokumentieren, welche. C99 hat die Flexibilität entfernt, so ist es jetzt -5 / 2immer -2.
Steve Jessop
2
Eigentlich ist nicht klar, was Modul ist. Je nach Kontext und Sprache scheint es viele verschiedene Definitionen zu geben. Siehe den Wikipedia-Artikel über modulo_operation. In einigen Kontexten ist es tatsächlich dasselbe wie der Rest.
Rudy Velthuis
9
Kann jemand die Schritte in der ersten Berechnung erklären? Wie -21mod 4ist 3? Warum ist die Berechnung -21 + 4 x 6?
Oz Edri
13
@OzEdri Um eine Zahl Mod 4 zu erhalten, addieren Sie ein beliebiges ganzzahliges Vielfaches von 4, um eine Zahl zwischen 0 und 3 zu erhalten. Für -21 ist diese Ganzzahl 6, weil sie -21 + 4 x 6zwischen 0 und 3 liegt.
David Schwartz
47

Bedeutet '%' in C entweder "mod" oder "rem"?

In C %ist der Rest 1 .

... ist das Ergebnis des /Operators der algebraische Quotient, bei dem ein Bruchteil verworfen wird ... (Dies wird oft als "Abschneiden gegen Null" bezeichnet.) C11dr §6.5.5 6

Die Operanden des %Operators müssen vom Typ Integer sein. C11dr §6.5.5 2

Das Ergebnis des /Operators ist der Quotient aus der Division des ersten Operanden durch den zweiten; das Ergebnis des %Bedieners ist der Rest ... C11dr §6.5.5 5


Was ist der Unterschied zwischen "Mod" und "Rest"?

C definiert nicht "mod", wie die in der euklidischen Division oder einem anderen Modulo verwendete Ganzzahlmodulfunktion . "Euklidischer Mod" unterscheidet sich von Cs a%bBetrieb, wenn er anegativ ist.

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

Modulo als euklidische Division

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

Kandidat Modulo-Code:

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

Anmerkung zum Gleitkomma: double fmod(double x, double y)Obwohl es als "fmod" bezeichnet wird, ist es nicht dasselbe wie die euklidische Division "mod", aber ähnlich dem Rest der C-Ganzzahl:

Die fmod Funktionen berechnen den Gleitkommarest von 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   

Begriffsklärung : C hat auch eine ähnlich benannte Funktion, double modf(double value, double *iptr)die den Argumentwert in integrale und gebrochene Teile aufteilt, von denen jeder den gleichen Typ und das gleiche Vorzeichen wie das Argument hat. Dies hat außer der Namensähnlichkeit wenig mit der "Mod" -Diskussion hier zu tun.


1 Vor C99 war Cs Definition von %noch der Rest der Division, /erlaubte dann aber, negative Quotienten abzurunden, anstatt "auf Null abzuschneiden". Siehe Warum erhalten Sie in C89 unterschiedliche Werte für die Ganzzahldivision? . Daher %kann Code bei einigen Kompilierungen vor C99 genau wie die euklidische Division "mod" wirken. Das Obige modulo_Euclidean()wird auch mit diesem alternativen Rest der alten Schule funktionieren.

chux - Monica wieder einsetzen
quelle
1
Informationen zum Implementieren von euklidischen Divisions- und Modulofunktionen in C finden Sie unter Division und Modul für Informatiker . Es kann schneller laufen, wenn Sie wissen, dass nur Ihre Dividende negativ sein kann, Ihr Divisor jedoch immer positiv ist: godbolt.org/g/63UqJo . Verwandte: eine x86 asm Frage nach nicht negativem Modulo
Peter Cordes
Die übliche Definition des Modulo-Operators lautet eher:
Mike Housky
2

Der Modul ist in der modularen Arithmetik, wie Sie sich beziehen, der verbleibende oder verbleibende Wert nach der arithmetischen Division. Dies ist allgemein als Rest bekannt. % ist formal der Restoperator in C / C ++. Beispiel:

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

Zur Diskussion steht noch, wie negative Eingaben für diese% -Operation behandelt werden. Modernes C und C ++ erzeugen für diese Operation einen vorzeichenbehafteten Restwert, bei dem das Vorzeichen des Ergebnisses immer mit der Dividendeneingabe übereinstimmt, ohne Rücksicht auf das Vorzeichen der Divisoreingabe.

user487158
quelle
1

In C und C ++ und vielen Sprachen %ist der Rest NICHT der Moduloperator.

Zum Beispiel ist in der Operation -21 / 4der ganzzahlige Teil -5und der dezimale Teil -.25. Der Rest ist der Bruchteil des Divisors, also unser Rest -1. JavaScript verwendet den Restoperator und bestätigt dies

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

Der Moduloperator ist wie eine "Uhr". Stellen Sie sich einen Kreis mit den Werten 0, 1, 2 und 3 an den Positionen 12 Uhr, 3 Uhr, 6 Uhr und 9 Uhr vor. Wenn wir Quotientenzeiten im Uhrzeigersinn um die Uhr treten, erhalten wir das Ergebnis unserer Moduloperation oder in unserem Beispiel mit einem negativen Quotienten gegen den Uhrzeigersinn, was 3 ergibt.

Hinweis: Der Modul ist immer das gleiche Vorzeichen wie der Divisor und der Rest das gleiche Vorzeichen wie der Quotient. Das Addieren des Divisors und des Restes, wenn der Rest mindestens einer negativ ist, ergibt den Modul.

theEpsilon
quelle
-2

In der Mathematik ist das Ergebnis der Modulo-Operation der Rest der euklidischen Division. Andere Konventionen sind jedoch möglich. Computer und Taschenrechner bieten verschiedene Möglichkeiten zum Speichern und Darstellen von Zahlen. Daher hängt ihre Definition der Modulo-Operation von der Programmiersprache und / oder der zugrunde liegenden Hardware ab.

 7 modulo  3 -->  1  
 7 modulo -3 --> -2 
-7 modulo  3 -->  2  
-7 modulo -3 --> -1 
Shub Sharma
quelle
2
Die euklidische Wiki-Division behauptet, 0 ≤ r < |b|was den Rest, auch "Modulo-Operation" genannt, bedeutet. ist immer mindestens 0. Welche Definition verwenden Sie, die zu -2 und -1 führt?
chux
Sir, ich weiß nicht, aber ich google nur 7 Modulo -3 -> -2 .und.-7 Modulo -3 -> -1 Bitte erklären Sie Sir, warum dies passiert ist
Shub Sharma
1
Google verwendet eine andere Definition von Modulo (signiertes Modulo?) Als die euklidische Wiki-Division (wie von Raymond T. Boute beschrieben). Dies diskutiert die Unterschiede mehr. Moral der Geschichte: a%bund a modulo bhaben die gleiche Bedeutung, wenn sie a,bpositiv sind. C99 definiert %genau mit negativen Werten. C nennt dies "Rest". "Modulo" hat weltweit verschiedene Definitionen für negative Werte. C spec verwendet "modulo" nur im Zusammenhang mit positiven Zahlen.
chux - Reinstate Monica