我有这个公式
B = tan(atan(A) + C)
其中A是输入,B是输出,C是常数。问题是sin,cos和tan函数计算量很大,并且当计算为4字节浮点数时,公式的精度也会大大降低。我正在优化我的代码,所以有没有办法避免使用这些函数,即使计算总数要高几倍?
进一步背景:数字A,B和C是二维平面上3个点的x / y坐标的比率
答案 0 :(得分:1)
根据Wolfram Alpha,tan(atan(A)+C)
可以写为(A+tan(C))/(1-A*tan(C))
。
您可以从切线和公式中轻松地推导出这个:
tan(a + b)=(tan a + tan b)/(1 - tan a tan b)。
如果数学库中tan
的实现缓慢或不准确,则可能存在更快或更精确的实现。
答案 1 :(得分:0)
我会假设你的公式是正确的。马克的评论基本上归结为这样一种观点,即C必须具有一个角度单位才能使公式有意义,但如果C是一个比率,那么它就没有合适的单位。马克有一个有效的问题。
最后,您仍然需要计算切线,但有些事情可以做些帮助。
首先,为tangent of a sum应用简单的trig标识。这与tan(atan(A))= A的事实相结合,将您的公式减少到
B = (A + tan(C))/(1 - A*tan(C))
因此你仍然需要计算一个切线,即C的切线。(因此预计算tan(C),一次。)没有什么能帮你解决这个问题。
然而,有一种方法可以比sin(C)/ cos(C)的比率更有效地计算切线。例如,直接序列近似可能更好。或者有一个技巧使用一个系列的versine,它本身比切线系列更有效的计算。对于小角度,它可以快速收敛。您可以使用范围缩小技巧确保小角度。其他技巧也存在。
答案 2 :(得分:0)
atan(A) = atan(x_a/y_a)
是向量(x_a,y_a)
和Oy之间的角度。因为C是一个常数,你可以预先计算一些单位长度为c=(x_c,y_c)
的向量,并以角度C向Oy倾斜。然后cos(atan(A)+ C)可以表示为这些向量的内积除以长度一个。从cos你可以使用主要身份晒黑。最后得到了:
B = sqrt((x_a^2 + y_a^2)/(x_a*x_c + y_a*y_c)^2 - 1)
这可能更有效。小心标志。