一尘不染

一起计算正弦和余弦的最快方法是什么?

algorithm

我想同时计算一个值的正弦和余弦(例如,创建旋转矩阵)。当然,我可以像一样一个接一个地分别计算它们a = cos(x); b = sin(x);,但是我想知道在同时使用两个值时是否有更快的方法。

编辑: 总结到目前为止的答案:

  • [弗拉德] 说,有一个asm命令可以FSINCOS计算两者(几乎是在FSIN单独调用时)

  • 就像[ Chi所] 注意到的那样,这种优化有时已经由编译器完成(使用优化标志时)。

  • [caf] 指出,函数sincossincosf可能是可用的,可以通过仅包括以下内容直接调用math.h

  • __]使用查找表的 tanascius 方法存在争议。(但是,在我的计算机上和在基准测试情况下,它的运行速度比sincos32位浮点的精度几乎快3倍。)

  • 乔尔·古德温(Joel Goodwin) 关联了一种极快的近似技术的有趣方法,具有很高的准确度(对我来说,这比查表还要快)


阅读 393

收藏
2020-07-28

共1个答案

一尘不染

现代的Intel / AMD处理器具有FSINCOS用于同时计算正弦和余弦函数的指令。如果需要强大的优化,也许应该使用它。

这是一个小示例:http :
//home.broadpark.no/~alein/fsincos.html

这是另一个示例(用于MSVC):http
:
//www.codeguru.com/forum/showthread.php?
t=328669

这是另一个示例(带有gcc):http :
//www.allegro.cc/forums/thread/588470

希望其中之一能有所帮助。(抱歉,我自己没有使用此指令。)

由于它们在处理器级别受支持,因此我希望它们比表查找要快得多。

编辑:
Wikipedia建议FSINCOS在387个处理器中添加该处理器,因此您几乎找不到不支持该处理器的处理器。

编辑:
英特尔的文档指出,该FSINCOS速度仅比FDIV(即浮点除法)慢5倍。

编辑:
请注意,并非所有现代编译器都会将sine和cosine的计算优化为对的调用FSINCOS。特别是我的VS 2008并不是那样。

编辑:
第一个示例链接已失效,但WaybackMachine上仍有一个版本

2020-07-28