哪种更有效的正弦和余弦? Sin和Cos或Sin和Sqrt?

时间:2013-09-13 19:38:36

标签: c++ performance optimization sqrt sin

不幸的是,标准C ++库没有一个sincos调用,这为这个问题提供了一席之地。

第一个问题:

如果我想计算一个罪和一个cos,计算一个罪和一个cos是比它便宜,还是计算一个罪然后一个sqrt(1-sin ^ 2)得到cos?

第二个问题:

intel数学内核库为标准数学函数计算提供了非常好的函数,因此存在函数vdSinCos()以非常优化的方式解决问题,但intel编译器不是免费的。 Linux发行版中是否有任何开源库(C,C ++,Fortran)可以使用那些我可以直接链接到它们并具有最佳实现的函数?

注意:我不想进入指令调用,因为所有CPU都不支持它们。我想链接到一个可以在任何CPU上为我完成工作的通用库。

感谢。

3 个答案:

答案 0 :(得分:5)

GNU C库有a sincos() function,它将利用大多数现代指令集所具有的“FSINCOS”指令。我会说这是你最好的选择;它应该与英特尔库方法一样快。

如果你不这样做,我会选择“sqrt(1-sin(x)^ 2)”路线。在我到目前为止看过的每个处理器架构文档中,FSQRT指令明显快于FSIN函数。

答案 1 :(得分:1)

几乎每个性能问题的答案都是“为什么不在代码中测量它”,因为有很多不同的因素会影响几乎所有这类计算的性能。例如,“谁产生数学函数”。平方根的计算相对简单,但我不相信sqrt(1-sin*sin)和再次计算cos之间存在巨大差异。什么处理器也可能是一个因素,以及在sin / cos计算“周围”进行的其他计算。

如果在某个地方有一个具有这种功能的库,我不会感到惊讶,但我一直没看。

答案 2 :(得分:0)

如果精度并不重要,那么获得罪恶或成本的最快方法就是使用表格。 使用您需要的步骤,为所有agles保存一些带有sin和cos值的全局const数组。所以你的sin / cos函数只需要将角度转换为索引,你就得到了结果。