谜题

作者: Isy | 来源:发表于2016-07-30 09:57 被阅读21次
    float Q_rsqrt( float number )
    {
    long i;
    float x2, y;
    const float threehalfs = 1.5F;
    x2 = number * 0.5F;
    y = number;
    i = * ( long * ) &y; // evil floating point bit level hacking
    i = 0x5f3759df - ( i >> 1 ); // what the fuck?
    y = * ( float * ) &i;
    y = y * ( threehalfs - ( x2 * y * y ) ); // 1st iteration
    // y = y * ( threehalfs - ( x2 * y * y ) ); // 2nd iteration, this can be removed
    #ifndef Q3_VM
    #ifdef __linux__
    assert( !isnan(y) ); // bk010122 - FPE?
    #endif
    #endif
    return y;
    }
    
    //
    // 计算参数x的平方根的倒数
    //
    float InvSqrt (float x)
    {
    float xhalf = 0.5f*x;
    int i = *(int*)&x;
    i = 0x5f3759df - (i >> 1); // 计算第一个近似根
    x = *(float*)&i;
    x = x*(1.5f - xhalf*x*x); // 牛顿迭代法
    return x;
    }
    
    //
    // Carmack在QUAKE3中使用的计算平方根的函数
    //
    float CarmSqrt(float x){
    union{
    int intPart;
    float floatPart;
    } convertor;
    union{
    int intPart;
    float floatPart;
    } convertor2;
    convertor.floatPart = x;
    convertor2.floatPart = x;
    convertor.intPart = 0x1FBCF800 + (convertor.intPart >> 1);
    convertor2.intPart = 0x5f3759df - (convertor2.intPart >> 1);
    return 0.5f*(convertor.floatPart + (x * convertor2.floatPart));
    }
    
    
    
    

    相关文章

      网友评论

          本文标题:谜题

          本文链接:https://www.haomeiwen.com/subject/exxtsttx.html