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

Posted

技术标签:

【中文标题】如何解释 Math.Acos() 报告无效输入的情况?【英文标题】:How to interpret situations where Math.Acos() reports invalid input? 【发布时间】:2011-02-09 12:10:04 【问题描述】:

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

这是我对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;
        
    

【问题讨论】:

nitpick:越界条件应该写成:(-1 > input || input > 1),甚至!(-1 <= input && input <= 1) 但是(纬度,经度)对不是 2D 矢量,它们是 3D 的角度测量值。那么你想找到什么?也许是地球中心的内角或两者之间的方位?这个公式也不会得到你。 另外,什么是“发件人”?对于 2D Vector 对象,您希望它包含 x 和 y 值,并且 Dot 方法只是 this.X * other.X + this.Y * other.Y。您还希望 Len 方法只返回 sqrt(xx + yy) 而不是完全从其他东西计算的某个值。 【参考方案1】:

您有divOperation 结果为 1 的向量?那么我认为你应该检查你的DotLen 的实现。

【讨论】:

我在问题中添加了 dot 和 len。看看,告诉我你的想法。 哦,我刚刚注意到了。我遗漏了 dot() 方法的关键部分。 @Sean 对于我们这些可能好奇的人,你能解释一下那个关键部分是什么吗? 基本上,我省略了点积的 To.X 和 To.Y 部分...... Me.Smart == 参差不齐......哈哈。【参考方案2】:

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

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

【讨论】:

【参考方案3】:

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

【讨论】:

那么,这两个向量及其各自的方向说明了什么? 好问题。你能提供几个失败的向量样本吗?

以上是关于如何解释 Math.Acos() 报告无效输入的情况?的主要内容,如果未能解决你的问题,请参考以下文章

python已知cos求弧度

关于ansys 如何输公式,有会的情帮下忙,急用

java中math的用法

c#math

如何使用 Express 和 PassportJS 正确报告无效登录?

Math.floor是啥?