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.
@ 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.
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
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.
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.
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
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.
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.
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.
Antworten:
Es gibt einen Unterschied zwischen Modul und Rest. Beispielsweise:
-21
Mod4
ist3
weil-21 + 4 x 6
ist3
.Aber
-21
geteilt durch4
gibt-5
mit einem Rest von-1
.Bei positiven Werten gibt es keinen Unterschied.
quelle
%
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 / 2
könnte-2
mit dem Rest sein-1
, oder-3
mit dem Rest1
musste die Implementierung nur dokumentieren, welche. C99 hat die Flexibilität entfernt, so ist es jetzt-5 / 2
immer-2
.-21
mod4
ist3
? Warum ist die Berechnung-21 + 4 x 6
?-21 + 4 x 6
zwischen 0 und 3 liegt.In C
%
ist der Rest 1 .C definiert nicht "mod", wie die in der euklidischen Division oder einem anderen Modulo verwendete Ganzzahlmodulfunktion . "Euklidischer Mod" unterscheidet sich von Cs
a%b
Betrieb, wenn era
negativ ist.Modulo als euklidische Division
Kandidat Modulo-Code:
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: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 Obigemodulo_Euclidean()
wird auch mit diesem alternativen Rest der alten Schule funktionieren.quelle
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:
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.
quelle
In C und C ++ und vielen Sprachen
%
ist der Rest NICHT der Moduloperator.Zum Beispiel ist in der Operation
-21 / 4
der ganzzahlige Teil-5
und der dezimale Teil-.25
. Der Rest ist der Bruchteil des Divisors, also unser Rest-1
. JavaScript verwendet den Restoperator und bestätigt diesDer 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.
quelle
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.
quelle
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?a%b
unda modulo b
haben die gleiche Bedeutung, wenn siea,b
positiv 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.