C++ 翻译c/c++;?

C++ 翻译c/c++;?,c++,translate,C++,Translate,我在Christopher Ttremblay的《游戏程序员的数学》一书中发现了以下代码。它看起来像C++,他确实把一组性能比较引用到STLLIB,给出的代码是这样的: float Exp2(float X) { float Result, Square, IntPow; if (X < 0) { const unsigned long IntVal = *(unsigned long *)&X & 0x7FFFFFFF; c

我在Christopher Ttremblay的《游戏程序员的数学》一书中发现了以下代码。它看起来像C++,他确实把一组性能比较引用到STLLIB,给出的代码是这样的:

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;
}
float Exp2(float X)
{
浮点结果,平方,IntPow;
if(X<0){
常量unsigned long IntVal=*(unsigned long*)&X&0x7FFFFFFF;
常量无符号长整数=(IntVal>>23)-127;
如果((长)Int>0){
*(无符号长*)和IntPow=((IntVal和0x007FFFFF)|
0x00800000)>>(23-Int))+127+1)23)-127;
如果((长)Int>0){
*(无符号长*)和IntPow=((IntVal和0x007FFFFF)|
0x00800000)>>(23-Int))+127)23)-127+x0CoEff;
*(无符号长*)&X=(*(无符号长*)&X&0x007FFFFF)| 0x3F800000;
平方=X;
结果+=平方*XiCoEff;
Square*=X;//每个系数重复最后两行。
...
返回结果;
}
问题是我从来没有真正学习过位运算(我想这就是这里发生的事情,如果没有的话,我仍然没有在我的编码任务中处理过十六进制)。如果有人能够通过评论或将其翻译到更高级别的c/c++来理解,或许可以提供帮助


这本书解释说,与stllib相比,这些应该是函数的优化版本,但正如您所看到的,代码没有得到很好的注释(这些行是逐字符复制的)

你不需要真正了解他们在做什么。如果你愿意,你可以用C语言搜索bitshift操作符并了解操作符在做什么,但这可能无助于你理解代码。真的,代码只是包含了非常复杂的方法,可以非常快地完成任务。

你是什么意思?它已经很高级了!:P@s科学家好的,也许高级是个错误的术语,但我的意思是,更多的是不具体处理位,而是那些位所持有的值。这是一堆算术魔术。奥列克西说的。如果你不熟悉位运算,这不是要学的东西。这就像试图理解如果你以前从未使用过钢结构,那么还有吊桥的设计。在你尝试跑马拉松之前,你需要爬行。这个问题应该重新讨论。位洗牌的复杂性与此无关。随着处理器对此类黑客行为变得越来越敏感,这本书已经过时。在FP和int寄存器之间移动速度很慢,而且会变得越来越慢在深入研究IEEE 754格式之前,要检查性能是否真的提高了。