Monday, May 24, 2010

神秘的 0x5f3759df, 不可思议的 Quake III 源码

很早以前看到过这篇文章, 最近学牛顿迭代法, 于是又想到了, 经典啊经典.

     Quake III公开源码后,有人在game/code/q_math.c里发现了这样一段代码。它的作用是将一个数开平方并取倒,经测试这段代码比(float) (1.0/sqrt(x))快4倍:
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?
  

No comments:

Blog Archive