Was ist der Unterschied zwischen „mod“ und „rest“?

Lesezeit: 10 Minuten

Benutzeravatar von songhir
songhir

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”?

  • Es ist wahrscheinlich für negative Operanden schlecht definiert.

    – Basile Starynkevitch

    3. Dezember 2012 um 12:46 Uhr

  • @BasileStarynkevitch: Meinst du, dass der Unterschied von Implementierungen abhängt, wenn negative Operanden auftreten? Ich brauche “ja” oder “nein”, weil mir diese Frage zu schaffen macht. Vielen Dank!

    – songhir

    3. Dezember 2012 um 12:50 Uhr


  • % ist Rest. Details hier beantworten -> blogs.msdn.com/b/ericlippert/archive/2011/12/05/…

    – Wim

    3. Dezember 2012 um 12:52 Uhr


  • @David: Die Frage betrifft die Bedeutung der Begriffe. Wenn Sie sagen, dass die Frage keine Bedeutung hat, obwohl mehrere Leute sie so verstanden haben, wie der Fragesteller beabsichtigt hat, dann müssen Sie meiner Meinung nach genauer sagen, was Sie mit dem Wort “gemein” meinen 😉

    – Steve Jessop

    3. Dezember 2012 um 13:53 Uhr


  • @SteveJessop Es gibt konkurrierende Bedeutungen für diese Begriffe. Wenn die Frage angeben kann, welche dieser konkurrierenden Bedeutungen verwendet werden soll, ist es möglich zu sagen, wie sie sich unterscheiden.

    – David Heffernan

    3. Dezember 2012 um 13:55 Uhr

Benutzeravatar von David Schwartz
David Schwarz

Es gibt einen Unterschied zwischen Modul und Rest. Zum Beispiel:

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

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

Bei positiven Werten gibt es keinen Unterschied.

  • @Jinxiao: In C89 war es implementierungsdefiniert: % war immer der Rest, aber es könnte Auch der Modulus sein (also immer positiv), denn in C89 durfte die ganzzahlige Division gegen minus unendlich statt gegen 0 runden. Also in C89, -5 / 2 könnte sein -2 mit rest -1oder -3 mit rest 1, die Umsetzung musste nur noch welche dokumentieren. C99 hat die Flexibilität entfernt, also jetzt -5 / 2 ist immer -2.

    – Steve Jessop

    3. Dezember 2012 um 13:23 Uhr


  • Tatsächlich 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 manchen Kontexten ist es tatsächlich dasselbe wie Rest.

    – Rudy Velthuis

    8. Juni 2014 um 17:44 Uhr

  • Kann jemand die Schritte in der ersten Berechnung erklären? Wie -21 Mod 4 ist 3? Warum die Berechnung ist -21 + 4 x 6?

    – Oz Edri

    5. Dezember 2015 um 20:23 Uhr


  • @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 -21 + 4 x 6 liegt zwischen 0 und 3.

    – David Schwartz

    6. Dezember 2015 um 6:53 Uhr

  • Eigentlich ist das falsch. Definitionsgemäß (vgl en.wikipedia.org/wiki/Euclidean_division) der Rest ist eine positive Zahl, also -21 geteilt durch 4 gibt -6 mit einem Rest von 3

    – Marcosch

    8. Februar 2018 um 10:45 Uhr

chux – Stellt Monicas Benutzeravatar wieder her
Chux – Wiedereinsetzung von Monica

Bedeutet ‘%’ in C entweder “mod” oder “rem”?

In C, % ist der Rest1.

…, das Ergebnis der / Operator ist der algebraische Quotient, wobei alle Nachkommastellen verworfen werden … (Dies wird oft als “Abschneiden in Richtung Null” bezeichnet.) C11dr §6.5.5 6

Die Operanden der % Der Operator muss vom Typ Integer sein. C11dr §6.5.5 2

Das Ergebnis der / operator ist der Quotient aus der Division des ersten Operanden durch den zweiten; das Ergebnis der % Betreiber ist der Rest … C11dr §6.5.5 5


Was ist der Unterschied zwischen „mod“ und „rest“?

C definiert weder einen „mod“- noch einen „modulo“-Operator/eine Funktion, wie z. B. die Integer-Modulus-Funktion, die in verwendet wird Euklidische Teilung oder andere modulo.

C definiert Rest.

Vergleichen wir “Rest” pro the % Operator zum euklidischen “mod”.

“Euclidean mod” unterscheidet sich von C’s a%b Betrieb wann a ist negativ.

 // a % b, the remainder after an integer division that truncates toward 0.
 7 %  3 -->  1  
 7 % -3 -->  1  
-7 %  3 --> -1  
-7 % -3 --> -1   

“Mod” oder Modulo wie in der euklidischen Division. Das Ergebnis ist immer 0 oder positiv.

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

