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
Libérer: 2024-11-29 20:37:12
original
173 Les gens l'ont consulté

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

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

Sortie

sin() of 180.0 degrees: -1.2246467991474805e-16
sind() of 180.0 degrees: -0.0000000000000000e+00
Copier après la connexion

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!

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
Tutoriels populaires
Plus>
Derniers téléchargements
Plus>
effets Web
Code source du site Web
Matériel du site Web
Modèle frontal