Comment puis-je gérer les erreurs étranges de calcul ACOS / sin / atan2?
Question
Quelqu'un at-il vu cette valeur bizarre lors de la manipulation sin / cos / tan / ACOS .. trucs mathématiques?
=== === LA VALEUR ÉTRANGE
-1. # IND00
=====================
void inverse_pos(double x, double y, double& theta_one, double& theta_two)
{
// Assume that L1 = 350 and L2 = 250
double B = sqrt(x*x + y*y);
double angle_beta = atan2(y, x);
double angle_alpha = acos((L2*L2 - B*B - L1*L1) / (-2*B*L1));
theta_one = angle_beta + angle_alpha;
theta_two = atan2((y-L1*sin(theta_one)), (x-L1*cos(theta_one)));
}
Ceci est le code que je travaillais.
Dans une condition particulière - comme lorsque x et y sont 10 et 10, ce Cod.magasin -1. # IND00 dans theta_one & theta_two .
Il ne ressemble pas à caractères ou chiffres: (
Sans aucun doute, atan2 / ACOS / stuff sont les problèmes.
Mais le problème est, try et catch ne fonctionne pas non plus cuz ces doubles variables ont enregistré avec succès certaines valeurs dans les .
En outre, les calculs suivants ne se plaignent jamais à ce sujet et ne jamais rompre le programme
Je pense à forcer à utiliser cette valeur en quelque sorte et faire planter l'ensemble du programme ... Alors que je peux attraper cette erreur ..
À l'exception de cette idée, je ne sais pas comment je dois vérifier si ces theta_one et theta_two variables ont enregistré ces valeurs folles.
Toutes les bonnes idées?
Merci d'avance ..
La solution
La "valeur bizarre" est nan (pas un nombre).
Le problème est dû au fait (L2*L2 - B*B - L1*L1) / (-2*B*L1) = 6.08112…
est en dehors de l'intervalle [-1, 1] où acos est bien définie pour les nombres réels. Donc NaN est renvoyé.
Êtes-vous sûr la formule est correcte?
Si vous voulez attraper un NaN, NAN doit être un NaN de signalisation. Pour gcc, compiler avec l'option -fsignaling-nans
.