首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >什么时候使用CORDIC或多项式近似更有效?

什么时候使用CORDIC或多项式近似更有效?
EN

Stack Overflow用户
提问于 2013-03-15 02:35:39
回答 2查看 2.8K关注 0票数 7

我在一个架构上工作,它没有浮点硬件,但只有16位ALU和40位MAC。

我已经在这个架构上用软件实现了32位单精度浮点加/减、乘法、余弦、正弦、除法、平方根和范围缩减。

为了实现余弦和正弦,我首先使用了使用论文"ARGUMENT REDUCTION FOR HUGE ARGUMENTS" by K.C. NG中描述的方法的范围缩减,然后实现了余弦和正弦函数,它们是范围-pi/4到+pi/4上的余弦和正弦函数的多项式逼近。我参考了Hart等人的“计算机近似”一书。对于多项式。

我还听说我应该考虑CORDIC算法。然而,我想知道是否有人知道它的效率(在吞吐量、内存开销和所需指令数量方面)会比我已经使用的方法更高还是更低?我在一个多核架构上实现了我的软件功能,每个核只有128个字的指令存储器和一个128个字的16位数据存储器。此外,我还尝试搜索如何实现余弦和正弦的CORDIC算法,但我找不到任何用于32位浮点实现的好资源。有人有什么建议吗?

谢谢!

EN

回答 2

Stack Overflow用户

回答已采纳

发布于 2013-03-15 03:31:13

CORDIC给你一个循环迭代一个比特,所以在软件中实现它可能会比你的多项式版本慢。这也可能是为什么很难找到关于CORDIC软件实现的文章:它的性能较差,所以没有人担心。

请回复您的评论:Horner's method是从最高阶系数到最低阶系数计算多项式的实践,方法是重复添加系数,然后乘以变量x。相比之下,朴素的方法(即首先评估x的幂,然后乘以它们的系数并将它们相加)比霍纳的方法需要更多的工作,并且在数值上可能不太稳定。

你没有确切地提到你是如何计算你的多项式的,所以我建议一个公式:

代码语言:javascript
复制
x2 = x * x
cos = ((COS_D * x2 + COS_C) * x2 + COS_B) * x2 + COS_A
sin = (((SIN_D * x2 + SIN_C) * x2 + SIN_B) * x2 + SIN_A) * x

请注意,如果将常量调整为计算函数的范围,而不是使用泰勒系数,则可以获得更高的精度。(再次道歉,如果你做了这些事情的一部分或全部,但你没有提到你已经尝试过的东西……)

这可能与您的情况不太相关(假设只有16x16位MAC),但如果您的处理器可以一次启动多个算术求值,则如果您以树形形式编写求值,则可以获得更好的性能,从而避免一些操作的顺序依赖:

代码语言:javascript
复制
x2 = x * x
x4 = x2 * x2
cos = (COS_D * x2 + COS_C) * x4 + (COS_B * x2 + COS_A)
sin = ((SIN_D * x2 + SIN_C) * x4 + (SIN_B * x2 + SIN_A)) * x

如果你的处理器有一个向量算术运算单元,这个公式也暗示了它的有效使用……

票数 6
EN

Stack Overflow用户

发布于 2013-03-15 07:30:14

如果MAC比移位、and和adds的等效序列快得多,则使用多项式;甚至不要考虑CORDIC (除了可能的一两步范围缩减)。很难找到FP CORDIC算法,因为该标准始终适用于使用FP的任何系统(在过去约35年内),因此CORDIC不被考虑。

票数 3
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/15417482

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档