我在某处的一篇文章中读到,三角计算通常很昂贵。这是真的?如果是这样,这就是他们使用三角查找表的原因吗?
编辑:嗯,所以如果唯一改变的是度数(精确到 1 度),那么具有 360 个条目(每个角度)的查找表会更快吗?
我在某处的一篇文章中读到,三角计算通常很昂贵。这是真的?如果是这样,这就是他们使用三角查找表的原因吗?
编辑:嗯,所以如果唯一改变的是度数(精确到 1 度),那么具有 360 个条目(每个角度)的查找表会更快吗?
昂贵是一个相对的术语。
执行速度最快的数学运算是那些可以由您的处理器直接执行的运算。当然,整数加减法也在其中。根据处理器的不同,也可能存在乘法和除法。有时处理器(或协处理器)可以本地处理浮点运算。
更复杂的事情(例如平方根)需要执行一系列这些低级计算。这些事情通常是使用数学库来完成的(写在处理器可以执行的本机操作之上)。
如今,所有这些都发生得非常快,所以“昂贵”取决于你需要做多少,以及你需要多快发生。
如果您正在编写实时 3D 渲染软件,那么您可能需要使用许多巧妙的数学技巧和捷径来从您的环境中挤出一点点速度。
如果您正在处理典型的业务应用程序,那么您所做的数学计算很可能不会对系统的整体性能产生重大影响。
在 Intel x86 处理器上,浮点加法或减法需要 6 个时钟周期,乘法需要 8 个时钟周期,除法需要 30-44 个时钟周期。但余弦需要 180 到 280 个时钟周期。
它仍然非常快,因为 x86 在硬件中完成这些事情,但它比更基本的数学函数慢得多。
由于 sin()、cos() 和 tan() 是通过对系列求和来计算的数学函数,开发人员有时会使用查找表来避免昂贵的计算。
权衡在于准确性和记忆力。对准确性的要求越高,查找表所需的内存量就越大。
看看下表精确到1度。
虽然快速回答是它们比原始数学函数(加法/乘法/减法等)更昂贵,但它们在人力时间方面并不昂贵。通常,人们使用查找表和近似值来优化它们的原因是因为他们每秒可能调用它们数万次,并且每一微秒都可能很有价值。
如果您正在编写一个程序并且只需要每秒调用几次,那么到目前为止,内置函数已经足够快了。
我建议自己编写一个测试程序并为它们计时。是的,与加号和减号相比,它们很慢,但它们仍然是单处理器指令。除非您正在执行具有数百万次迭代的非常紧凑的循环,否则这不太可能成为问题。
是的,(相对于其他数学运算乘法、除法):如果您正在做一些实时的事情(矩阵运算、视频游戏等),您可以通过将三角计算移出内部循环来消除很多循环。
如果您不是实时做某事,那么不,它们并不昂贵(相对于诸如从磁盘读取一堆数据、生成网页等操作而言)。三角运算有望由您的 CPU 在硬件中完成(每秒可以执行数十亿次浮点运算)。
如果您始终知道要计算的角度,则可以将它们存储在变量中,而不是每次都计算它们。这也适用于您的角度不会改变的方法/函数调用。您可以通过使用一些公式(从 sin(theta/2) 计算 sin(theta)、知道值重复的频率 - sin(theta + 2*pi*n) = sin(theta))和减少计算变得更聪明。请参阅此维基百科文章
是的。三角函数是通过对一系列求和来计算的。所以总的来说,它比简单的数学运算要昂贵得多。sqrt 也是如此