Heim >Backend-Entwicklung >C++ >Warum sind die Funktionen „sin()' und „cos()' von C/C für bekannte Winkel ungenau?

Warum sind die Funktionen „sin()' und „cos()' von C/C für bekannte Winkel ungenau?

Patricia Arquette
Patricia ArquetteOriginal
2024-12-05 14:26:10501Durchsuche

Why Are C/C  's `sin()` and `cos()` Functions Inaccurate for Familiar Angles?

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:

  • sin von 0,0547
  • cos von 0,99

Die erhaltenen Werte weichen jedoch häufig von diesen Erwartungen ab:

  • Sünde von 3.5897934739308216e-009
  • cos von -1,00000

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!

Stellungnahme:
Der Inhalt dieses Artikels wird freiwillig von Internetnutzern beigesteuert und das Urheberrecht liegt beim ursprünglichen Autor. Diese Website übernimmt keine entsprechende rechtliche Verantwortung. Wenn Sie Inhalte finden, bei denen der Verdacht eines Plagiats oder einer Rechtsverletzung besteht, wenden Sie sich bitte an admin@php.cn