如何解释 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);
这是我对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;
【问题讨论】:
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 的向量?那么我认为你应该检查你的Dot
和Len
的实现。
【讨论】:
我在问题中添加了 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() 报告无效输入的情况?的主要内容,如果未能解决你的问题,请参考以下文章