【发布时间】:2011-02-10 15:11:47
【问题描述】:
我想同时计算一个值的正弦和余弦(例如创建一个旋转矩阵)。当然,我可以像a = cos(x); b = sin(x); 那样一个接一个地分别计算它们,但我想知道在需要这两个值时是否有更快的方法。
编辑: 总结到目前为止的答案:
Vlad 说,有一个 asm 命令
FSINCOS计算它们(与单独调用FSIN几乎同时)就像Chi 注意到的那样,这种优化有时已经由编译器完成(当使用优化标志时)。
caf指出,函数
sincos和sincosf可能是可用的,只需包含math.h即可直接调用tanascius 使用查找表的方法存在争议。 (但在我的计算机上和基准测试场景中,它的运行速度比
sincos快 3 倍,而 32 位浮点的精度几乎相同。)Joel Goodwin 链接到一种有趣的方法,该方法是一种具有相当高准确度的极快近似技术(对我来说,这比查表还要快)
【问题讨论】:
-
另请参阅有关 sin/cos 原生实现的问题:stackoverflow.com/questions/1640595
-
如果您关心速度而不是准确性,请尝试使用
sinx ~ x-x^3/6和cosx~1-x^2/4作为近似值。您可以在任一系列中添加术语,因为您更加重视准确性(en.wikipedia.org/wiki/Taylor_series 向下滚动到 trig taylor 系列。)请注意,这是逼近您想要的任何可微分n次的函数的一般方法。因此,如果你有一些更大的函数,那个正弦和余弦属于你,如果你近似它而不是独立的 sin,cos,你将获得更大的速度。 -
这是一种很差的技术,准确度很差。见乔尔·古德温的帖子。泰勒系列已在下面发布。请将其发布为答案。
-
这取决于您的要求,如果您想要准确度,泰勒级数将是一个良好的近似值,仅当您需要接近某个点
x的值x_0,然后将泰勒级数扩展到x_0而不是 0。这将在x_0附近为您提供出色的准确度,但您走得越远结果越差。当您查看给定的 asnwer 并尝试使用远离0的值时,您可能认为准确性很差。答案是 sin,cos 扩大到 0 左右。