2012-04-18 174 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