我在某篇文章中读到,三角函数计算通常很耗费时间。这是真的吗?如果是,这就是为什么使用三角函数查找表的原因,对吗?
编辑:嗯,那么如果唯一变化的只是角度(精确到1度),是否使用360个记录每个角度的查找表会更快?
我在某篇文章中读到,三角函数计算通常很耗费时间。这是真的吗?如果是,这就是为什么使用三角函数查找表的原因,对吗?
编辑:嗯,那么如果唯一变化的只是角度(精确到1度),是否使用360个记录每个角度的查找表会更快?
昂贵是一个相对的术语。
最快执行的数学操作是那些可以直接由处理器执行的操作。当然整数加法和减法将是其中之一。根据处理器,可能还有乘法和除法。有时处理器(或协处理器)可以原生地处理浮点运算。
更复杂的事情(例如平方根)需要执行一系列这些低级别的计算。通常使用数学库来完成这些操作(建立在处理器可以执行的本地操作之上)。
所有这些现在都发生得非常非常快,因此“昂贵”取决于您需要做多少,并且您需要它发生的速度有多快。
如果您正在编写实时3D渲染软件,则可能需要使用大量巧妙的数学技巧和快捷方式,以从环境中挤出每一位速度。
如果您正在处理典型的业务应用程序,则很可能您所做的数学计算不会对系统的整体性能产生重大影响。
在Intel x86处理器上,浮点数加减需要6个时钟周期,乘法需要8个时钟周期,而除法需要30-44个时钟周期。但余弦函数需要180到280个时钟周期。
虽然x86处理器可通过硬件执行这些操作,速度仍然很快,但比更基本的数学函数慢得多。
由于sin()、cos()和tan()是通过求和数列计算得出的数学函数,因此开发者有时会使用查找表来避免昂贵的计算。
这种做法需要权衡精度和内存。精度要求越高,所需的查找表内存就越大。
请看下面这张精确到1度的表格。
虽然简单的数学函数(如加法/乘法/减法等)比这些高级函数更便宜,但从人类时间的角度来看,他们并不“昂贵”。通常人们通过查表和逼近来优化这些函数是因为他们每秒可能被调用数万次,而每微秒都很有价值。
如果你正在编写一个程序,只需要每秒调用几次函数,则内置函数足够快。
我建议您编写一个测试程序并自行计时。是的,与加减法相比,它们很慢,但它们仍然是单处理器指令。除非您正在执行数百万次迭代的非常紧密的循环,否则这不太可能成为问题。
是的。三角函数是通过求和一系列计算得出的。因此,一般来说,它比简单的数学运算要昂贵得多。平方根也是如此。