Binary 浮点余弦

Binary 浮点余弦,binary,floating-point,trigonometry,Binary,Floating Point,Trigonometry,我试图用浮点实现余弦和正弦函数(但我没有浮点硬件) 因为我的处理器没有浮点硬件,也没有指令,所以我已经实现了浮点乘法、除法、加法、减法和平方根算法。这些就是我可以用来实现余弦和正弦的工具 我在考虑使用CORDIC方法, 然而,我使用牛顿法实现除法和平方根,所以我希望使用最有效的方法 请不要告诉我去看看书或是“纸的存在”,别开玩笑了,它们是存在的。我正在寻找已知快速高效的著名算法的名称。既然您已经实现了基本的算术运算,您也可以使用它们的泰勒级数展开来实现正弦和余弦。首先,根据您的精度要求,这比你之

我试图用浮点实现余弦和正弦函数(但我没有浮点硬件)

因为我的处理器没有浮点硬件,也没有指令,所以我已经实现了浮点乘法、除法、加法、减法和平方根算法。这些就是我可以用来实现余弦和正弦的工具

我在考虑使用CORDIC方法, 然而,我使用牛顿法实现除法和平方根,所以我希望使用最有效的方法


请不要告诉我去看看书或是“纸的存在”,别开玩笑了,它们是存在的。我正在寻找已知快速高效的著名算法的名称。

既然您已经实现了基本的算术运算,您也可以使用它们的泰勒级数展开来实现正弦和余弦。

首先,根据您的精度要求,这比你之前的问题要复杂得多

现在,您已经收到了警告:首先要将参数模pi/2(或2pi,或pi,或pi/4)减少,以将输入设置在可管理的范围内。这是微妙的部分。为了更好地讨论所涉及的问题,请下载一份K.C.Ng的《大争论的论点简化:好到最后一点》。(在标题上进行简单的谷歌搜索会得到一份pdf)。它可读性很强,并且很好地描述了为什么这很棘手

这样做之后,您只需要在零值附近的小范围内近似函数,这可以通过多项式近似轻松完成。泰勒级数可以工作,尽管它效率很低。截断切比雪夫级数易于计算且相当有效;计算极小极大近似更好。这是最简单的部分


我已经实现了正弦和余弦完全如所述,完全在整数,在过去(对不起,没有公共来源)。使用手动调整组装,在“典型”处理器上100个周期附近的结果是完全合理的。我不知道您使用的是什么硬件(性能主要取决于您的硬件能够以多快的速度生成整数乘法的高部分)。

对于各种精度级别,您可以在这里找到一些很好的近似值:


还有一个额外的优点,即它们在运行时是确定性的,不同于各种“收敛系列”选项,这些选项根据输入值的不同而变化很大。如果你正在做任何实时的事情(游戏、运动控制等),这很重要。

你不能找到并修改现有的数学库吗?因为下面的数学很复杂!写一个有竞争力的数学库可能值得你读一个博士学位(而且需要多年的努力)。我不是一个真正的代码迷,我只是喜欢这个算法,我可以自己实现。我必须自己在汇编中重写代码,并手动安排它。(这是一个定制的处理器)我相信有很多关于这个主题的书籍和论文。你去过大学图书馆吗?@Basic:如果你只需要有限的准确度,而不关心非常大的输入(通常是这样),那么查找表是一个很好的方法。如果要在整个范围内提供完全精确的浮点结果,内存使用成本会高得令人望而却步。@StephenCanon是的,当OP提到23位精度时,很明显查找表会很大。也就是说,你教了我一些关于论点简化的东西。。。纸-谢谢。我知道我能做到,但我想要一种最有效、最快的方法。我知道有些方法使用查找表,哪些是查找表,它们的速度快得多吗?关于极大极小近似值呢?对不起,我不熟悉任何极大极小算法。有关极大极小近似值的详细信息,请参阅。@starbox:极大极小近似值是一门黑色艺术。只有当你需要使用它时,你才真正了解它。您可以从查找“Remez交换算法”开始,这是一种标准方法。截断切比雪夫级数更容易计算,而且几乎一样好。泰勒级数需要更多的项才能达到同样的精度,但(显然)非常简单。@starbox:我还应该注意,您可能不想使用现有的FP加法和乘法例程(太贵了)。无论如何,在某些方面,将大部分计算保持为整数更容易。我为其编写整数实现的处理器实际上有一个FPU,但我能够在不使用它的情况下更快地得到结果。@starbox:避免使用完整FP运算的原因是不需要对计算的每个步骤进行取整。你可以携带一点额外的精度,并将任何舍入逻辑延迟到最后。当我在MATLAB中实现这段代码时,我从范围缩减中得到了很大的误差,这是意料之中的吗?随着传入θ的增大和范围减小到+/-π/4之间,误差增大。@starbox:正确的范围减小不会引入大的误差,无论输入有多大。然而,正如我所指出的,实现正确的范围缩减是相当困难的(这是浮点库中最复杂的部分之一,可能是最复杂的部分)。