Die Klasse "Math"

<-- zurck zur Startseite | <- eine Seite vor | eine Seite weiter ->

  1. arithmetische Methoden
  2. Rundungen
  3. trigonometrische Methoden
  4. Minimum, Maximum, Betrag
  5. Zufallszahlen
  6. Übung
  7. Lösung

1. arithmetische Methoden

Mit dem Wissen über Methoden, das wir bis jetzt haben, können wir uns die Methoden der Klasse Math ansehen, die uns mehr als die Grundrechenarten bietet. Mit ihr können wir potenzieren, Wurzel ziehen, Exponentialfuktionen sowie Logarithmen berechnen. Auch trigonometrische Methoden wie Sinus, Kosinus und Tangens bleiben nicht außen vor. Darber hinaus bietet sie uns brauchbare Konstanten, z.B. die Kreiskonstante "pi".

Zuerst die Funktion zum Potenzieren:

public static double pow(double a, double b)

In der Informatik hat es sich eingebürgert, Methoden mit ihrer Syntax vorzustellen. Ergo findet man solche Erklärungen auch in der Java-Doku, weswegen ich es jetzt permanent auch so mache. Auch wenn es anfangs verwirrend ist, ich gebe ja am Anfang zum allem ein Beispiel. ;)
Diese Methode erhält als erstes Argument die Basis und als zweites den Exponenten. Wollen wir beispielsweise 28 berechnen, so schreiben wir (Rckgabewert ist "double"):

double ergebnis = Math.pow(2, 8);

Da wir uns nun die Methoden aus einer anderen Klasse (aus der Java- Bibliothek holen), müssen wir den Klassennamen durch Punkt getrennt vor den Funktionsnamen setzen, damit der Compiler weiß, in welcher Klasse er die Methode suchen soll. Dass wir an eine Methode, die "double"-Werte erwartet, zwei "int"-Werte übergeben, stört gar nicht, denn wir wissen ja, dass er Compiler erweiternde Typkonvertierungen von allein durchführt. Kritisch wäre es nur, wenn wir an eine Methode, die "int"-Werte erwartet, eine Kommazahl übergeben wollen (siehe Kap. 8).
Entsprechend gibt es folgende Methoden zum Ziehen einer Quadratwurzel, zur Berechnung der Exponentialfunkion zur Basis e und zur Berechnung des natürlichen Logarithmus:

public static double sqrt(double a)
public static double exp(double a)
public static double log(double a)

Beispiel zum Wurzelziehen (Quadratwurzel aus 2):

double ergebnis = Math.sqrt(2);

Die anderen Methoden kann man mal selbst ausprobieren. Ein Problem, dass wir aber vorerst übergehen werden: einige dieser Methoden erzeugen potentiell Fehler (z.B. kann aus einer negativen Zahl keine Wurzel gezogen werden), und zwar vom Typ ArithmeticException. Diese sog. Ausnahmen kann man in Java recht schön abfangen, aber die Fehlerbehandlung ist erst Gegenstand eines späteren Kapitels. Trotzdem jetzt schon der Hinweis, dass man bei diesen Methoden acht gibt!

nach oben

2. Rundungen

Besonders wichtig sind natürlich Methoden zum Auf- oder Abrunden von Kommazahlen. Hier bietet Java, wie viele andere Sprachen auch, folgende:

public static double ceil(double a)
public static double floor(double a)
public static int round(float a)
public static long round(double a)

Während ceil eine Zahl, die als "double" übergeben wird, aufrundet und das Ergebnis als "double" (nicht Integer, wie man meinen könnte) zurückgiebt, macht floor genau das Gegenteil: die übergebene Zahl wird in jedem Fall abgerundet! Die Methode round hingegen rundet, wie man es aus der Schule gewohnt ist, nämlich zur Ganzzahl, die am nächsten liegt. Zu beachten ist, dass sie ein "int" zurückliefert, wenn man ihr eine "float"-Zahl übergibt, und ein "long", wenn das übergebene Argument vom Typ "double" ist.

public class Mathe1 {

  public static void main(String[] args) {
    double test = 45.36788;
    double aufrunden = Math.ceil(test);
    double abrunden = Math.floor(test);
    int runden = Math.round((float)test);
    System.out.println("Zahl " + test + " wurde zu " + aufrunden + " aufgerundet, zu " +
            abrunden + " abgerundet und zu " + runden + " normal gerundet"); 
  }

}

Will man auf eine bestimmte Anzahl von Kommastellen runden, kann man sich mit einem Trick behelfen: Man multipliziert den Wert, der gerundet werden soll, mit 10 für 1 Nachkommastelle, mit 100 für 2 Nachkommastellen, mit 1000 für 3 Nachkommastellen usw. Dann verwendet man die gewünschte Funktion zum Runden und teilt danach wieder durch 10, 100, 1000 etc. Hier wird auf 1 Nachkommastelle aufgerundet:

double test = 45.36788;
double aufrunden = Math.ceil(test*10) / 10;

nach oben

3. trigonometrische Methoden

Jeder Schüler lernt früher oder später die trigonometrischen Winkelfunktionen kennen. Da dürfen sie natürlich auch in Java nicht fehlen!

public static double sin(double x)
public static double cos(double x)
public static double tan(double x)
public static double asin(double x)
public static double acos(double x)
public static double atan(double x)

