Math 切线公式

Math 切线公式,math,matrix,trigonometry,Math,Matrix,Trigonometry,我有这个公式 B = tan(atan(A) + C) 其中A为输入,B为输出,C为常数。问题是,sin、cos和tan函数的计算成本很高,而且当计算为4字节浮点时,沿公式计算的精度损失很大。我正在优化我的代码,所以有没有任何方法可以避免使用这些函数,即使计算的总数要高出几倍 进一步的背景:数字A、B和C是二维平面上3个点的x/y坐标比根据,tan(atan(A)+C)可以写成(A+tan(C))/(1-A*tan(C)) 您可以很容易地从切线和公式中手动导出: tan(a+b)=(tana+

我有这个公式

B = tan(atan(A) + C)
其中A为输入,B为输出,C为常数。问题是,sin、cos和tan函数的计算成本很高,而且当计算为4字节浮点时,沿公式计算的精度损失很大。我正在优化我的代码,所以有没有任何方法可以避免使用这些函数,即使计算的总数要高出几倍

进一步的背景:数字A、B和C是二维平面上3个点的x/y坐标比

根据,
tan(atan(A)+C)
可以写成
(A+tan(C))/(1-A*tan(C))

您可以很容易地从切线和公式中手动导出:

tan(a+b)=(tana+tanb)/(1-tana-tanb)


如果数学库中的
tan
实现缓慢或不准确,则可能存在更快或更精确的实现。

我假定您的公式是正确的。马克的评论基本上归结为这样一个观点:C必须有一个角度的单位,公式才有意义,但如果C是一个比率,那么它就没有合适的单位。马克有一个有效的问题

最后,您仍然需要计算切线,但是您可以做一些事情来帮助您

首先,应用一个简单的trig标识,用于。这一点,再加上tan(atan(A))=A这一事实,将公式简化为

B = (A + tan(C))/(1 - A*tan(C))
因此,你仍然需要计算一个切线,即C的切线。(因此,预先计算tan(C),一次。)没有什么能让你绕过它

然而,有一些方法可以比sin(C)/cos(C)更有效地计算切线。例如,直接级数近似可能更好。或者,有一个技巧是对版本使用一个级数,它本身比切线级数计算效率更高。对于小角度,它可以快速收敛。您可以使用该版本的范围缩小技巧来确保小角度。其他技巧也存在。

atan(A)=atan(x_A/y_A)
因为某些点是向量
(x_A,y_A)
和Oy之间的角度。因为C是一个常数,你可以预先计算一些向量
C=(x_C,y_C)
,它的单位长度和倾斜角度为Oy。然后cos(atan(a)+C)可以表示为这些向量的内积除以a的长度。因为你可以使用主标识获得棕褐色。最后,我得到了:

B = sqrt((x_a^2 + y_a^2)/(x_a*x_c + y_a*y_c)^2 - 1)

这可能更有效。小心符号。

你的公式似乎在比率(
C
)中增加了一个角度(
atan(A)
)。基于你问题的其余部分,我看不出这是一件明智的事情。C的单位是切线函数使用的任何单位(windows calculator中的度数,C++中的弧度)。无论是使用标准C++数学库的方式,经过两次函数后,我都会丢失大约4位数的精度,而我负担不起双倍:4小数位数?听起来太过分了。你能给出一个使用公式和数值的代码示例吗?顺便说一下,C++所使用的数学库取决于所使用的编译器和操作系统。