实际上,Sin,Cos,Tan和Atan等三角函数的计算是什么?
我想我已经在我的代码中找到了一个优化,我可以避免使用任何这些函数,并将问题基于斜率而不是角度。这意味着代替上述trig函数的一对除法运算。但我想更多地了解那些触发函数的内容,以便我可以比较我的新代码(从基本数学运算的数量的角度来看)。或许我刚刚发现了一种更迂回的做同样事情的方式,或者更糟糕的是,引入了一种效率较低的方法。
使用C ++和Python,但我认为这些与语言无关,数学运算成本与最基本的操作相关。
答案 0 :(得分:9)
您需要自己剖析一下。根据我的结果,触发功能大约需要100 ns,分割大约需要20 ns。这可以很容易地转换为答案。但同样,最重要的是你在硬件上进行了分析。这样,您就可以获得适合您系统的正确答案和知识。
答案 1 :(得分:7)
现代x86处理器在其指令集中包含trig函数,但它们需要很多周期才能执行。所以如果你在这样的处理器上,如果你的代码中没有依赖关系(即你不需要一次罪计算的结果来启动下一个),那么你可能不会比直接使用sin和cos快得多,因为它们将完全流水线化,实现每个周期1的有效速率。
答案 2 :(得分:2)
(这最初是对codekaizen的答案的评论,但它相当长......)
(Codekaizen):如今,大多数trig函数都被实现为查找表。
嗯..由于大多数trig函数都采用双精度参数,因此查找该值是不切实际的。我相信大多数都会查找两边的整数然后从那里进行插值(即Sin(5.279)从Sin(5)到Sin(6)的路径是27.9%)。直接计算价值的工作量较少,但仍有相当多的计算量。
答案 3 :(得分:0)
如今,大多数trig函数都被实现为查找表。
答案 4 :(得分:0)
我从三角函数中获得的经验是它们非常快,并且大多数实现为lookup tables ......也就是说,有几个部门和分区零检查可能比调用三角函数要慢。
答案 5 :(得分:0)
唯一真正的答案是“个人资料。”
最有可能的是,如果这不是代码中的瓶颈,那么它将没有任何明显的区别。
答案 6 :(得分:0)
看看glibc。它使用了几种不同的实现,其中一些(如sysdeps / ieee754 / s_sin.c)看起来非常复杂,而其他实现使用汇编指令(如sysdeps / x86_64 / fpu / s_sincos.S)。没有一些测量就很难说出所需的实际时间。
答案 7 :(得分:0)
用于评估三角函数的近似最优方法(以及通常使用的方法)是通过正交多项式展开(Chebyshev系列)。这样一个具有适当数量的项的序列将比表查找更快。