Maison >développement back-end >C++ >Pourquoi les fonctions `sin()` et `cos()` de C/C produisent-elles des résultats inattendus lors de l'utilisation de degrés ?

Pourquoi les fonctions `sin()` et `cos()` de C/C produisent-elles des résultats inattendus lors de l'utilisation de degrés ?

DDD
DDDoriginal
2024-11-29 20:37:12251parcourir

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

Résultats inattendus pour les fonctions sin et cos avec entrée en degrés

Lors de l'utilisation des fonctions C/C sin() et cos() pour les angles exprimés en degrés, des écarts peuvent résulter de l'interprétation mathématique des degrés par rapport aux radians.

Cause de Divergence

Les fonctions sin() et cos() de C/C sont conçues pour accepter des angles en radians. Cependant, l'utilisation ultérieure de la fonction DegreesToRadians() pour convertir les degrés en radians introduit une approximation inhérente en raison de l'arrondi et des limites de précision finie du type de données double. De plus, l'utilisation de M_PI peut entraîner de légers écarts par rapport à la définition mathématique de π.

Interprétation mathématique

sin(0,0547) = 0,0547
cos(0,0547 ) = 0,9984

Lorsqu'il est exprimé en degrés :

sin(0,0547) = sin(0,0547 × 180 / π) ≈ 0,0031
cos(0,0547) = cos(0,0547 × 180 / π) ≈ 0,9995

Solution

Pour résoudre cet écart, nous recommandons de réduire l'angle en degrés avant d'invoquer les fonctions trigonométriques. Cette technique garantit une précision dans une plage de -45° à 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));
  }
}

Sample Output

Utilisation de la fonction sind() améliorée :

printf("sin() of 180.0 degrees: %f\n", sin(DegreesToRadians(180.0)));
printf("sind() of 180.0 degrees: %f\n", sind(180.0));

Sortie

sin() of 180.0 degrees: -1.2246467991474805e-16
sind() of 180.0 degrees: -0.0000000000000000e+00

Cette sortie démontre une précision résultats pour les fonctions sin() et cos() avec des angles donnés en 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