Unerwartete Ergebnisse für sin- und cos-Funktionen mit Gradeingabe
Bei Verwendung der C/C-Funktionen sin() und cos() für Winkel in Grad ausgedrückt, können sich aus der mathematischen Interpretation von Grad gegenüber Bogenmaß Abweichungen ergeben.
Ursache von Diskrepanz
Die sin()- und cos()-Funktionen von C/C sind so konzipiert, dass sie Winkel im Bogenmaß akzeptieren. Die anschließende Verwendung der Funktion DegreesToRadians() zum Konvertieren von Grad in Bogenmaß führt jedoch aufgrund der Rundung und der endlichen Genauigkeitsgrenzen des Double-Datentyps zu einer inhärenten Näherung. Darüber hinaus kann die Verwendung von M_PI zu geringfügigen Abweichungen von der mathematischen Definition von π führen.
Mathematische Interpretation
sin(0,0547) = 0,0547
cos(0,0547 ) = 0,9984
Ausgedrückt in Grad:
sin(0,0547) = sin(0,0547 × 180 / π) ≈ 0,0031
cos(0,0547) = cos(0,0547 × 180 / π) ≈ 0,9995
Lösung
Um diese Diskrepanz zu beheben, empfehlen wir, den Winkel in Grad zu reduzieren, bevor Sie die trigonometrischen Funktionen aufrufen. Diese Technik gewährleistet Präzision in einem Bereich von -45° bis 45°.
#define M_PIf (3.14159265358979323846) #include <stdio.h> double DegreesToRadians(double degrees) { return degrees * M_PIf / 180; } double sind(double x) { if (x < 0.0) { return -sind(-x); } int quo; double x90 = remquo(fabs(x), 90.0, &quo); switch (quo % 4) { case 0: return sin(DegreesToRadians(x90)); case 1: return cos(DegreesToRadians(x90)); case 2: return sin(DegreesToRadians(-x90)); case 3: return -cos(DegreesToRadians(x90)); } }
Beispielausgabe
Verwendung der verbesserten Funktion sind():
printf("sin() of 180.0 degrees: %f\n", sin(DegreesToRadians(180.0))); printf("sind() of 180.0 degrees: %f\n", sind(180.0));
Ausgabe
sin() of 180.0 degrees: -1.2246467991474805e-16 sind() of 180.0 degrees: -0.0000000000000000e+00
Diese Ausgabe zeigt genaue Ergebnisse für die Funktionen sin() und cos() mit Winkelangaben in Grad.
Das obige ist der detaillierte Inhalt vonWarum erzeugen die Funktionen „sin()' und „cos()' von C/C bei der Verwendung von Graden unerwartete Ergebnisse?. Für weitere Informationen folgen Sie bitte anderen verwandten Artikeln auf der PHP chinesischen Website!