电脑圈圈的家当 https://bbs.21ic.com/?157621 [收藏] [复制] [RSS] 有关电子设计的一个BLOG.

日志

一种神奇的开方计算方法

热度 2已有 1151 次阅读2017-5-29 12:11 |系统分类:兴趣爱好| 计算方法

   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
   return y;
}

经过验证,的确可以实现开方的功能,且精度很好。单
看代码,很费解的,把一个浮点数的内存数据往右移
一位,是个啥鬼东西?费解。然后再用0x5f3759df这个
诡异的数字去减掉这个移位出来的数字,是个啥玩意?
然后再把这个结果当作一个浮点数来看,又是个什么鬼?
就最后那两次迭代能看懂,但也不是随便就能推出来的。

下面这篇文章有详细的推导过程和扩展方法,值得一看。

路过

鸡蛋
2

鲜花

握手

雷人

刚表态过的朋友 (2 人)

评论 (0 个评论)