首页
学习
活动
专区
圈层
工具
发布
首页
学习
活动
专区
圈层
工具
MCP广场
社区首页 >问答首页 >在C++中创建正弦查找表

在C++中创建正弦查找表
EN

Stack Overflow用户
提问于 2010-09-11 05:57:09
回答 6查看 45.3K关注 0票数 20

如何在C++中重写下面的伪代码?

代码语言:javascript
运行
复制
real array sine_table[-1000..1000]
    for x from -1000 to 1000
        sine_table[x] := sine(pi * x / 1000)

我需要创建一个sine_table查找表。

EN

回答 6

Stack Overflow用户

回答已采纳

发布于 2010-09-11 07:55:01

您可以通过仅存储第一象限的值将表的大小减少到原始的25%,例如,对于x in 0,pi/2。

为此,您的查找例程只需使用简单的trig标识将x的所有值映射到第一个象限:

  • sin(x) =- sin(-x),从象限IV映射到象限I
  • sin(x) = sin(pi - x),从象限II映射到象限I

要从象限III映射到象限I,应用两个身份,即sin(x) =- sin (pi + x)

这种策略是否有帮助取决于您的情况下内存使用量的大小。但是,仅仅为了避免查找过程中的比较和减法而存储四倍于所需的值似乎是浪费的。

我赞同Jeremy的建议,即衡量构建一个表是否比仅仅使用std::sin()更好。即使使用最初的大表,您也必须在每次查找表的过程中花费时间将参数转换为pi/1000的最接近增量,并且在此过程中会损失一些准确性。

如果您真的想用精度来换取速度,那么可以尝试仅使用泰勒级数展开的前几项来近似sin()函数。

  • sin(x) =x- x^3/3!+ x^5/5!...,其中^表示幂和!表示阶乘。

当然,为了提高效率,您应该预先计算阶乘,并利用x的较低幂来计算较高的幂,例如,在计算x^5时使用x^3。

最后一点,上面的截断泰勒级数对于更接近于零的值更准确,因此在计算近似正弦之前,仍然值得映射到第一或第四象限。

附录:基于两个观察结果,还有一个潜在的改进:

如果你能计算第一个八分项中的正弦和余弦,你就可以计算任何三角函数,pi/4

  • ,以零为中心的泰勒级数展开式在零点附近更准确,

因此,如果您决定使用截断的泰勒级数,那么您可以通过映射到正弦或余弦来提高精度(或者使用更少的项来获得范围0,pi/4的角度),除了上面的恒等式之外(例如,如果x> pi/4,则在映射到第一象限后,使用诸如sin(x) = cos(pi/2-x)和cos(x) = sin(pi/2-x)之类的恒等式)。

或者,如果您决定对正弦和余弦都使用表查找,您可以使用两个较小的表,这两个表仅涵盖范围0,pi/4,以牺牲另一个可能的比较和减法查找来映射到较小的范围。然后,您可以为表使用更少的内存,或者使用相同的内存,但提供更精细的粒度和准确性。

票数 35
EN

Stack Overflow用户

发布于 2010-09-11 06:03:52

代码语言:javascript
运行
复制
long double sine_table[2001];
for (int index = 0; index < 2001; index++)
{
    sine_table[index] = std::sin(PI * (index - 1000) / 1000.0);
}
票数 5
EN

Stack Overflow用户

发布于 2010-09-20 01:37:43

还有一点:调用三角函数是很昂贵的。如果您想要准备具有恒定步长的正弦查找表-您可以节省计算时间,但代价是一些潜在的精度损失。

考虑你的最小步长是"a“。也就是说,你需要sin(a),sin(2a),sin(3a),...

然后,您可以执行以下操作:首先计算sin(a)和cos(a)。然后,对于每个连续的步骤,使用以下三角等式:

  • sin(n+1 * a) = sin(n*a) * cos(a) + cos(n*a) * sin( a)
  • cos(n+1 *a)= cos(n*a) * cos(a) - sin(n*a) * sin(a)

这种方法的缺点是在此过程中会累积舍入误差。

票数 5
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/3688649

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档