正弦和余弦哪个更有效?罪与科斯或罪与方

Which is more efficient for sines and cosines? Sin and Cos or Sin and Sqrt?

本文关键字:有效 余弦哪      更新时间:2023-10-16

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

第一个问题:

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

第二个问题:

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

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

谢谢。

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

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

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

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

如果精度不重要,那么获得 sin 或 cos 的最快方法是使用表格。持有一些全局常量数组,其中包含所有 agle 的 sin 和 cos 值,并提供您需要的步骤。所以你的sin/cos函数只需要将角度转换为索引,你就会得到结果。