Comment interpréter les situations où Math.acos () les rapports d'entrée non valide?
-
27-09-2019 - |
Question
Salut à tous. Je le calcul de l'angle entre deux vecteurs, et parfois Math.acos () retourne NaN lorsque cette entrée est en dehors des limites (-1> && entrée input> 1) pour un cosinus. Qu'est-ce que ça veut dire exactement? Quelqu'un être en mesure d'expliquer ce qui se passe? Toute aide est appréciée!
Voici ma méthode:
public double AngleBetween(vector b)
{
var dotProd = this.Dot(b);
var lenProd = this.Len*b.Len;
var divOperation = dotProd/lenProd;
// http://msdn.microsoft.com/en-us/library/system.math.acos.aspx
return Math.Acos(divOperation) * (180.0 / Math.PI);
}
Voici ma mise en œuvre de Dot
et Len
:
public double Dot(vector b)
{
// x's and y's are lattitudes and longitudes (respectively)
return ( this.From.x*b.From.x + this.From.y*b.From.y);
}
public double Len{
get
{
// geo is of type SqlGeography (MS SQL 2008 Spatial Type) with an SRID of 4326
return geo.STLength().Value;
}
}
La solution
Vous avez des vecteurs pour lesquels divOperation
se révèle être <-1 ou> 1? Ensuite, je pense que vous devriez vérifier vos implémentations de Dot
et Len
.
Autres conseils
Etant donné que les cos de l'angle est toujours comprise entre -1 et +1, il n'y a aucun moyen pour calculer la fonction inverse (Acos) d'un extérieur de la valeur de cette plage OU cela signifie que vous avez passé NaN à la fonction ACos.
Je soupçonne que dans ce cas, il est celui-ci - un de vos longueurs est probablement nulle
.NaN signifie "pas un nombre" . Mathématiquement, vous ne pouvez pas prendre le arccosine d'un nombre qui est en dehors de la plage [-1, 1] (ou peut-être vous pouvez, mais le résultat est complexe - je ne me souviens pas) donc le résultat d'essayer de le faire est aucun numéro du tout.