计算机与数学 —— 雷神之锤3源码中的快速逆平方根算法

原创 2016年06月01日 18:39:12

这篇博客介绍了在雷神之锤3源代码中快速求逆平方根的算法。


源码

雷神之锤3中的逆平方根算法如下:

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

函数接受一个浮点数作为输入,输出的结果是平方根的倒数。

单精度浮点数

在计算机中,单精度浮点数使用32位来储存表示:

Floating Point

在这32位中,最高位为符号位,后面的8位为整数ex,代表浮点数的指数,而最后的23位表示的是小数部分mx,小数部分第一位表示21,第二位表示22……

所以如果x是一个正浮点数,则有:

x=2ex(1+mx)

另外,如果需要把一个浮点数转化为整数形式,则需要做如下的运算:

Ix=EXL+Mx=L(ex+B+mx)

在上面的公式中,L指的是指数部分需要的唯一次数,这里是223,B是127,而M是小数部分对应的整数版本。

牛顿法

牛顿迭代法(简称牛顿法),是用于计算机求解任意连续函数的根值的一种方法。

假设对于如下的函数,我们想要求这个函数的根:

Function

该如何求得这个根呢?首先,我们先猜一个解x0,并且认为它是函数的解。

但是由于它其实并不是函数的解,那么现在,我们需要将这个解进行迭代,从而让其逼近真正的解。

在此处,我们可以在(x0,y0)处作其切线,求得该直线的方程:

yf(x0)=f(x0)(xx0)

并且求直线的根,此时会发现已经对于真正的解逼近了一步。

推广到n,继续迭代,就可以足够逼近真正的解了:

xi+1=xif(xi)f(xi)

此时发现f(xi)f(xi)可以被一个统一的函数g(xi)来表示:

g(x)=f(x)f(x)

令ε为当前的解与真正解r的距离:

ϵi=xir

综合上面三个方程,可得:

ϵi+1=ϵig(xi)

因此只要ε值小于某个特定的值,我们可以认为此时的x和方程的解已经很接近了。

算法分析

如果需要求得一个浮点数的平方根倒数,方程如下:

y=1x

转化为关于y的方程,有:

f(y)=1y2x=0

转化为牛顿发使用的方程,有:

yn+1=yn(3xy2n)2

此时,对原本的方程等号两边同时取2的对数,就有:

log2y=12log2(1+mx)

因为mx0并且mx<1,那么在这个区间内,可以取近似为:

log2(1+mx)mx+σ

根据方差的计算,当σ=0.0430357时,整体的偏差是最小的,此时上面的等号两边应该相当。

因此,把上面的完全整合起来,最终的Ix可以写成:

Llog2x+L(Bσ)

Iy32L(Bσ)12Ix

最终,写成代码就是:

i = 0x5f3759df - ( i >> 1 );

32L(Bσ)=0x5f3759df

<全文完>

版权声明:本文为博主原创文章,未经博主允许不得转载。

相关文章推荐

雷神之锤 - 神一般存在的Sqrt函数

转载: http://www.cnblogs.com/pkuoliver/archive/2010/10/06/1844725.html 我们平时经常会有一些数据运算的操作,需要调用sqrt,ex...

quake3源代码分析

quake3源码分析(1) quake3 游戏demo演示版,没有玩过quake3游戏的或想了解quake3画面的 , 可到此处下载, http://ishare.iask.sina.c...

quake3 code 源代码 编译调试。保证通过。

原地址:http://www.cnblogs.com/roland1982/articles/5045624.html quake3 code 源代码 编译调试 。保证通过。 Qu...
  • mayao11
  • mayao11
  • 2015年12月14日 16:26
  • 2064

Delphi7高级应用开发随书源码

  • 2003年04月30日 00:00
  • 676KB
  • 下载

Delphi7高级应用开发随书源码

  • 2003年04月30日 00:00
  • 676KB
  • 下载

关于平方根倒数速算法(雷神之锤3,牛B)

关于平方根倒数速算法(雷神之锤3,牛B) 收藏 chelseablood 发表于 2年前阅读 4135收藏 10点赞 1评论 1 摘要:...

Delphi7高级应用开发随书源码

  • 2003年04月30日 00:00
  • 676KB
  • 下载

非官方新人参考之quake3入门碎解

2006年中秋节写的帖子,有一些疏漏之处想改正一下,另把一些基础知识和英文缩写的注释提到正文前,原文不让编辑了,所以修改了一下发在这里。 很多人都说q3门槛高。尤其是当cs兴盛之后。 q3的高...
  • cbbbc
  • cbbbc
  • 2015年09月01日 09:55
  • 1513

从Quake 3源代码分析AI Bot库

从Quake 3源代码分析AI Bot库 2008年1月14日,Alex J. Champandard 查看已发布的标题的AI源代码是从渠道中学习技巧的好方法。这个新专栏可以帮助您...

C++ —— 自动Singleton的实现

这篇博客实现了一种自动的Singleton的设计模式的实现,相比起通常的Singleton的实现,这种方法更加简单而且更加灵活。...
  • noahzuo
  • noahzuo
  • 2016年05月04日 13:21
  • 515
内容举报
返回顶部
收藏助手
不良信息举报
您举报文章:计算机与数学 —— 雷神之锤3源码中的快速逆平方根算法
举报原因:
原因补充:

(最多只允许输入30个字)