HOWTO · C++
Trigonometrische Funktionen in C++
Dieser Artikel zeigt, wie Sie trigonometrische Funktionen von STL in C++ verwenden
Auf dieser Seite
C++ stellt Sinus, Kosinus, Tangens, inverse trigonometrische und hyperbolische Funktionen im Standardheader <cmath> bereit. Die gewöhnlichen trigonometrischen Funktionen erwarten Winkel im Bogenmaß und liefern Gleitkommawerte zurück. Verwenden Sie die mit std:: qualifizierten Namen, damit klar ist, dass sich der Code auf die Standardbibliothek bezieht.
std::sin, std::cos und std::tan für Winkel im Bogenmaß verwenden
Rufen Sie std::sin(angle), std::cos(angle) und std::tan(angle) auf, um Sinus, Kosinus und Tangens eines Winkels zu berechnen. Binden Sie <cmath> ein, damit ihre Deklarationen verfügbar sind. Für diese Funktionen gibt es Überladungen für Gleitkommatypen; der Rückgabewert hat den jeweils entsprechenden Gleitkommatyp. Ganzzahlige Argumente werden in eine Gleitkommaüberladung konvertiert.
Führen Sie dieses Beispiel aus:
Der Code und die angezeigten Bezeichnungen oder Ausgaben in diesem Abschnitt bleiben auf Englisch.
#include <cmath>
#include <iomanip>
#include <iostream>
int main() {
const double angle = 1.0; // radians
std::cout << std::fixed << std::setprecision(6)
<< "sin(" << angle << ") = " << std::sin(angle) << '\n'
<< "cos(" << angle << ") = " << std::cos(angle) << '\n'
<< "tan(" << angle << ") = " << std::tan(angle) << '\n';
}
Die bei diesem Lauf beobachtete Ausgabe lautet:
sin(1.000000) = 0.841471
cos(1.000000) = 0.540302
tan(1.000000) = 1.557408
Das Argument entspricht einem Radiant. std::fixed und std::setprecision(6) formatieren jeden Rückgabewert mit sechs Nachkommastellen.
Mit inversen trigonometrischen Funktionen Winkel zurückgewinnen
Verwenden Sie std::asin(x), um aus einem Sinuswert einen Winkel zu bestimmen, std::acos(x) für einen Kosinuswert und std::atan(x) für einen Tangenswert. Die Ergebnisse sind im Bogenmaß angegeben. asin akzeptiert Werte von -1 bis einschließlich 1 und liefert einen Winkel in [-π/2, π/2]; acos hat denselben Eingabebereich und liefert einen Winkel in [0, π]. atan akzeptiert jeden endlichen reellen Wert und liefert einen Winkel in (-π/2, π/2).
Wenn eine Richtung durch beide Koordinaten beschrieben wird, verwenden Sie std::atan2(y, x). Anders als atan(y / x) wertet die Funktion die Vorzeichen beider Argumente aus, um den Quadranten zu bestimmen; die Koordinaten müssen dafür nicht zuerst dividiert werden. Das Ergebnis ist ein Winkel im Bogenmaß, üblicherweise im Bereich [-π, π]. Welche der beiden Randdarstellungen exakt zurückgegeben wird, kann von einer vorzeichenbehafteten Null als Eingabe abhängen.
Inverse Funktionen liefern einen Hauptwinkel, nicht jeden Winkel, der den ursprünglichen Wert ergeben könnte. Beispielsweise haben mehrere Winkel denselben Sinuswert. Daher kann asin allein den ursprünglichen Winkel außerhalb seines Hauptwertebereichs nicht wiederherstellen. Berücksichtigen Sie bei der Wahl des endgültigen Winkels die Geometrie und die Quadranteninformationen Ihres Problems.
Hyperbolische Funktionen für hyperbolische Werte verwenden
Die Funktionen std::sinh, std::cosh und std::tanh berechnen den hyperbolischen Sinus, Kosinus und Tangens. Sie sind über Exponentialfunktionen definiert und kein Ersatz für std::sin, std::cos und std::tan: Ihre Eingaben sind reelle Werte und keine Winkel auf einem Kreis, außerdem unterscheiden sich ihre Wertebereiche. So gilt etwa cosh(x) >= 1, während der gewöhnliche Kosinus zwischen -1 und 1 liegt.
Die inversen hyperbolischen Funktionen heißen std::asinh, std::acosh und std::atanh. Ihre Definitionsbereiche für reelle Werte unterscheiden sich: asinh akzeptiert jeden reellen Eingabewert, für acosh muss die Eingabe mindestens 1 betragen und atanh erfordert einen Wert strikt zwischen -1 und 1. Verwenden Sie diese Funktionen für hyperbolische Zusammenhänge, statt den Namen einer gewöhnlichen trigonometrischen Funktion einfach ein a voranzustellen.
Winkelmaße, Definitionsbereiche und Gleitkommaergebnisse berücksichtigen
Die trigonometrischen Funktionen aus C++ <cmath> erwarten Winkel im Bogenmaß. Rechnen Sie Grad mit radians = degrees * π / 180 um; beispielsweise entsprechen 90 Grad π/2 Radiant. Um π in portablem C++ zu erhalten, verwenden Sie std::acos(-1.0) oder definieren Sie die benötigte Konstante selbst, denn M_PI ist kein standardisierter C++-Name.
Die Eingaben inverser Funktionen müssen in ihren jeweiligen reellen Definitionsbereichen liegen. Prüfen oder begrenzen Sie einen Wert nur, wenn dies der Mathematik Ihrer Anwendung entspricht: Das Begrenzen eines Werts, der nur knapp außerhalb von [-1, 1] liegt, kann angesammelte Rundungsfehler ausgleichen. Es sollte aber keine tatsächlich außerhalb des Bereichs liegende Eingabe verbergen. Wie ein Definitionsbereichsfehler behandelt wird, hängt vom Fehlerverhalten der C++-Mathematikbibliothek und der jeweiligen Implementierung ab; es handelt sich nicht um undefiniertes Verhalten. Wenn Ihre Anwendung ein gültiges Ergebnis von einem Mathematikfehler unterscheiden muss, prüfen Sie math_errhandling und die von der Implementierung unterstützten Fehlerindikatoren.
In der Nähe ungerader Vielfacher von π/2 nimmt std::tan sehr große Werte an. An diesen mathematischen Polstellen gibt es keinen endlichen reellen Tangenswert. Eine Gleitkommanäherung an eine Polstelle kann einen großen endlichen Wert liefern, statt ein hilfreiches Fehlersignal auszugeben. Wenn das Verhalten nahe einer Polstelle relevant ist, prüfen Sie die Eingabe daher passend zu den Anforderungen und Toleranzen Ihrer Anwendung.
Gleitkommaberechnungen sind Näherungen. Werte wie std::sin(std::acos(-1.0)) können nahe bei null liegen, ohne exakt null zu sein. Vergleichen Sie berechnete Werte mit einer für die Anwendung passenden Toleranz und nicht durch exakten Gleichheitsvergleich. Verwenden Sie für gewöhnliche Berechnungen double und wählen Sie einen breiteren Typ nur, wenn dessen Präzision und Unterstützung erforderlich sind. Bevorzugen Sie die Standardbibliothek gegenüber selbst geschriebenen Näherungsverfahren und speichern Sie einen berechneten Wert, wenn Sie ihn wiederverwenden.