2012-04-18 175 views
0

你好我有以下代码段在嵌套C++循环优化乘数

for(int k = 0; k< 1000; ++k) 
    { 

     double acc = 1.0; 

     if(...) 
     { 
      short amSeq = 100; 

      for (short c = 0; c <= 21; ++c) 
      { 
       for (short kk = (Range.uSequences[k][c]), s = SeqComp[c]; kk != 0; --kk, --s, --amSeq) 
       { 
        acc *= static_cast<double>(s)/amSeq; 
       } 
      } 
     } 
     else 
      acc = 0; 

    } 

我想知道是否有任何方式来优化去除的static_cast线acc *= static_cast<double>(s)/amSeq;由200但一个因素会加快东西显然会产生错误的结果由于

+0

什么类型为s?或SeqComp呢?你在说什么平台?但是您可能会发现将其更改为“acc * = static_cast (s)/ amSeq;”将会产生巨大的差异..尤其是如果你也使用float的话...... – Goz 2012-04-18 19:17:52

+0

如果'SeqComp'是一个'double'数组,你就不需要转换。 – chrisaycock 2012-04-18 19:18:57

+0

@Goz:除非你使用标准库C函数,否则很少float会比double快,因为例如'sinf'比'sin'精度要求更低,而不是因为float更快。 – orlp 2012-04-18 19:19:53

回答

2

你可以很容易地避免通过移动代码,并使用正确的类型转换:

if(...) 
{ 
    double amSeq = 100; 

    for (short c = 0; c <= 21; ++c) 
    { 
     double s = SeqComp[c]; 

     for (short kk = (Range.uSequences[k][c]); kk != 0; --kk, --s, --amSeq) 
     { 
       acc *= s/amSeq; 
     } 
    } 
} 
+0

经过测试上面的代码和运行更多的测试,我意识到代码很慢,因为double精度变量的乘法不是来自cast_type调用。整数乘法速度更快 – Jeanno 2012-04-18 21:40:41