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);
Où DegreesToRadians() convertit les degrés en radians en utilisant le formule :
double DegreesToRadians(double degrees) { return degrees * PI / 180; }
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, &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; }
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!