Carmack在QUAKE III中使用了下面的算法来计算平方根的倒数。
float Q_rsqrt(float number)
{
long i;
float x2, y;
x2 = number * 0.5F;
y = number;
i = * (long *) &y;
i = 0x5f3759df - (i >> 1);
y = * (float *) & i;
y = y * (1.5F - (x2 * y * y));
y = y * (1.5F - (x2 * y * y)); // this can be moved
return y;
}
看到没有,这里只需要一次迭代就得到了平方根倒数的近似值!!
我第一次看到它的时候,立刻被震住了!Carmack简直是太有才了!
该算法的本质其实就是牛顿迭代法(Newton-Raphson Method,简称NR),而NR的基础则是泰勒级数(Taylor Series)。普渡大学的Chris Lomont尝试用严格的方法推导出这个常数,但得到的结果是0x5f37642f,和Q_rsqrt里的稍有不同,而且实际表现也稍有不如。
至于天才的卡马克是怎么推出这个神奇的数字的,也许真是某一刻上帝灵魂附体:)