2012-03-18 160 views
0

我在Christopher Ttremblay的書「數學遊戲程序員」中找到了下面的代碼。它看起來像C++,他也做出了一堆的stllib性能比較參考給出的代碼是這樣的:翻譯c/C++?

float Exp2(float X) 
{ 
    float Result, Square, IntPow; 
    if (X < 0) { 
     const unsigned long IntVal = *(unsigned long *)&X & 0x7FFFFFFF; 
     const unsigned long Int = (IntVal >> 23) - 127; 
     if ((long)Int > 0) { 
      *(unsigned long *)&IntPow = ((((IntVal & 0x007FFFFF) | 
       0x00800000) >> (23 - Int)) + 127 + 1) << 23; 
      *(unsigned long *)&X = (((IntVal << Int) & 0x007FFFFF) 
       | 0x3F800000); 
      X = 2.0f - X; 
     } else { 
      IntPow = 2.0f; 
      X++; 
     } 
     Result = X0CoEff + Square * X1CoEff; 
     Square *= X; // The 2 last lines are repeated for every coeff. 
     Result += Square * XiCoEff; 
     ... 
     return Result/IntPow; 
    } else { 
     const unsigned long IntVal = *(unsigned long *)&X; 
     const unsigned long Int = (IntVal >> 23) - 127; 
     if ((long)Int > 0) { 
      *(unsigned long *)&IntPow = ((((IntVal & 0x007FFFFF) | 
       0x00800000) >> (23 - Int)) + 127) << 23; 
      *(unsigned long *)&X = (((IntVal << Int) & 0x007FFFFF) 
       | 0x3F800000); 
      X—; 
     } else 
      IntPow = 1.0f; 
     Square = X; 
     Result = X0CoEff + Square * X1CoEff; 
     Square *= X; // The 2 last lines are repeated for every coeff. 
     Result += Square * XiCoEff; 
     ... 
     return Result * IntPow; 
    } 
} 

float log2(float X) 
{ 
    float Result, Square; 
    Result = (float)((*(unsigned long *)&X) >> 23) - 127 + x0CoEff; 
    *(unsigned long *)&X = (*(unsigned long *)&X & 0x007FFFFF) | 0x3F800000; 
    Square = X; 
    Result += Square * XiCoEff; 
    Square *= X; // The 2 last lines are repeated for every coeff. 
    ... 
    return Result; 
} 

事情是我從來沒有真正學到位操作(我認爲這是怎麼回事在這裏,如果沒有,我仍然從未在我的編碼任務中處理十六進制)。如果有人可以通過評論或者幫助,或者將其轉換爲更高層次的c/C++以供理解。

書中解釋說,這些都應該進行優化,相比stllib功能的版本,但你可以看到代碼也沒有很好的註釋(這些線路,其中的字符複製字符)

+0

你是什麼意思?它已經很高了! :P – scientiaesthete 2012-03-18 04:22:13

+0

@scientiaesthete好吧,也許高級別是錯誤的術語,但我的意思是更多沿着特定的位而不是工作的方向,但是這些位所持有的值會發生什麼。 – gardian06 2012-03-18 04:25:59

+0

這是一羣算術魔術。 Oleksi說。 – scientiaesthete 2012-03-18 04:29:27

回答

0

你不」我真的需要明白他們在做什麼。如果你願意,你可以在C中使用google轉換運算符,並理解運營商正在做什麼,但這可能無助於你理解代碼。實際上,代碼只是包含非常非常快速的非常棘手的方法。