Möglicher 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;
}

Hinweis zu Fließkommazahlen: double fmod(double x, double y)obwohl es “fmod” heißt, ist es nicht dasselbe wie die euklidische Division “mod”, aber ähnlich wie der ganzzahlige Rest von C:

Das 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) wodurch der Argumentwert in ganzzahlige und gebrochene Teile zerlegt wird, die jeweils den gleichen Typ und das gleiche Vorzeichen wie das Argument haben. Das hat wenig mit der “mod”-Diskussion hier zu tun, außer Namensähnlichkeit.


[Edit Dec 2020]

Für diejenigen, die in allen Fällen eine ordnungsgemäße Funktionalität wünschen, eine verbesserte modulo_Euclidean() dass 1) erkennt mod(x,0) und 2) ein gutes und kein UB-Ergebnis mit modulo_Euclidean2(INT_MIN, -1). Inspiriert von 4 verschiedene Implementierungen von Modulo mit vollständig definiertem Verhalten.

int modulo_Euclidean2(int a, int b) {
  if (b == 0) TBD_Code(); // perhaps return -1 to indicate failure?
  if (b == -1) return 0; // This test needed to prevent UB of `INT_MIN % -1`.
  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;
}

1 Vor C99 war die C-Definition von % war noch das Rest von der Teilung, doch dann / erlaubte negative Quotienten abzurunden, anstatt “in Richtung Null abzuschneiden”. Siehe Warum erhalten Sie unterschiedliche Werte für die ganzzahlige Division in C89?. Also mit einer Zusammenstellung vor C99, % Code kann sich wie die euklidische Division “mod” verhalten. Obenstehendes modulo_Euclidean() wird auch mit diesem alternativen Rest der alten Schule funktionieren.

  • Um euklidische Divisions- und Modulo-Funktionen in C zu implementieren, siehe Division und Modul für Informatiker. Es kann schneller laufen, wenn Sie wissen, dass nur Ihre Dividende negativ sein kann, aber Ihr Divisor immer positiv ist: godbolt.org/g/63UqJo. Verwandt: eine x86-asm-Frage, die nach nicht negativem Modulo fragt

    – Peter Cordes

    29. November 2016 um 12:41 Uhr


Das Vorzeichen des Restes ist das gleiche wie das Teilbare und das Vorzeichen des Moduls ist das gleiche wie der Divisor.

Der Rest ist einfach der verbleibende Teil nach der arithmetischen Division zwischen zwei ganzen Zahlen, während Modulus die Summe von Rest und Divisor ist, wenn sie entgegengesetzte Vorzeichen haben, und der verbleibende Teil nach der arithmetischen Division, wenn Rest und Divisor beide das gleiche Vorzeichen haben.

Beispiel für Rest:

10 % 3 = 1 [here divisible is 10 which is positively signed so the result will also be positively signed]

-10 % 3 = -1 [here divisible is -10 which is negatively signed so the result will also be negatively signed]

10 % -3 = 1 [here divisible is 10 which is positively signed so the result will also be positively signed]

-10 % -3 = -1 [here divisible is -10 which is negatively signed so the result will also be negatively signed]

Beispiel für Modul:

5 % 3 = 2 [here divisible is 5 which is positively signed so the remainder will also be positively signed and the divisor is also positively signed. As both remainder and divisor are of same sign the result will be same as remainder]

-5 % 3 = 1 [here divisible is -5 which is negatively signed so the remainder will also be negatively signed and the divisor is positively signed. As both remainder and divisor are of opposite sign the result will be sum of remainder and divisor -2 + 3 = 1]

5 % -3 = -1 [here divisible is 5 which is positively signed so the remainder will also be positively signed and the divisor is negatively signed. As both remainder and divisor are of opposite sign the result will be sum of remainder and divisor 2 + -3 = -1]

-5 % -3 = -2 [here divisible is -5 which is negatively signed so the remainder will also be negatively signed and the divisor is also negatively signed. As both remainder and divisor are of same sign the result will be same as remainder]

Ich hoffe, dies wird klar zwischen Rest und Modul unterscheiden.

  • “und das Vorzeichen des Moduls ist das gleiche wie der Divisor.” und “Modul ist der …”, der hier verwendet wird, ist einer von a Anzahl der Modulo-Definitionen. Das ist es sicherlich nicht Euklidisch eines.

    – chux – Wiedereinsetzung von Monica

    18. Januar um 22:17 Uhr


  • Ich vermute, die Modulo-Definition, die Sie verwenden, ist die bodenständige Aufteilung eines.

    – chux – Wiedereinsetzung von Monica

    18. Januar um 22:20 Uhr

Benutzeravatar von theEpsilon
derEpsilon

