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.
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.
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.
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
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