当前位置: 首页 > 知识库问答 >
问题:

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

欧阳永宁
2023-03-14

我已经实现了32位单精度浮点加法/减法、乘法、余弦、正弦、除法、平方根和范围缩小,所有这些都是在这个体系结构上的软件。

为了实现余弦和正弦,我首先使用了范围约简,使用了K.C.在论文“大参数的参数约简”中描述的方法。NG I然后实现了一个余弦和正弦函数,这是余弦和正弦函数在-pi/4到+pi/4范围内的多项式逼近。我参考了哈特等人的《计算机近似值》一书。对于多项式。

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

共有1个答案

孔厉刚
2023-03-14

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

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

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

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),这可能不太相关,但是如果您的处理器可以一次启动多个算术计算,那么如果您以树状形式编写计算,避免一些操作的顺序依赖性,那么您可能能够获得更好的性能:

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

如果你的处理器有一个向量ALU,这个公式也建议一个有效的使用它...

 类似资料:
  • 本文向大家介绍多项式时间近似方案,包括了多项式时间近似方案的使用技巧和注意事项,需要的朋友参考一下 多项式时间近似方案 我们可以找到一些关于NP完全问题的多项式时间解,例如0-1背包问题或子集和问题。这些问题在现实世界中非常流行,因此必须有一些方法来解决这些问题。 多项式时间近似方案(PTAS)是一种用于优化问题的近似算法。对于0-1背包问题,有一个伪多项式解决方案,但是当值较大时,该解决方案不可

  • 问题内容: 奇怪的是: 似乎或多或少被定义为。通过这种方式很容易产生错误: 一些fname意外地以else块结尾。修复很简单,我们应该改用它,但是从表面上看,这似乎是一种不错的pythonic方式,并且比“正确”的方式更具可读性。 由于字符串是不可变的,所以为什么字符串错误是什么技术细节?什么时候进行身份检查更好,什么时候进行平等检查更好? 问题答案: 据我所知,检查对象身份是否相等。由于没有强制

  • 问题内容: 使用弱引用是我从未见过的实现方式,因此,我试图弄清楚它们的用例是什么以及实现将如何工作。你何时需要使用WeakHashMap或WeakReference以及如何使用它? 问题答案: 强引用的一个问题是缓存,尤其是对于非常大的结构(如图像)而言。假设你有一个必须处理用户提供的图像的应用程序,例如我正在使用的网站设计工具。自然地,你想缓存这些图像,因为从磁盘加载它们非常昂贵,并且你希望避免

  • 问题内容: 我有一个将客户发送到另一个站点来处理付款的应用程序。客户之外的另一个站点在我们的服务器上调用一个页面,让我们知道付款的状态。被调用页面会检查付款应用程序提供的参数,并检查我们是否知道该交易。然后,它更新数据库以反映状态。这一切都无需与客户进行任何互动即可完成。 我个人选择将此功能实现为JSP,因为将文件拖放到文件系统中比编译和打包文件然后将条目添加到配置文件中要容易得多。 考虑到页面的

  • 问题内容: 我怎么能说: 为什么函数调用中不需要括号,而最后一行呢? 问题答案: 是一个功能 调用该函数并产生该函数返回的任何值。 setTimeout的目的是在一段时间后运行代码。你需要的功能只是传递给它(这样的setTimeout可以自称在适当的时候函数),因为如果你将它传递给setTimeout的前调用的函数(用括号),将执行 现在 而不是1秒后,。

  • 一般来说,当发现 CPU 的占用率和实际业务应该出现的占用率不相符,或者对 Nginx worker 的资源使用率(CPU,内存,磁盘 IO )出现怀疑的情况下,都可以使用火焰图进行抓取。另外,对 CPU 占用率低、吐吞量低的情况也可以使用火焰图的方式排查程序中是否有阻塞调用导致整个架构的吞吐量低下。 常用的火焰图有三种: lj-lua-stacks.sxx 用于绘制 Lua 代码的火焰图 sam