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功能的版本,但你可以看到代碼也沒有很好的註釋(這些線路,其中的字符複製字符)
你是什麼意思?它已經很高了! :P – scientiaesthete 2012-03-18 04:22:13
@scientiaesthete好吧,也許高級別是錯誤的術語,但我的意思是更多沿着特定的位而不是工作的方向,但是這些位所持有的值會發生什麼。 – gardian06 2012-03-18 04:25:59
這是一羣算術魔術。 Oleksi說。 – scientiaesthete 2012-03-18 04:29:27