In C und C++ und vielen Sprachen, % ist der Rest NICHT der Modulo-Operator.

Zum Beispiel im Betrieb -21 / 4 der ganzzahlige Teil ist -5 und der Dezimalteil ist -.25. Der Rest ist der Bruchteil multipliziert mit dem Divisor, also ist unser Rest -1. JavaScript verwendet den Restoperator und bestätigt dies

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

Der Modulo-Operator ist so, als hätten Sie 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 die Quotientenzeiten rund um die Uhr im Uhrzeigersinn weiterschalten, landen wir beim Ergebnis unserer Moduloperation oder, in unserem Beispiel mit einem negativen Quotienten, gegen den Uhrzeigersinn, was 3 ergibt.

Notiz: Der Modul hat immer das gleiche Vorzeichen wie der Divisor und der Rest das gleiche Vorzeichen wie der Quotient. Das Addieren des Divisors und des Rests, wenn mindestens eins negativ ist, ergibt den Modul.

Modulus ist in der modularen Arithmetik, wie Sie sich beziehen, der Wert, der nach der arithmetischen Division übrig bleibt oder übrig bleibt. Dies wird allgemein als Rest bezeichnet. % ist formal der Restoperator in C / C++. Beispiel:

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

Was noch zu diskutieren bleibt, ist, wie negative Eingaben für diese %-Operation behandelt werden. Modernes C und C++ erzeugen einen vorzeichenbehafteten Restwert für diese Operation where das Vorzeichen des Ergebnisses stimmt immer mit der Dividendeneingabe überein ohne Rücksicht auf das Vorzeichen der Divisoreingabe.

% is a remainder(leftover after dividend / divisor) NOT modulus. 

Sie könnten Ihre eigene Modulfunktion schreiben, indem Sie den Rest (%) durch die Beziehung verwenden

  ((n%m)+m)%m

  where `n` is the given number and `m` is the modulus

Nachfolgend finden Sie die Differenz zwischen den Rest- und Modulwerten für den Bereich n = (-7,7) und m = 3

n       -7 -6 -5 -4 -3 -2 -1  0  1  2  3  4  5  6  7  
------------------------------------------------------------------------- 
%(-m)   -1  0 -2 -1  0 -2 -1  0  1  2  0  1  2  0  1  =>  remainder
% m     -1  0 -2 -1  0 -2 -1  0  1  2  0  1  2  0  1  =>  remainder
mod m    2  0  1  2  0  1  2  0  1  2  0  1  2  0  1  =>  ((n%m)+m)%m
mod(-m) -1  0 -2 -1  0 -2 -1  0 -2 -1  0 -2 -1  0 -2  =>  ((n%m)+m)%m

Tipps zum Merken:

n%(-m)   = +(remainder)
(-n)%(m) = -(remainder)
sign of 'm' doesn't matter

n mod (-m) = -(result)
(-n) mod m = +(result)
sign of 'n' doesn't matter

For +ve 'n' and '%(-m)' or '%m' or 'mod m' gives the same remainder

In der Mathematik ist das Ergebnis der Modulo-Operation der Rest der euklidischen Division. Andere Konventionen sind jedoch möglich. Computer und Taschenrechner haben verschiedene Möglichkeiten, Zahlen zu speichern und darzustellen; 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 

  • Das Wiki Euklidische Teilung behauptet 0 ≤ r < |b| was bedeutet, dass der Rest auch als “Modulo-Operation” bezeichnet wird. ist immer mindestens 0. Welche Definition verwenden Sie, die zu -2 und -1 führt?

    – chux – Wiedereinsetzung von Monica

    14. Juni 2016 um 18:51 Uhr


  • Sir, ich weiß nicht nein, aber ich google nur 7 Modulo -3 –> -2 .and. -7 Modulo -3 –> -1 Bitte erklären Sie Sir, warum dies passiert ist

    – shub Sharma

    15. Juni 2016 um 7:17 Uhr


  • Google verwendet eine andere Definition von Modulo (vorzeichenbehaftetes Modulo?) als Wiki Euclidian Division (wie von Raymond T. Boute beschrieben). Dies diskutiert die Unterschiede mehr. Moral der Geschichte: a%b und a modulo b haben die gleiche Bedeutung wann a,b sind positiv. C99 definiert % gerade mit negativen Werten. C nennt dies “Rest”. “Modulo” hat verschiedene Definitionen in der Welt in Bezug auf negative Werte. C spec verwendet “Modulo” nur im Zusammenhang mit positiven Zahlen.

    – chux – Wiedereinsetzung von Monica

    15. Juni 2016 um 14:21 Uhr

1425590cookie-checkWas ist der Unterschied zwischen „mod“ und „rest“?

This website is using cookies to improve the user-friendliness. You agree by using the website further.

Privacy policy