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"?
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"?
Antworten:
Es gibt einen Unterschied zwischen Modul und Rest. Beispielsweise:
-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.
%
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 Rest 1
musste die Implementierung nur dokumentieren, welche. C99 hat die Flexibilität entfernt, so ist es jetzt -5 / 2
immer -2
.
-21
mod 4
ist 3
? Warum ist die Berechnung -21 + 4 x 6
?
-21 + 4 x 6
zwischen 0 und 3 liegt.
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 6Die Operanden des
%
Operators müssen vom Typ Integer sein. C11dr §6.5.5 2Das 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%b
Betrieb, wenn er a
negativ 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 vonx/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.
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 / 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 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.
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
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
und a modulo b
haben die gleiche Bedeutung, wenn sie a,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.