我想同时计算一个值的正弦和余弦(例如,创建旋转矩阵)。当然,我可以像一样一个接一个地分别计算它们a = cos(x); b = sin(x);,但是我想知道在同时使用两个值时是否有更快的方法。
a = cos(x); b = sin(x);
编辑: 总结到目前为止的答案:
[弗拉德] 说,有一个asm命令可以FSINCOS计算两者(几乎是在FSIN单独调用时)
FSINCOS
FSIN
就像[ Chi所] 注意到的那样,这种优化有时已经由编译器完成(使用优化标志时)。
[caf] 指出,函数sincos和sincosf可能是可用的,可以通过仅包括以下内容直接调用math.h
sincos
sincosf
math.h
__]使用查找表的 tanascius 方法存在争议。(但是,在我的计算机上和在基准测试情况下,它的运行速度比sincos32位浮点的精度几乎快3倍。)
乔尔·古德温(Joel Goodwin) 关联了一种极快的近似技术的有趣方法,具有很高的准确度(对我来说,这比查表还要快)
现代的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倍。
FDIV
编辑: 请注意,并非所有现代编译器都会将sine和cosine的计算优化为对的调用FSINCOS。特别是我的VS 2008并不是那样。
编辑: 第一个示例链接已失效,但WaybackMachine上仍有一个版本。