Maison >développement back-end >C++ >Pourquoi les fonctions `sin()` et `cos()` de C/C sont-elles inexactes pour les angles familiers ?
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 :
Cependant, les valeurs obtenues s'écartent souvent de ces attentes :
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!