Heim >Backend-Entwicklung >C++ >Warum sind die Funktionen „sin()' und „cos()' von C/C für bekannte Winkel ungenau?
Unerwartete Ergebnisse von sin und cos für vertraute Winkel
Bei Verwendung der sin()- und cos()-Funktionen von C/C mit an Bei einem Winkel von 180 Grad kann es zu unerwarteten Ergebnissen kommen. Die erwarteten Werte sind:
Die erhaltenen Werte weichen jedoch häufig von diesen Erwartungen ab:
Erklärung
Die Funktionen sin() und cos() von C/C funktionieren mit Bogenmaß als Eingabeparameter, nicht Grad. Obwohl DegreesToRadians() versucht, Grad in Bogenmaß umzuwandeln, können Rundungsungenauigkeiten und eine begrenzte double()-Genauigkeit zu Abweichungen in den Ergebnissen führen. Darüber hinaus kann die Maschinenkonstante M_PI, eine Schätzung der mathematischen Konstante π, zu diesen Abweichungen beitragen.
Lösung
Um diese Ungenauigkeiten zu beheben, wird eine Durchführung empfohlen Winkelverkleinerung in Grad vor dem Aufruf der trigonometrischen Funktionen. Dazu muss der Winkel vor dem Aufruf von sin() auf einen Bereich von -45° bis 45° reduziert werden. Dadurch wird sichergestellt, dass große Werte von N in Berechnungen wie sin(90,0*N) genaue Ergebnisse von -1,0, 0,0 und 1,0 liefern.
Ein Beispielcode, der diesen Ansatz demonstriert, wird bereitgestellt:
#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: return sin(d2r(x90)); case 1: return cos(d2r(x90)); case 2: return sin(d2r(-x90)); case 3: return -cos(d2r(x90)); } return 0.0; }
Dieser aktualisierte Code liefert genauere Ergebnisse für verschiedene Winkel, wie die Ausgabe zeigt:
sin() of -90.0 degrees is 2.4492935982947064e-16 sind() of -90.0 degrees is -0.0000000000000000e+00 sin() of -120.0 degrees is -7.0710678118654752e-01 sind() of -120.0 degrees is -7.0710678118654746e-01 sin() of -135.0 degrees is -0.70710678118654757 sind() of -135.0 degrees is -0.70710678118654762 sin() of -150.0 degrees is -2.4492935982947064e-16 sind() of -150.0 degrees is -0.0000000000000000e+00 sin() of -180.0 degrees is 2.4492935982947064e-16 sind() of -180.0 degrees is -0.0000000000000000e+00
Das obige ist der detaillierte Inhalt vonWarum sind die Funktionen „sin()' und „cos()' von C/C für bekannte Winkel ungenau?. Für weitere Informationen folgen Sie bitte anderen verwandten Artikeln auf der PHP chinesischen Website!