C# 如何解释Math.Acos()报告无效输入的情况?

C# 如何解释Math.Acos()报告无效输入的情况?,c#,math,vector,trigonometry,nan,C#,Math,Vector,Trigonometry,Nan,大家好。我在计算两个向量之间的角度,有时Math.Acos()在余弦的输入超出范围(-1>input&&input>1)时返回NaN。这到底是什么意思?有人能解释发生了什么事吗?感谢您的帮助 以下是我的方法: public double AngleBetween(vector b) { var dotProd = this.Dot(b); var lenProd = this.Len*b.Len; var divOperation = d

大家好。我在计算两个向量之间的角度,有时Math.Acos()在余弦的输入超出范围(-1>input&&input>1)时返回NaN。这到底是什么意思?有人能解释发生了什么事吗?感谢您的帮助

以下是我的方法:

 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);
    }
下面是我对
Dot
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;
        }
    }

。从数学上讲,你不能对一个超出范围[-1,1]的数字求反余弦(或者你可以,但结果很复杂——我不记得了),所以尝试这样做的结果根本不是任何数字

由于角度的Cos始终在-1和+1之间,因此无法计算超出该范围的值的反函数(Acos),或者这意味着将NaN传递给Acos函数


我怀疑在这种情况下是后者-你的一个长度可能是零。

你有向量,它的
divOperation
结果是<1或>1?然后我认为你应该检查你的
Dot
Len

的实现,那么,这说明了这两个向量及其各自的方向是什么?好问题。你能提供几个向量样本吗?我在问题中添加了点和伦。看一看,告诉我你的想法。哦,我刚刚注意到了。我遗漏了dot()方法的一个关键部分。@Sean你能为我们这些好奇的人解释一下这个关键部分是什么吗?基本上,我遗漏了dot乘积的To.X和To.Y部分。。。我,斯玛特,斯玛蒂。。。。LOL.nitpick:应该写越界条件:
(-1>input | | input>1)
,甚至
!(-1,但a(纬度、经度)这对不是2D向量,它们是3D中的角度测量值。那么你想找到什么?也许是地球中心的内角或两者之间的方位角?这个公式也不会让你明白。还有,“来自”是什么?对于2D向量对象,你会期望它包含x和y值,而对于点方法,它就是这个s、 X*other.X+this.Y*other.Y。您还希望Len方法只返回sqrt(xx+yy),而不是完全根据其他值计算的值。