下列代码是在《雷神之锤 III 竞技场》源代码中的一个函数(已经剥离了 C 语言预处理器的指令)。其实,最早在 2002 年(或 2003 年)时,这段平方根倒数速算法的代码就已经出现在 Usenet 与其他论坛上了,并且也在程序员圈子里引起了热烈的讨论。

我先把这段代码贴出来,具体如下:

 1
 2
 3
 4
 5
 6
 7
 8
 9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30

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 

    // 2nd iteration, this can be removed

    // y  = y * ( threehalfs - ( x2 * y * y ) ); 

     return y;

}

这段代码初读起来,我是完全不知所云,尤其是那个魔数 0x5f3759df,根本不知道它是什么意思,所以,注释里也是 What the fuck。今天的这篇文章里,我主要就是想带你来了解一下这个函数中的代码究竟是怎样出来的。

其实,这个函数的作用是求平方根倒数,即 x−1/2x−1/2