Heim > Backend-Entwicklung > C++ > Hauptteil

Warum erzeugen die Funktionen cos() und sin() von C/C unerwartete Ergebnisse für gemeinsame Winkel wie 180 Grad?

Patricia Arquette
Freigeben: 2024-11-27 12:00:16
Original
718 Leute haben es durchsucht

Why Do C/C  's cos() and sin() Functions Produce Unexpected Results for Common Angles Like 180 Degrees?

Unerwartete Ergebnisse von C/Cs cos() und sin() für bekannte Winkel

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:

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

Die tatsächlichen Ergebnisse weichen jedoch häufig ab:

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

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;
}
Nach dem Login kopieren

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!

Quelle:php.cn
Erklärung dieser Website
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
Neueste Artikel des Autors
Beliebte Tutorials
Mehr>
Neueste Downloads
Mehr>
Web-Effekte
Quellcode der Website
Website-Materialien
Frontend-Vorlage