Mat*_*ský 10 algorithm math trigonometry
我必须在我只有以下数学工具的环境中实现asin,acos和atan:
我也已经有了相当不错的平方根函数.
我可以使用它们来实现合理有效的反三角函数吗?
我不需要太大的精度(浮点数无论如何都有非常有限的精度),基本的近似就可以了.
我已经决定使用表查找,但我想知道是否有一些更简洁的选项(不需要数百行代码来实现基本数学).
编辑:
要清理:我需要每帧以每秒35帧的速度运行该功能数百次.
在定点环境(S15.16)中,我成功地使用CORDIC算法(参见维基百科的一般描述)来计算atan2(y,x),然后使用众所周知的函数从中得到asin()和acos()涉及平方根的身份:
asin(x) = atan2 (x, sqrt ((1.0 + x) * (1.0 - x)))
acos(x) = atan2 (sqrt ((1.0 + x) * (1.0 - x)), x)
Run Code Online (Sandbox Code Playgroud)
事实证明,在double上找到atan2()的CORDIC迭代的有用描述比我想象的要难.以下网站似乎包含足够详细的描述,并且还讨论了两种替代方法,多项式近似和查找表:
http://ch.mathworks.com/examples/matlab-fixed-point-designer/615-calculate-fixed-point-arctangent
arcsin(x)您的功能需要很高的精度吗?如果不是,您可以arcsin在 N 个节点中进行计算,并将值保留在内存中。我建议使用线近似。如果x = A*x_(N) + (1-A)*x_(N+1)那么 x = A*arcsin(x_(N)) + (1-A)*arcsin(x_(N+1))哪里arcsin(x_(N)) 知道。