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

本文深入剖析雷神之锤3游戏源代码中实现的快速逆平方根算法,通过单精度浮点数的表示、牛顿迭代法的原理,详细解释了算法的工作机制,并进行了算法分析,最终展示了代码实现。
摘要由CSDN通过智能技术生成

这篇博客介绍了在雷神之锤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,小数部分第一位表示 2 − 1 2^{-1} 21,第二位表示 2 − 2 2^{-2} 22……

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

x = 2 e x ( 1 + m x ) x = 2^{e_{x}} (1+m_{x}) x=2ex(1+mx)

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

I x = E X L + M x = L ( e x + B + m x ) Ix = E_XL + M_x=L(e_x+B+m_x) Ix=EXL+Mx=L(ex+B+mx)

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

牛顿法

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

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

Function

该如何求得这个根呢?首先,我们先猜一个解 x 0 x_{0}

评论 5
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值