【问题标题】:How are sin and cos implemented hardware wise?sin 和 cos 在硬件方面是如何实现的?
【发布时间】:2014-01-19 13:32:52
【问题描述】:

我一直在研究如何计算正弦和余弦。我发现了一些“标准”方法,包括查找表、CORDIC 算法和泰勒级数。我还发现大多数现代处理器都有一个计算三角函数的汇编指令。我想知道的是这些命令是如何工作的。

所以,我的问题是: 当前的一代处理器使用什么特定算法来计算正弦和余弦?

【问题讨论】:

  • 正弦基本上不是正弦 a = 对边/斜边吗?对我来说应该是一个简单的几何函数。但我确实知道数学函数很多时候都是由表格生成的。
  • @NathanM 该定义是正确的,但是为了构造三角形,您需要 sin 函数;明显的循环。幸运的是,三角函数可以通过多项式展开来评估,我相信这仍然是处理器的做法。
  • 单位圆计算,也许吧?
  • @NathanM 有几种计算正弦的方法,泰勒级数可能是最常用的方法,CORDIC 算法也经常使用,所以你应该查一下。我想知道的是我们的处理器使用的是什么特定算法。我有预感它是上述两种之一,但我想知道是哪一种。
  • 是的,我熟悉泰勒级数。这似乎是最简单的方法。检查制造商的网站?如果它是一个英特尔处理器,那么构建良好的谷歌搜索可能会产生答案。

标签: assembly trigonometry


【解决方案1】:

answer to a related, but different question here 谈到 FPU 如何执行此类指令:

减少参数后,大多数芯片都会使用 CORDIC 算法来计算正弦和余弦。您可能会听到人们说计算机使用泰勒级数。这听起来很合理,但事实并非如此。 CORDIC 算法更适合高效的硬件实现。 (软件库可能使用泰勒级数,比如在不支持三角函数的硬件上。)可能会有一些额外的处理,使用 CORDIC 算法来获得相当好的答案,然后做其他事情来提高准确性。

请注意,尽管它说的是“大多数芯片”,因为提高性能、准确性或(理想情况下)两者的尝试显然是芯片制造商努力的目标,因此它们之间会有差异。

我认为这些差异会以较低的准确性为代价带来更好的性能,反之亦然(当然,由于我们生活在一个不完美的世界中,它们可能在两者上都表现不佳)所以有时会有人可能喜欢在 CPU 中执行算法(如果您自己编写算法就会发生这种情况),而不是像 fsin 传递到的那样在 FPU 中执行。

This archived blog post 谈到了 Sun 在 Intel 上的 JVM 实现如何仅使用对 fsin 的普通调用和一定范围的输入,因为该实现存在缺陷。从那篇文章链接到的论文大概讨论了fsin 的实现,并且更详细地讨论了它的问题,但是您需要成为订阅者或付费才能阅读该文章(因此我没有这样做)。

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2011-02-10
    • 1970-01-01
    相关资源
    最近更新 更多