Heim >Backend-Entwicklung >C++ >Warum erzeugen die Funktionen „sin()' und „cos()' von C/C bei der Verwendung von Graden unerwartete Ergebnisse?

Warum erzeugen die Funktionen „sin()' und „cos()' von C/C bei der Verwendung von Graden unerwartete Ergebnisse?

DDD
DDDOriginal
2024-11-29 20:37:12182Durchsuche

Why Do C/C  's `sin()` and `cos()` Functions Produce Unexpected Results When Using Degrees?

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, &amp;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!

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