Mathematische Funktionen
Willemers Informatik-Ecke
Bei vielen, vor allem älteren Programmiersprachen gehörten die mathematischen Funktionen zum Sprachumfang. Die Sprache C wurde ursprünglich zur systemnahen Programmierung entwickelt. Dort sind mathematische Fähigkeiten weniger gefragt. Darum wurden die mathematischen Funktionen in die Bibliotheken ausgelagert. Das macht diejenigen Programme schlanker, die keine mathematischen Funktionen benötigen.

Die mathematische Standardbibliothek

math.h

Um die Funktionen der mathematischen Bibliotheken verwenden zu können, muss zu Anfang des Programms die Datei math.h eingebunden werden:

#include <math.h>

Trigonometrische Funktionen

Die Prototypen der Winkelfunktionen sind in Tabelle (tabwinkelfkt) zusammengestellt.

(tabwinkelfkt) [Trigonometrische Funktionen]
Deklaration Funktion
double acos(double); Arcus Cosinus
double asin(double); Arcus Sinus
double atan(double); Arcus Tangens
double atan2(double, double); Arcus Tangens zweier Variablen
double cos(double); Cosinus
double cosh(double); Cosinus Hyperbolicus
double sin(double); Sinus
double sinh(double); Sinus Hyperbolicus
double tan(double); Tangens
double tanh(double); Tangens Hyperbolicus

Bogenmaß

Alle Parameter werden in Bogenmaß übergeben. Wird das Gradmaß benötigt, müssen Sie es selbst umrechnen. Zum Glück ist das nicht schwer. Die Umrechnung vom Gradmaß α ins Bogenmaß x erfolgt nach der Formel:

x = α/180 · π

Damit sich der Compiler daran nicht verschluckt, sollten Sie es vielleicht auf folgende Weise formulieren:

bogenmass = gradmass/180*3.1415926535;

Die Umrechnung vom Bogenmaß x ins Gradmaß α ist dementsprechend:

α = (x · 180)/π

Das sieht im Programm dann so aus:

gradmass = bogenmass*180/3.1415926535;

Exponenten, Wurzeln und Logarithmen

exp()

Die Funktion exp(a) liefert den Wert von ea, wobei e die eulersche Zahl ist:

double exp(double a);

Soll ein beliebiger Exponent ab berechnet werden, verwendet man die Funktion pow():

double pow(double a, double b);

Wurzel

Die Funktion sqrt() ermittelt die Quadratwurzel eines Fließkommawertes. Die Abkürzung steht für den englischen Ausdruck sqare root.

double sqrt(double a);

Logarithmus

Die Funktion log() berechnet den natürlichen Logarithmus von a, also den Logarithmus der Zahl a zur Basis der eulerschen Zahl e:

double log(double a);

Zur Berechnung des Logarithmus zur Basis 10 gibt es eine eigene Funktion namens log10():

double log10(double a);

frexp() und ldexp()

Die Funktion frexp() zerlegt den Fließkommawert a derart, dass a = f · 2b gilt. Dabei ist f der Rückgabewert der Funktion, der zwischen 1/2 und 1 liegt.

double frexp(double a, int *b);

Der Wert von b wird der aufrufenden Parametervariablen per Adresse übergeben. Ein Aufruf der Funktion sieht also etwa so aus:

int b;
f = frexp(a, &b);

Die Funktion ldexp() ist die Umkehrfunktion zu frexp():

double ldexp(double ai, int b);

Sonstige Funktionen

Absolutbetrag

Die Betragsfunktion liefert den Wert des übergebenen Wertes, wenn er positiv ist, und multipliziert ihn mit -1, wenn er negativ ist. Damit liefert die Funktion also immer einen positiven Wert. Es gibt eine Funktion namens abs() für ganzzahlige Werte aus der Bibliothek stdlib und eine Funktion fabs() für Fließkommazahlen aus der math-Bibliothek.

#include <stdlib.h>
int abs(int j);
long labs(long k);

Die Funktion fabs() unterscheidet sich im Typ des Parameters und des Rückgabewertes von abs() und darin, dass die Datei math.h eingebunden werden muss.

#include <math.h>
double fabs(double a);

Modulo

Die Modulo-Berechnung erfolgt bei ganzzahligen Werten durch den Operator %. Sie ermittelt den Rest bei einer ganzzahligen Division. Diese Berechnung wird bei Fließkommawerten durch die Funktion fmod() durchgeführt:

double fmod(double a, double b);

Der Fließkommawert a wird durch die Funktion modf() in seinen ganzzahligen Anteil und die Nachkommastellen aufgespalten. Der ganzzahlige Anteil liegt im Parameter b, und die Nachkommastellen sind der Rückgabewert der Funktion:

double modf(double a, int* b);

Die Funktion ceil() liefert die nächsthöhere ganze Zahl zurück:

double ceil(double);

Die Funktion floor() liefert die nächstniedrige ganze Zahl zurück:

double floor(double);

Komplexe Zahlen

Komplexe Zahlen bestehen aus einem Real- und einem Imaginärteil. Eine Klasse muss beide Bestandteile enthalten, um komplexe Zahlen abbilden zu können. Die Standardbibliothek von C++ bietet eine Template-Klasse an, die mit den drei verschiedenen Fließkommatypen float, double und long double verwendet wird. Der Fließkommatyp wird in spitzen Klammern hinter den Template-Namen complex gesetzt:

#include <complex>
using namespace std;

complex<double> meinKomplex(-1, 3);

Die komplexe Zahl meinKomplex wurde durch den Konstruktor mit dem Realteil -1 und dem Imaginärteil 3 initialisiert. Die Elementfunktion real() liefert den Realteil und die Funktion imag() den Imaginärteil der komplexen Zahl.

Operatoren

Für komplexe Zahlen sind die typischen mathematischen Operatoren wie +, -, / und * definiert. Auch die Operatoren für Gleichheit oder Ungleichheit können verwendet werden. Allerdings ist das Kleiner-Verhältnis für komplexe Zahlen nicht definiert, natürlich auch nicht in C++. [Spezielle komplexe Funktionen]
Funktion Wirkung
norm() Liefert das Quadrat des Betrages
abs() Betrag, die Wurzel aus norm()
conj() Der konjugierte Wert
arg() Winkel in Polarkoordinaten
polar() Komplexe Zahl zu Polarkoordinaten