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
Libérer: 2024-11-24 07:00:13
original
750 Les gens l'ont consulté

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);
Copier après la connexion

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

double DegreesToRadians(double degrees)
{
    return degrees * PI / 180;
}
Copier après la connexion

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;
}
Copier après la connexion

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!

source:php.cn
Déclaration de ce site Web
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
Derniers articles par auteur
Tutoriels populaires
Plus>
Derniers téléchargements
Plus>
effets Web
Code source du site Web
Matériel du site Web
Modèle frontal