GameDev - gamefish

What you get if you don't get what you want is experience.

转载 《雷神之锤III》里求平方根的函数 收藏

新一篇: 自行车维护指南 | 旧一篇: 世界顶级游戏发行商TOP20

更新:有人问这个算法的原理。其实原理很简单。就是牛顿迭代求根。卡马克算法牛X的地方就是他选了一个常数作为起始值。而这个起始值让他只用一次迭代就够了。

这里看来的。QuakeIII自然就是传奇高手卡马克的杰作之一了。在有的CPU上,这个函数比普通的(float)(1.0/sqrt(x)快4倍!快的原因之一是用了一个神秘常数,0x5f3759df。普渡大学的Chris Lomont在这篇论文里讨论了这个常数的意义,尝试用严格的方法推导出这个常数(他还提到有人认为这个函数是在NVidia工作过的Gary Tarolli写的)。Chris推出的常数是0x5f37642f),和Q_rsqrt里的稍有不同,而且实际表现也稍有不如。卡马克到底怎么推出这个常数的就是谜了。这种高手不写书,实在可惜。
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;
}

Trackback: http://tb.blog.csdn.net/TrackBack.aspx?PostId=628178

发表于 @ 2006年03月31日 00:44:00|评论(loading...)|编辑

新一篇: 自行车维护指南 | 旧一篇: 世界顶级游戏发行商TOP20

评论:没有评论。

发表评论  


当前用户设置只有注册用户才能发表评论。如果你没有登录,请点击登录
Csdn Blog version 3.1a
Copyright © gamefish