Die ersten drei Methoden berechnen die normalen trigonometrischen Funktionen sinus, cosinus und tangens, die letzten drei die (seltenen) Arcus-Funktionen. Rckgabewert ist jeweils eine "double"-Kommazahl. Zu beachten ist, dass die Winkelwerte im Bogenmaß übergeben werden müssen! Beispiel:

public class Mathe2 {

  public static void main(String[] args) {
    double winkel = 1.29;
    System.out.println("Sinus: " + Math.sin(winkel));
    System.out.println("Cosinus: " + Math.cos(winkel));
    System.out.println("Tangens: " + Math.tan(winkel));
  }

}

nach oben

4. Minimum, Maximum, Betrag

Ferner gibt es Methoden, um den Betrag einer Zahl zu errechnen (d.h. das Vorzeichen wird eliminiert) und um zwei Zahlen zu vergleichen. Das besondere an diesen Methoden ist, dass sie mit "int", "long", "float" und "double" aufgerufen werden können und das Ergebnis je nachdem wieder "int", "long", "float" oder "double" ist:

public static int min(int a, int b)
public static long min(long a, long b)
public static float min(float a, float b)
public static double min(double a, double b)

public static int max(int a, int b)
public static long max(long a, long b)
public static float max(float a, float b)
public static double min(double a, double b)

public static int abs(int a, int b)
public static long abs(long a, long b)
public static float abs(float a, float b)
public static double abs(double a, double b)
Wärend die Funktion min von zwei übergebenen Zahlen die kleinere der beiden ermittelt und zurückgiebt, sucht die Funktion max die größere von beiden heraus. Die Funktion abs schließlich eliminiert das Vorzeichen und gibt den Betrag einer Zahl zurück, d.h. aus 3 wird 3, aus -2 wird 2. Beispiel:
public class Mathe3 {

  public static void main(String[] args) {
    int a = 767, b = 676;
    float c = 465.45f, d = 465.47f;
    int i = -2;
    System.out.println("Ergebnis der Funktion \"min\": " + Math.min(a, b));
    System.out.println("Ergebnis der Funktion \"max\": " + Math.max(c, d));
    System.out.println("Der Betrag von " + i + " ist " + Math.abs(i));
  }

}

nach oben

5. Zufallszahlen

Eine Zufallszahl zwischen 0,0 und 1,0 kann mit Hilfe der Funktion random erzeugt werden:

public static double random()

Der von dieser Funktion zurückgelieferte Wert ist logischerweise "double". Es gibt noch eine andere Möglichkeit, Zufallszahlen zu erzeugen, nämlich mit Hilfe der Klasse Random. Diese behandeln wir aber später. Da Zufallszahlen bei der Programmierung oft große Bedeutung haben, ein kleines Beispiel:

double zufallszahl = Math.random();

Die Klasse "Math" stellt uns zudem noch zwei wichtige Konstanten zur Verfügung: e und pi. Beide sind vom Typ "double":

System.out.println("Die eulersche Zahl e: " + Math.E);
System.out.println("Die Kreiszahl pi: " + Math.PI);

nach oben

6. Übung

Verwende, soweit es sinnvoll ist, Methoden und Konstanten der Klasse "Math"!

  1. Ziehe aus einer beliebigen (positiven) Zahl die Wurzel und potenziere anschließend sofort wieder mit 2. Stimmt das Ergebnis überein, und wenn nein, warum könnte es abweichen? Wie kann sichergestellt werden, dass die Zahl, von der die Wurzel gezogen wird, positiv ist?
  2. Schreibe eine Funktion, die den Radius eines Kreises und eine Höhenangabe als Argumente erhält und das Volumen (r2*pi*h) des Zylinders zurückliefert! Gib das Ergebnis auf 2 Nachkommastellen gerundet aus!

nach oben

7. Lösung

Aufgabe 1:

public class Mathe4 {

  public static void main(String[] args) {
     double zahl1 = 9;
     double zahl2 = Math.abs(zahl1);      // verhindert, dass von einer negativen Zahl die Wurzel genommen wird
     double ergebnis = Math.sqrt(zahl2);    
     System.out.print("Die Wurzel aus " + zahl1 + " ist " + ergebnis);
     double ergebnis2 = Math.pow(ergebnis, 2);
     System.out.print(", ins Quadrat genommen ergibt das wieder " + ergebnis2);
  }

}

Aufgabe 2:

public class Mathe5 {

  public static void main(String[] args) {
      double radius = Math.pow(3.45, 2);
      double hoehe = 4.67;
      double volumen = radius * Math.PI * hoehe;
      double volumen_rund = Math.round(volumen*100) / 100.0;
      System.out.println("geg: Hoehe = " + hoehe + "cm");
      System.out.println("     Radius = " + radius + "cm");
      System.out.println();
      System.out.println("ges: Volumen");
      System.out.println();
      System.out.println("Volumen = " + radius + "cm^2 * Pi * " + hoehe + "cm\n");
      System.out.println("Das Volumen des Zylinders betraegt " + volumen_rund + "cm^3");
  }

}

Die Berechnung des Volumens an sich ist trivial, interessant ist allerdings die Rundung: wir wollen genau zwei Nachkommastellen haben. Da die Methode "round" der Klasse "Math" ein Integer zurückliefert, wird durch 100.0 statt 100 geteilt, um dem Compiler gleich klar zu machen, dass wir hier in jedem Fall eine double-Zahl haben wollen. Übrigens sollte man mit "round" und nicht mit "ceil" oder "floor" runden, da hier nur eine mathematische Rundung Sinn macht.

nach oben