我试图在浮点中实现余弦和正弦函数(但我没有浮点硬件)。
由于我的处理器没有浮点硬件和指令,我已经实现了浮点乘法,除法,加法,减法和平方根的算法。所以这些是我可以用来实现余弦和正弦的工具。
我正在考虑使用CORDIC方法,at this site 但是,我使用牛顿方法实现了除法和平方根,所以我希望使用最有效的方法。
请不要告诉我只是去看一本书或“纸张存在”,不要开玩笑。我正在寻找众所周知的快速有效算法的名称。
答案 0 :(得分:4)
首先,根据您的准确度要求,这可能比您之前的问题更加麻烦。
现在您已被警告:您首先要减少模数pi / 2(或2pi,或pi或pi / 4)以使输入进入可管理范围。这是微妙的部分。如果对所涉及的问题进行了很好的讨论,请下载K.C.的副本。 Ng的减少对于巨大的论点:好到最后一点。 (标题上的简单谷歌搜索将获得pdf)。它非常易读,并且很好地描述了为什么这很棘手。
这样做之后,您只需要在零附近的小范围内逼近函数,这可以通过多项式近似来轻松完成。泰勒系列会奏效,但效率低下。截断的切比雪夫系列易于计算且合理有效;计算minimax近似值仍然更好。这很容易。
我完全按照描述实现了正弦和余弦,过去完全是整数(对不起,没有公开来源)。使用手动调整的组件,在“典型”处理器上产生100个周期的邻域是完全合理的。我不知道你正在处理什么硬件(性能主要取决于你的硬件产生整数倍数的高速部分的速度。)
答案 1 :(得分:1)
对于不同的精确度,你可以在这里找到一些好的近似值:
http://www.ganssle.com/approx.htm
具有额外的优势,它们在运行时是确定性的,而不像各种“会聚系列”选项,它们可能根据输入值而变化很大。如果你正在做任何实时的事情(游戏,运动控制等),这很重要。
答案 2 :(得分:-1)
由于你已经实现了基本的算术运算,你可以使用他们的泰勒级数展开来实现正弦和余弦。