今天在solidot上看到了这个极其巧妙的算法,能够计算平方根倒数,即1/sqrt(x),据称是Quake 3中的代码。简单测试了一下,速度要比math.h提供的sqrt函数快上一倍左右。

float InvSqrt(float x){
  float xhalf=0.5f*x;
  long i=*(long*)&x;
  i=0x5f3759df - (i>>1);
  x=*(float *)&i;
  x=x*(1.5f-xhalf*x*x);
  return x;
}

看完后觉得十分巧妙,于是开始读Chris Lomont于2003年撰写的一篇分析论文, 看到一半的时候发现fcicq比我捷足先登, 并给出了一个中文版的算法分析页面。 该网页的作者自称看完GameDev.net的算法后觉得自己火星了,看来我还真是从冥王星来的,哈雷彗星也未可知。