Kapitel 3: Einfache Operatoren / 3.3 Arithmetische Operatoren / 3.3.2 Der Rest-Operator

Der Rest-Operator (a % b, engl.: Remainder Operator) führt eine Division mit Rest aus und gibt diesen Rest dann zurück. Das funktioniert im wesentlichen wie früher in der Grundschule: Es wird geprüft, wie oft b in a hineinpasst, und dann wird zurückgegeben, wieviel von a zum Schluss noch übrigbleibt.

Nehmen wir 13 % 5 als Beispiel. Die 5 passt zwei mal in die 13, zwei mal 5 ist 10, der Rest beträgt 3. Also 13 = 5 • 2 + 3 und damit ist 13 % 5 = 3.

Die Aufteilung von 13 durch die Gleichung 13 = 5 • 2 + 3 lässt sich auch allgemein schreiben:

a = b • Faktor + Rest

wobei Faktor die betragsmäßig größte ganze Zahl darstellt, die diese Gleichung so lösen kann, dass a und Rest dasselbe Vorzeichen haben. Hierbei stellt Rest das Ergebnis der Rest-Operation dar.

Diese allgemeine Beschreibung ist nötig, um den Rest Operator nicht nur auf ganze Zahlen größer Null anwenden zu können, sondern auch auf negative und Fließkommazahlen.

Kurz zur Erklärung von betragsmäßig größte Zahl: Der Betrag einer Zahl streicht ein negatives Vorzeichen weg, wenn es vorhanden ist: Der Betrag von 5 ist 5 und der Betrag von -5 ist auch 5. Durch diesen „Trick“ ist -3 betragsmäßig größer als -2, obwohl -3 als Zahl natürlich kleiner ist als -2.

Zur Berechnung des Rests von negativen Zahlen verwendet Swift also dieselbe allgemeine Formel, angenommen bei a % b ist a negativ:

-13 % 5 = -3  da eingesetzt in die Gleichung gilt: -13 = 5 • (-2) + (-3)

Was passiert, wenn bei a % b nun b negativ ist? Antwort: Es hat keinen Einfluss auf das Ergebnis. Wenn Sie an mathematischen Knobeleien interessiert sind, können Sie sich jetzt kurz überlegen, warum das so ist. Für alle anderen erkläre ich es jetzt:

Wenn b negativ ist, dann ändert sich in der Gleichung nur das Vorzeichen des Faktors, alles andere bleibt gleich, insbesondere bleibt auch der Rest, das Ergebnis des Rest-Operators gleich:

-13 % -5 = -3  da eingesetzt in die Gleichung gilt: -13 = (-5) • 2 + (-3)

In anderen (Programmier-)Sprachen heißt der Rest-Operator oft Modulo-Operator und wird ebenfalls durch das Prozent-Zeichen % dargestellt. Apple hat seinen %-Operator aber bewusst nicht so genannt, um das besondere Verhalten bei negativen Zahlen herauszustreichen. Dieses sei in Swift eher die Berechnung eines Rests als die eines Modulo.

Ob dem tatsächlich so ist, ist Geschmachssache. Tatsächlich stimmen praktisch alle Implementierungen des %-Operators miteinander überein, wenn es um die Berechnung positiver Zahlen geht. Werden die Zahlen negativ, beginnen die Programmiersprachen sich zu unterscheiden. Mathematisch korrekt sind hierbei die wenigsten, auch Swifts Implementierung entspricht nicht der mathematischen Konvention, die auch das Vorzeichen des zweiten Operanden mit in das Ergebnis einbezieht. Ob Apples Anzatz dafür nun intuitiv korrekt ist, müssen Sie selbst beurteilen.

Zur vollständigen Beschreibung fehlt nun noch die Berechnung von Fließkommazahlen, aber auch hier ändert sich an der dargestellten Gleichung nichts:

5,6 % 0,5 = 0,1 da eingesetzt in die Gleichung gilt: 5,6 = 0,5 • 11 + 0,1

Betrachten wir einige Sonderfälle: Was passiert, wenn bei a % b nun b größer ist als a? Nichts besonderes, der Faktor ist Null und die Gleichung wird wie bisher aufgelöst:

1 % 5 = 1 da eingesetzt in die Gleichung gilt: 1 = 5 • 0 + 1

Und wenn nun a oder b gleich Null sind? Wenn a gleich Null ist, wird gerechnet wie bisher:

0 % 5 = 0 da eingesetzt in die Gleichung gilt: 0 = 5 • 0 + 0

Ist aber b gleich Null, kommt es zu einer klassischen Runtime Exception: Division by zero, das Teilen durch Null ist mathematisch nicht erlaubt, das gilt für den Rest-Operator genauso wie für den Divisions-Operator (a / b).

Wenn man nicht gerade Zahlentheoretiker ist, beschränkt sich die mathematische Bedeutung des Rechnens mit Rest mehr oder weniger auf die bereits zu Anfang erwähnten Erfahrungen in der Grundschule und dient vor allem dazu, die Kinder auf das „richtige“ Dividieren mit Kommazahlen vorzubereiten.

In der Programmierung liegt die Sache anders: Des Rest-Operator ist eine sehr große Hilfe beim Aufteilen eines kontinuierlichen Zählers in Segmente. Und ich lehne mich mal aus dem Fenster und behaupte 90% aller Verwendungen des %-Operators dienen genau diesem Zweck.

Wenn eine Schleife von 1 bis 100 durchläuft und man jedes dritte Mal etwas tun möchte, prüft man ob die Schleifenvariable % 3 gleich Null ist. Dies und Varianten davon machen die Bedeutung des Rest-Operators aus.

Beitragsbild: Martinet noir Apus apus Common Swift von Sébastien Bertru in abgewandelter Form (CC BY-SA 2.0)

Kapitel 3.3.2: Der Rest-Operator

Schreibe einen Kommentar

Deine E-Mail-Adresse wird nicht veröffentlicht. Erforderliche Felder sind mit * markiert.