天天看点

《雷神之锤III》里求平方根倒数的函数

《雷神之锤III》里求平方根倒数的函数

float  Q_rsqrt(  float  number )

《雷神之锤III》里求平方根倒数的函数
《雷神之锤III》里求平方根倒数的函数
《雷神之锤III》里求平方根倒数的函数

{

《雷神之锤III》里求平方根倒数的函数

  long i;

《雷神之锤III》里求平方根倒数的函数

  float x2, y;

《雷神之锤III》里求平方根倒数的函数

  const float threehalfs = 1.5F;

《雷神之锤III》里求平方根倒数的函数
《雷神之锤III》里求平方根倒数的函数

  x2 = number * 0.5F;

《雷神之锤III》里求平方根倒数的函数

  y  = number;

《雷神之锤III》里求平方根倒数的函数

  i  = * ( long * ) &y;  // evil floating point bit level hacking

《雷神之锤III》里求平方根倒数的函数

  i  = 0x5f3759df - ( i >> 1 ); // what the fuck?

《雷神之锤III》里求平方根倒数的函数

  y  = * ( float * ) &i;

《雷神之锤III》里求平方根倒数的函数

  y  = y * ( threehalfs - ( x2 * y * y ) ); // 1st iteration

《雷神之锤III》里求平方根倒数的函数

  // y  = y * ( threehalfs - ( x2 * y * y ) ); // 2nd iteration, this can be removed

《雷神之锤III》里求平方根倒数的函数
《雷神之锤III》里求平方根倒数的函数

  #ifndef Q3_VM

《雷神之锤III》里求平方根倒数的函数

  #ifdef __linux__

《雷神之锤III》里求平方根倒数的函数

    assert( !isnan(y) ); // bk010122 - FPE?

《雷神之锤III》里求平方根倒数的函数

  #endif

《雷神之锤III》里求平方根倒数的函数

  #endif

《雷神之锤III》里求平方根倒数的函数

  return y;

《雷神之锤III》里求平方根倒数的函数

}

对于 double ,如果在单片机环境可以试试可以使用如下代码

《雷神之锤III》里求平方根倒数的函数

double  InvSqrt( double  number)

《雷神之锤III》里求平方根倒数的函数
《雷神之锤III》里求平方根倒数的函数
《雷神之锤III》里求平方根倒数的函数

{

《雷神之锤III》里求平方根倒数的函数

    __int64 i;

《雷神之锤III》里求平方根倒数的函数

    double x2, y;

《雷神之锤III》里求平方根倒数的函数

    const double threehalfs = 1.5F;

《雷神之锤III》里求平方根倒数的函数
《雷神之锤III》里求平方根倒数的函数

    x2 = number * 0.5F;

《雷神之锤III》里求平方根倒数的函数

    y  = number;

《雷神之锤III》里求平方根倒数的函数

    i  = * ( __int64 * ) &y; 

《雷神之锤III》里求平方根倒数的函数

    i  = 0x5fe6ec85e7de30da - ( i >> 1 ); 

《雷神之锤III》里求平方根倒数的函数

    y  = * ( double * ) &i;

《雷神之锤III》里求平方根倒数的函数

    y  = y * ( threehalfs - ( x2 * y * y ) ); // 1st iteration

《雷神之锤III》里求平方根倒数的函数

    y  = y * ( threehalfs - ( x2 * y * y ) ); // 2nd iteration, this can be removed

《雷神之锤III》里求平方根倒数的函数

    return y;

《雷神之锤III》里求平方根倒数的函数

}

《雷神之锤III》里求平方根倒数的函数

转载于:https://www.cnblogs.com/guoxiaocong/archive/2007/02/06/641996.html