2012-03-18 4 views
0

Я нашел следующий код в книге Кристофера Ттрембля «Математика для игровых программистов». это выглядит как 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

+0

@scientiaesthete ok, возможно, высокий уровень был неправильным термином, но я имею в виду, что это больше похоже на то, что он не работает с битами, но что происходит со значениями, хранящимися этими битами. – gardian06

+0

Это куча арифметической магии. Что сказал Олекси. – scientiaesthete

ответ

0

Вы надеваете» действительно нужно понять, что они делают. Если вы хотите, вы можете использовать операторы битрейта google в C и понимать, что делают операторы, но это, вероятно, не поможет вам понять код. На самом деле, код просто содержит очень сложные способы сделать что-то очень быстро.