【问题标题】:Is trigonometry computationally expensive?三角函数计算成本高吗?
【发布时间】:2010-03-19 18:01:54
【问题描述】:

我在某处的一篇文章中读到,三角计算通常很昂贵。这是真的?如果是这样,这就是他们使用三角查找表的原因吗?

编辑:嗯,所以如果唯一改变的是度数(精确到 1 度),那么包含 360 个条目(每个角度)的查找表会更快吗?

【问题讨论】:

  • 查找表经常在较旧的微处理器上使用,例如用于既没有硬件浮点也没有乘法运算的机械臂的 8 位 CPU(在一种特殊情况下是 6502)。速度优势不再那么重要了。
  • 欢迎技术进步 :)

标签: trigonometry


【解决方案1】:

昂贵是一个相对的术语。

执行速度最快的数学运算是可以由您的处理器直接执行的运算。当然,整数加减法也在其中。根据处理器的不同,也可能存在乘法和除法。有时处理器(或协处理器)可以本地处理浮点运算。

更复杂的事情(例如平方根)需要执行一系列这些低级计算。这些事情通常是使用数学库来完成的(写在处理器可以执行的本机操作之上)。

这些天所有这些都发生得非常快,所以“昂贵”取决于你需要做多少,以及你需要多快发生。

如果您正在编写实时 3D 渲染软件,那么您可能需要使用许多巧妙的数学技巧和捷径来从您的环境中挤出一点点速度。

如果您正在处理典型的业务应用程序,那么您所做的数学计算很可能不会对系统的整体性能产生重大影响。

【讨论】:

  • 实际上,平方根是如此普遍,以至于它经常在硬件中实现。对于更复杂的功能(例如 trig),在硬件中实现它们并没有太大的优势,尽管它确实发生在某些架构中(x87 将是最著名的)
  • @slacker - 当您说“在硬件中”时,是否意味着 FSQRT 是少量时钟周期,或者您只是意味着它是一条指令并以纳米/微码实现?我知道有平方根功能的硬件设计,但我认为大多数处理器中都没有。
【解决方案2】:

在 Intel x86 处理器上,浮点加法或减法需要 6 个时钟周期,乘法需要 8 个时钟周期,除法需要 30-44 个时钟周期。但余弦需要 180 到 280 个时钟周期。

它仍然非常快,因为 x86 在硬件中执行这些操作,但它比更基本的数学函数慢得多。

【讨论】:

  • 实际上,这是相当过时的信息。如今,FP 加法需要 3-4 个周期,FP 乘法需要 4-5 个周期,具体取决于处理器。请注意,这些操作是完全流水线的,因此您可以在每个时钟周期开始新的加法和乘法运算。分区通常需要 20-25 个周期,并且没有流水线。如果除数是合理的,较新的处理器也可以提前退出除数 - 在某些情况下只需 6 个周期。
  • 除非你在谈论 Pentium 4。不管它做什么,它都很慢。呵呵。
【解决方案3】:

由于 sin()、cos() 和 tan() 是通过对数列求和来计算的数学函数,开发人员有时会使用查找表来避免昂贵的计算。

权衡在于准确性和记忆力。对准确性的要求越高,查找表所需的内存量就越大。

看看下表,精确到 1 度。

http://www.analyzemath.com/trigonometry/trig_1.gif

【讨论】:

  • 所有浮点运算都非常昂贵。 Even + 涉及相当多的比较、整数加法和位移。当然比 sin、cos、tan 便宜很多。
  • @Kenny - 是的,你是对的,因为它们本质上不表示为整数 :)
  • @KennyTM:这不对。它们比整数运算慢,但没那么慢。在典型的当代 CPU 上,浮点加法通常需要 3 个时钟周期。 sin() 函数需要大约 200 个周期(取决于 CPU 和方法)。我希望你能看到不同吗?
  • @Codebrain, KennyTM:在 x86 架构上。你可能是对的(我不熟悉 x86 上的指令延迟)。但是,其他支持浮点的嵌入式处理器可以生成 FP 结果,其延迟与整数单元相同。因此,它不一定是“本质上不表示为整数”的问题。实际上,在某种程度上,将两个 24 位数字(FP 的尾数部分)相乘可以比优化硬件上的两个 32 位整数更快。指数字段的加法与尾数的乘法并行完成,使用一个小加法器。
  • 要添加另一个皱纹,请考虑查找时间将取决于项目是否在缓存中。通常不会,这意味着查找将占用 RAM 访问的全部时间 - 这也将是许多时钟周期。您可能会发现浮点指令比查找更快。
【解决方案4】:

虽然快速的答案是它们比原始数学函数(加法/乘法/减法等...)更昂贵,但它们在人力时间方面并不昂贵。通常,人们使用查找表和近似值来优化它们的原因是因为他们每秒可能调用它们数万次,而每一微秒都可能很有价值。

如果您正在编写一个程序,并且只需要每秒调用几次,那么到目前为止,内置函数已经足够快了。

【讨论】:

    【解决方案5】:

    我建议自己编写一个测试程序并为它们计时。是的,与加号和减号相比,它们很慢,但它们仍然是单处理器指令。除非您正在执行具有数百万次迭代的非常紧凑的循环,否则这不太可能成为问题。

    【讨论】:

      【解决方案6】:

      是的,(相对于其他数学运算乘、除):如果您正在做一些实时的事情(矩阵运算、视频游戏等),您可以通过移动您的从您的内部循环中触发计算。

      如果您不是实时做某事,那么不,它们并不昂贵(相对于诸如从磁盘读取一堆数据、生成网页等操作而言)。三角运算有望由您的 CPU 在硬件中完成(每秒可以执行数十亿次浮点运算)。

      【讨论】:

      • 除了 x86 CPU,我不知道任何 CPU 架构,无论协处理器是内置 (PPC) 还是外部 (ARM),都会在硬件中进行触发操作。甚至 x86 CPU 也没有真正在硬件中执行它们,它们提供了一个操作码来执行它们,但在内部运行微码,该微码基于简单的算术(如 add、sub、mul 和 div)计算这些值。 GPU 可能,但对于 CPU,触发操作非常少见。
      【解决方案7】:

      如果您始终知道要计算的角度,则可以将它们存储在变量中,而不是每次都计算它们。这也适用于您的角度不会改变的方法/函数调用。您可以通过使用一些公式(从 sin(theta/2) 计算 sin(theta),知道值重复的频率 - sin(theta + 2*pi*n) = sin(theta))和减少计算变得更聪明。见this维基百科文章

      【讨论】:

        【解决方案8】:

        是的。三角函数是通过对一系列求和来计算的。所以总的来说,它比简单的数学运算要昂贵得多。 sqrt 也是如此

        【讨论】:

        • 泰勒展开不是现代 FPU 计算三角函数的方式。他们使用逐次逼近方法,每次迭代提供的精度比泰勒级数多得多。 (删除了之前对 CORDIC 的引用,该引用用于空间比速度更重要的嵌入式应用程序)
        猜你喜欢
        • 1970-01-01
        • 2023-03-28
        • 1970-01-01
        • 2017-01-13
        • 2015-04-20
        • 2014-10-29
        • 1970-01-01
        • 2019-06-26
        • 1970-01-01
        相关资源
        最近更新 更多