Modulo

Dividieren wie in der Grundschule kann man auch mit einem Computer. Hierfür gibt es in vielen Sprachen den Modulo-Operator (oft wird das %-Zeichen verwendet, aber auch das Schlüsselwort 'mod').

Nehmen wir ein einfaches Beispiel: 17 dividiert durch 4 ergibt 4 Rest 1 oder besser (4 + 1/4).

Beispiel:

  Ergebnis = 17 / 4
  Rest     = 17 % 4

Modulo mit negativen Zahlen

Die Restbestimmung bei positiven Zahlen ist selbst für einen Grundschüler kein großes Unterfangen mehr. Ist der zu teilende Wert jedoch negativ, gehen die Probleme los. Nehmen wir an, wir möchten einen Winkel auf einen Wert zwischen 0 und unter 360 Grad normalisieren:

#include <stdio.h>
 
int main( void )
{
  int degree = 770;
  int normalized = degree % 360;
 
  printf( "Normalisierter Winkel: %d\n", normalized );
 
  return 0;
}

liefert

  Normalisierter Winkel: 50

Ändern wir die Zeile

  int degree = 770;

jedoch auf einen negativen Wert:

  int degree = -770;

erhalten wir als Ausgabe:

  Normalisierter Winkel: -50

Das ist nicht das gewünschte Ergebnis, dennoch sind wir einen Schritt weiter: bei degree = -770 erhalten wir nämlich den Wert -50.

Statt uns nun 50 Grad nach rechts zu bewegen, wollen wir im normierten Fall uns 310 Grad nach links bewegen, um an die gleiche Stelle zu gelangen. Wir müssen also lediglich nochmal den Wert durch den wir geteilt haben aufaddieren. In unserem Fall also 360 Grad:

#include <stdio.h>
 
int main( void )
{
  int degree = -770;
  int normalized = degree % 360;
 
  if( normalized < 0 )
	normalized += 360;
 
  printf( "Normalisierter Winkel: %d\n", normalized );
 
  return 0;
}

C/C++ benutzt hier wie einige andere Programmiersprachen eine symetrische Variante:

   770 / 360 =  2
   770 % 360 =  50 
  =>  770 = ( 2) * 360 + ( 50)

  -770 / 360 = -2
  -770 % 360 = -50
  => -770 = (-2) * 360 + (-50)

Modulo mit Fließkommazahlen

Möchte man einen Modulo-Wert mit Fließkommazahlen (float, double) ausrechnen, so kann der %-Operator nicht verwendet werden. In C verwendet man hierfür die Funktion modf(), die in der Standard-C-Lib mitgeliefert wird.