Maison >développement back-end >C++ >Pourquoi les fonctions `sin()` et `cos()` de C/C sont-elles inexactes pour les angles familiers ?

Pourquoi les fonctions `sin()` et `cos()` de C/C sont-elles inexactes pour les angles familiers ?

Patricia Arquette
Patricia Arquetteoriginal
2024-12-05 14:26:10501parcourir

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

Résultats inattendus de sin et cos pour des angles familiers

Lors de l'utilisation des fonctions sin() et cos() de C/C avec un angle de 180 degrés, les utilisateurs peuvent rencontrer des résultats inattendus. Les valeurs attendues sont :

  • sin de 0,0547
  • cos de 0,99

Cependant, les valeurs obtenues s'écartent souvent de ces attentes :

  • péché de 3.5897934739308216e-009
  • cos de -1.00000

Explication

Les fonctions sin() et cos() de C/C fonctionnent avec des radians comme paramètres d'entrée, pas des degrés. Bien que DegreesToRadians() tente de convertir les degrés en radians, les imprécisions d'arrondi et la précision limitée de double() peuvent entraîner des divergences dans les résultats. De plus, la constante machine M_PI, une estimation de la constante mathématique π, peut contribuer à ces écarts.

Solution

Pour remédier à ces imprécisions, il est recommandé d'effectuer réduction d'angle en degrés avant d'appeler les fonctions trigonométriques. Cela implique de réduire l'angle dans une plage de -45° à 45° avant d'invoquer sin(). Cela garantit que les grandes valeurs de N dans les calculs comme sin(90.0*N) produisent des résultats précis de -1.0, 0.0 et 1.0.

Un exemple de code démontrant cette approche est fourni :

#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;
}

Ce code mis à jour produit des résultats plus précis sous différents angles, comme le démontre sa sortie :

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

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