逼近反三角函数

Mat*_*ský 10 algorithm math trigonometry

我必须在我只有以下数学工具的环境中实现asin,acos和atan:

  • 正弦
  • 余弦
  • 基本定点算术(浮点数不可用)

我也已经有了相当不错的平方根函数.

我可以使用它们来实现合理有效的反三角函数吗?

我不需要太大的精度(浮点数无论如何都有非常有限的精度),基本的近似就可以了.

我已经决定使用表查找,但我想知道是否有一些更简洁的选项(不需要数百行代码来实现基本数学).

编辑:

要清理:我需要每帧以每秒35帧的速度运行该功能数百次.

nju*_*ffa 8

在定点环境(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


Eug*_*y89 2

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)) 知道。