5

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

第一个问题:

如果我想计算一个 sin 和一个 cos,计算一个 sin 和一个 cos 是否更便宜,或者计算一个 sin 然后一个 sqrt(1-sin^2) 来得到 cos?

第二个问题:

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

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

谢谢。

4

3 回答 3

7

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

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

于 2013-09-13T21:35:45.550 回答
1

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

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

于 2013-09-13T19:47:18.483 回答
0

如果精度不重要,获得 sin 或 cos 的最快方法是使用表。为所有角度保存一些带有 sin 和 cos 值的全局 const 数组,并按您需要的步长。因此,您的 sin/cos 函数只需将角度转换为索引即可得到结果。

于 2013-09-18T20:46:44.137 回答