2

大家好。我正在计算两个向量之间的角度,有时 Math.Acos() 在余弦的输入超出范围(-1 > 输入 && 输入 > 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);
    }

这是我对Dotand的实现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;
        }
    }
4

3 回答 3

2

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

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

于 2010-04-19T00:06:50.680 回答
2

您有divOperation结果为 < -1 或 > 1 的向量?然后我认为你应该检查你的实现Dotand Len

于 2010-04-19T00:08:37.697 回答
0

NaN 的意思是“不是数字”。从数学上讲,您不能取超出范围 [-1, 1] 的数字的反余弦(或者您可以取但结果很复杂——我不记得了)所以尝试这样做的结果是根本没有任何数字。

于 2010-04-19T00:05:35.677 回答