首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >转盘计算

转盘计算
EN

Code Review用户
提问于 2016-11-22 22:58:27
回答 2查看 226关注 0票数 4

我试图优化这个旋转计算函数:

代码语言:javascript
复制
void twiddle(int N)
{
  int i;
  for (i=0;i<N;i++)
  {
     twiddle_table[i].re = (float)   cos((float)i * 2.0 * PI /(float)N);
     twiddle_table[i].im = (float) - sin((float)i * 2.0 * PI /(float)N);
  }
}

哪里的N = 4096大小的旋转桌和可以更大!

然后,我做了以下工作:

代码语言:javascript
复制
void twiddle(int N)
{
   int i;
   float Tconst;
   Tconst = 2.0 * PI /(float)N;
   for (i=0;i<N;i++)
   {
      twiddle_table[i].re = (float)   cos((float)i * Tconst);
      twiddle_table[i].im = (float) - sin((float)i * Tconst);
   }
}

但是,对于for循环,我获得了34万个循环的性能,我认为这是不好的。

有什么提示可以提高此功能的性能吗?

EN

回答 2

Code Review用户

发布于 2016-11-24 18:19:10

减少vnp代码中错误积累的一个标准技巧是注意到基的真实部分将接近1;我们可以使用多角度公式更精确地计算基-1(与vnp的后置一样)。

代码语言:javascript
复制
base_1 = -2*t*t + I * sin(a) 

哪里

代码语言:javascript
复制
a = 2.0*PI/N 
t = sin(a/2.0)

(我是-1的平方根)。然后用

代码语言:javascript
复制
tab[i] = tab[i-1] + tab[i-1]*base_1. 

虽然计算量较多,但舍入误差较小。

除非硬件将其排除在外,否则您应该考虑将计算基设为双倍,并将复杂的指数累加成双倍;您可以使用一个变量W,例如

代码语言:javascript
复制
W += W*base_1

然后将W存储在选项卡我中--从而将其转换为浮动。同样,更多的计算,但较少的错误积累。

票数 2
EN

Code Review用户

发布于 2016-11-25 14:19:33

这一行:

代码语言:javascript
复制
Tconst = 2.0 * PI /(float)N; 

将在双倍中执行,因为2.0要在浮点数中执行,将2.0更改为2.0f

提取表达式:

代码语言:javascript
复制
(float)i*Tconst

若要赋值浮点变量,请在for()循环的顶部,并在实际计算中使用该变量

请显示以下定义: twiddle_table[]

参数'N‘绝不能是>=’table[]中的条目数。否则,当数据保存在数组结束后时,将发生未定义的行为,这可能导致seg错误事件。

由于数据和结果是浮动的,所以不应该使用函数: cos()。建议: cosf()

函数: sin()不应该使用。建议: sinf()

注意:那么就没有必要将对cosf()或sinf()的调用结果转换为“`float”。

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

https://codereview.stackexchange.com/questions/147830

复制
相关文章

相似问题

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