ZurückZum InhaltVorwärts 

Mathematik

Ein Teil der Standardbibliothek widmet sich den mathematischen Funktionen. Hier kann man neben trigonometrischen Funktionen auch logarithmische und Rundungsfunktionen finden. So wichtig diese Funktionen für Algorithmen sind, so bieten Sie doch programmtechnisch nicht viel Neues. Wir werden uns daher auf eine kurze Beispiele beschränken.

Bild 8-1: Sinusrechnung mit Radiant und Grad

Die trigonometrischen Funktionen sind darin wohl die bekanntesten. Zwei kurze Beispiele sollen die Verwendung zeigen.

Die trigonometrischen Funktionen erwarten einen Winkel als Parameter. Der Winkel wird als Radiant ausgedückt. Ein Radiant ist ein Bogenstück auf dem Einheitskreis, der den Radius eins hat. Ein Vollkreis mit 360 Grad entspricht dabei 2 PI.

Im Beispiel wird eine eigene Funktion definiert, die als Parameter eine Gradangabe erwartet und ihrerseits die C-Bibliotheksfunktion aufruft, die den Radianten benötigt.

Bild 8-2: Cosinus-Berechnung mit Radiant und Grad

Die Umrechnung von Grad zu Radiant geschieht mit einem Multiplkationsfaktor von 2*PI / 360 (oder PI /180). In der umgekehrten Richtung von Radiant nach Grad ist der Faktor umgedreht. Hier multiplizieren wir mit 180 / PI.

Radianten oder Winkel im Bogenmaß werden in vielen mathematischen und technischen Formeln benötigt. Sie sind damit universeller einsetzbar, als Gradangaben.

Die folgenden trigonometrischen Funktionen sind im Standard definiert:

#include <math.h>
double acos(double x);
double asin (double x);
double atan (double x);
double atan2 (double y, double x);
double cos (doubel x);
double sin (double x);
double tan (double x);

Die Funktionen, die mit einem "a" beginnen sind die inversen trigonometrischen Funktionen.

Bild 8-3: Inverse trigonometrische Funktion

Die inversen Funktionen ermitteln aus einem Ergebnis der zugehörigen trigonometrischen Funktion den verwendeten Winkel. Einen Sonderfall stellt die Funktion atan2() dar. Die beiden Parameter geben ein Verhältnis an. Der Arcustangens wird vom Ergebnis der Divsion y/x gebildet.

Die hyperbolischen Funktionen

#include <math.h>
double sinh (double x);
double cosh (double x);
double tanh (double x);

Die exponentiellen und logarithmischen Funktionen

double exp (double x);
double frexp (double wert, int *expo);
double ldexp (double x, int exp);
double log (double x);
double log10 (double x);
double modf (double wert, double *izeig);
double pow (double x, double y);
double sqrt (double x);

Für die pow()-Funktion soll ein Beispiel die Verwendung zeigen. In der Musik werden in einer Oktave zwölf Halbtöne benötigt. Jeder Halbton unterscheidet sich vom anderen durch einen konstanten Multiplikationsfaktor. Will man nun den Faktor ermitteln, benötigt man die zwölfte Wurzel aus zwei. Die zwei ist dabei die Verdopplung der Frequenz eines Tones von Oktave zu Oktave und die zwölfte Wurzel daraus ist die Umkehrung der zwölffache Multiplikation mit dem Faktor.

Bild 8-4: Anwendung der pow()-Funktion

Die Potenzfunktion pow() erwartet den zu potenzierenden Wert als ersten Parameter (hier: die zwei) und die gewünschte Potenz als zweiten. In unserem Fall ist die Potenz ein Bruch mit einem Wert kleiner eins, was zur Wurzelbildung führt. Die zwölfte Wurzel erhalten wir bei einer Potenz von 1/12. Die Division wird sinnvollerweise mit double durchgeführt.

Im Beispiel wird eine Tabelle bestehend aus 13 Frequenzen aufgebaut. Mit Hilfe von Tastatureingaben und einer Fallunterscheidung kann man nun eine der Frequenzen auswählen. Die speziellen DOS-Funktion sound() und nosound() schalten den Tongenerator mit einer gegebenen Frequenz ein und aus. Jeder Ton hat eine konstante Länge von 200 Millisekunden und die minimale Pause zwischen zwei Tönen ist 100 Millisekunden.

Zerlegen einer Fließkommazahl

Mit der Funktion frexp() kann man eine Fließkommzahl in ihre beiden Bestandteile zerlegen. Jede Fließkommazahl besteht aus einer normalierten Mantisse und einem Exponenten zur Bais 2. Die Normalisierung besat, daß die Mantisse nur Werte zwischen 0,5 und eins annehmen kann. Dabei ist 0,5 eingeschlossen und eins nicht.

Bild 8-5: Zerlegen einer Fließkommazahl

Obwohl noch eine ganze Reihe an Funktionen in dieser Kategorie enthalten sind, soll damit die Darstellung abgebrochen werden. Diejenigen, die diese mathematischen Funktionen verwenden, sind sicher ohne Schwierigkeiten bereit, die Aufrufe der einzelnen Funktionen nachzuvollziehen. Schließlich soll das Hauptaugenmerk im Buch auf den Problemen im Umgang mit der Sprache C liegen und weniger auf mathematischen Einzelheiten. Obwohl eine Darstellung der mathematischen Funktionen an hand funktionierender Programme sicher einen erheblichen Reiz hätte.

Rundungen und verschiedenen Funktionen

#include <math.h>
double ceil (doubel x);
double floor (double x);
double fabs (double x);
double fmod (double x, double y);

Die Funktionen zur Rundung können aufrunden (ceil()) und abrunden (floor()). Weiter ermittelt fabs() den Absolutbetrag einer double-Zahl. Die Rundungsfunktionen ermitteln die jeweils nächste ganze Zahl.

Bild 8-6: Absolutbetrag und Rundung mit double

Weiterentwicklung der mathematischen Bibliothek

Alle Funktionen, die in der Informationsdatei math.h erwähnt werden, können in Zukunft auch in zwei weiteren Versionen zur Bearbeitung von float- und long double- Werten implementiert werden. Die Funktionen erhalten dazu einen zusätzlichen Buchstaben "f" oder "l" am Ende.

Mathematische Funktionen der "stdlib.h"

#include <stdlib.h>
int abs (int j);
int labs (long int j);
div_t div (int numerand, int denominator);
ldiv_t ldiv (long numerand, long teiler);

Betrachten wir zuerst die Funktionen zur Gewinnung eines Absolutwertes von int- und long-Zahlen div() und l_div().

Bild 8-7: Absolutwert von int- und long-Zahlen

Die beiden Funktionen zur Ganzzahldiviosion teilen den Dividenden durch den Divisor und liefern in einer Struktur die beiden Ergebniswerte für Quotient (quot) und Divisionsrest (rem für remainder) zurück.

Die Funktionen bearbeiten entweder int- oder long int- Variable.

Bild 8-8: Ganzzahldivision für int und long


Zum Inhalt