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

时间:2010-04-19 00:02:38

标签: c# math vector trigonometry nan

嘿所有人。我正在计算两个向量之间的角度,有时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);
    }

以下是DotLen的实施方式:

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;
        }
    }

3 个答案:

答案 0 :(得分:2)

你有divOperation的矢量< -1或> 1?然后我认为您应该检查DotLen

的实施情况

答案 1 :(得分:1)

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

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

答案 2 :(得分:0)

NaN means "not a number"。在数学上,你不能取一个超出范围[-1,1]的数字的反余弦(或者你可以,但结果很复杂 - 我不记得了)所以试图这样做的结果是根本没有任何数字。