当对两个向量之间的角度应用经典公式时:
人们发现,对于非常小的/锐角,会损失精度,结果也不准确。正如在解释这个堆栈溢出的答案,一个解决方案是使用反正切来代替:
这确实提供了更好的结果。但是,我想知道这是否会给非常接近\ pi / 2的角度带来不好的结果。是这样吗 如果是这样,是否有任何公式可以精确计算角度而无需检查if
分支内的公差?
当对两个向量之间的角度应用经典公式时:
人们发现,对于非常小的/锐角,会损失精度,结果也不准确。正如在解释这个堆栈溢出的答案,一个解决方案是使用反正切来代替:
这确实提供了更好的结果。但是,我想知道这是否会给非常接近\ pi / 2的角度带来不好的结果。是这样吗 如果是这样,是否有任何公式可以精确计算角度而无需检查if
分支内的公差?
Answers:
(我之前已经测试过这种方法,我记得它可以正常工作,但是我没有专门针对这个问题进行测试。)
据我所知,这两个 和如果几乎是平行/垂直的,则可能会遭受灾难性的取消-如果关闭任何一个输入,atan2都无法为您提供良好的准确性。v 1 ⋅ v 2
首先重新确定问题,即找到边长为的三角形的角度 ,和(所有这些均以浮点算术精确计算)。由于Kahan(错误计算针状三角形的面积和角度),Heron公式有一个著名的变体,它可以让您计算由边长指定的三角形的面积和角度(在和之间),并在数值上稳定。因为对该子问题的减少也很准确,所以该方法应适用于任意输入。b = | v 2 | c = | v 1 − v 2 | 一b
引用该论文(请参阅第3页),假设, 这里所有的括号都经过精心放置,很重要;如果您发现自己采用负数的平方根,则输入边的长度不是三角形的边的长度。μ = { Ç - (一- b )一个Ñ克升ë=2反正切(√
Kahan的论文对此作了解释,其中包括其他公式无法使用的值的示例。您的第一个公式是 4页上。
我建议使用Kahan的Heron公式的主要原因是因为它是一个非常漂亮的基元-可以将很多潜在棘手的平面几何问题简化为找到任意三角形的面积/角度,因此,如果您可以将问题简化为一个不错的稳定公式,无需您自己提出任何建议。
编辑根据Stefano的评论,我绘制了,(代码)的相对误差图。这两行是和的相对误差,沿水平轴移动。似乎可行。 v 2 = (COS θ ,罪θ )θ = ε θ = π / 2 - ε ε
Velvel Kahan在另一个说明中,对此问题的有效答案并不奇怪:
我用作为与水平轴的夹角。(您可能必须在某些语言中翻转参数的顺序。)(x
(我在此处对Kahan的公式进行了Mathematica演示。)
ATAN2(Y, X)