gxc

永远不要认为有什么事情是理所当然的!

  :: 首页 :: 博问 :: 闪存 :: 新随笔 :: 联系 :: 订阅 订阅 :: 管理 ::
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;
}

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

double InvSqrt(double number)
{
    __int64 i;
    
double x2, y;
    
const double threehalfs = 1.5F;

    x2 
= number * 0.5F;
    y  
= number;
    i  
= * ( __int64 * ) &y; 
    i  
= 0x5fe6ec85e7de30da - ( i >> 1 ); 
    y  
= * ( double * ) &i;
    y  
= y * ( threehalfs - ( x2 * y * y ) ); // 1st iteration
    y  = y * ( threehalfs - ( x2 * y * y ) ); // 2nd iteration, this can be removed
    return y;
}

posted on 2007-02-06 12:16  gxc  阅读(488)  评论(0编辑  收藏  举报