Bei Anwendung eines Winkels von 180 Grad auf C/Cs cos () und sin()-Funktionen kann es zu einem falschen Ergebnis kommen. Dies könnte überraschend sein, da wir von folgenden Ergebnissen ausgehen:
Die tatsächlichen Ergebnisse weichen jedoch häufig ab:
Diese Diskrepanz ergibt sich aus der Tatsache, dass cos(a), sin(a) und tan(a) in C/C funktionieren Erwarten Sie als Argument Bogenmaß, nicht Grad. Die Umrechnung von 180 Grad in Bogenmaß kann manchmal zu einer Annäherung führen.
Selbst bei korrekter Bogenmaßberechnung können die Ergebnisse aufgrund der endlichen Präzision von double und einer möglichen Fehldarstellung von PI dennoch abweichen.
Um dieses Problem zu beheben, reduzieren Sie am besten das Argument in Grad, bevor Sie die trigonometrische Funktion aufrufen. Indem wir den Winkel auf -45° bis 45° begrenzen, stellen wir die Genauigkeit des Ergebnisses sicher.
Betrachten Sie beispielsweise den folgenden Code, der sin() in Grad mithilfe der Argumentreduktion berechnet:
#include <math.h> #include <stdio.h> static double d2r(double d) { return (d / 180.0) * ((double) M_PI); } double sind(double x) { if (!isfinite(x)) { return sin(x); } if (x < 0.0) { return -sind(-x); } int quo; double x90 = remquo(fabs(x), 90.0, &quo); switch (quo % 4) { case 0: // Use * 1.0 to avoid -0.0 return sin(d2r(x90)* 1.0); case 1: return cos(d2r(x90)); case 2: return sin(d2r(-x90) * 1.0); case 3: return -cos(d2r(x90)); } return 0.0; } int main(void) { int i; for (i = -360; i <= 360; i += 15) { printf("sin() of %.1f degrees is % .*e\n", 1.0 * i, DBL_DECIMAL_DIG - 1, sin(d2r(i))); printf("sind() of %.1f degrees is % .*e\n", 1.0 * i, DBL_DECIMAL_DIG - 1, sind(i)); } return 0; }
Dieser Code generiert ein genaueres Ergebnis als der ursprüngliche Ansatz, insbesondere für Werte in mehreren Winkeln, da er vor dem Aufruf der trigonometrischen Funktion eine Argumentreduzierung durchführt.
Das obige ist der detaillierte Inhalt vonWarum erzeugen die Funktionen cos() und sin() von C/C unerwartete Ergebnisse für gemeinsame Winkel wie 180 Grad?. Für weitere Informationen folgen Sie bitte anderen verwandten Artikeln auf der PHP chinesischen Website!