Maison >développement back-end >C++ >Pourquoi les fonctions `sin()` et `cos()` de C/C produisent-elles des résultats inattendus pour des angles connus comme 180 degrés ?

Pourquoi les fonctions `sin()` et `cos()` de C/C produisent-elles des résultats inattendus pour des angles connus comme 180 degrés ?

Linda Hamilton
Linda Hamiltonoriginal
2024-11-24 07:00:13769parcourir

Why are C/C  's `sin()` and `cos()` functions producing unexpected results for known angles like 180 degrees?

Les fonctions Sin et Cos donnent des résultats inattendus pour les angles connus

Problème :

Lors de l'utilisation Les fonctions cos() et sin() de C/C avec un angle de 180 degrés, les résultats obtenus s'écartent considérablement des valeurs anticipées, telles que sin(0,0547) et cos(0,99). Au lieu de cela, ces fonctions renvoient sin(3.5897934739308216e-009) et cos(-1.00000).

Code en question :

double radians = DegreesToRadians(angle);
double cosValue = cos(radians);
double sinValue = sin(radians);

Où DegreesToRadians() convertit les degrés en radians en utilisant le formule :

double DegreesToRadians(double degrees)
{
    return degrees * PI / 180;
}

Explication :

Les fonctions trigonométriques de C/C (sin(), cos(), tan(), etc.) nécessitent leur saisie en radians plutôt qu'en degrés. La fonction DegreesToRadians() fournie dans le code offre une conversion approximative des degrés en radians, en utilisant PI comme constante. Cependant, les approximations introduisent des erreurs d'arrondi et l'utilisation de M_PI peut ne pas s'aligner précisément sur la valeur mathématique de π.

De plus, transmettre les radians convertis directement aux fonctions sin() et cos() peut encore amplifier ces erreurs. erreurs, conduisant à des résultats incorrects pour certains angles.

Solution :

Pour résoudre ce problème, l'angle une réduction en degrés peut être effectuée avant d'appeler les fonctions trigonométriques. Cette technique réduit l'angle à une plage comprise entre -45° et 45°, corrigeant ainsi les erreurs d'arrondi. Par exemple, considérons la fonction sind() ci-dessous :

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

Cette fonction encapsule la logique de réduction d'angle et garantit des résultats plus précis pour différents angles, y compris 180 degrés.

Ce qui précède est le contenu détaillé de. pour plus d'informations, suivez d'autres articles connexes sur le site Web de PHP en chinois!

Déclaration:
Le contenu de cet article est volontairement contribué par les internautes et les droits d'auteur appartiennent à l'auteur original. Ce site n'assume aucune responsabilité légale correspondante. Si vous trouvez un contenu suspecté de plagiat ou de contrefaçon, veuillez contacter admin@php.cn