黑豹程序员-平方根倒数速算法

本文讲述了程序员约翰·卡马克在《雷神之锤III竞技场》源代码中使用的FastInverseSquareRoot算法,该算法显著减少浮点运算消耗,但其背后的神秘魔术数字0x5f3759df的来源至今未解。
部署运行你感兴趣的模型镜像

在这里插入图片描述
程序员约翰·卡马克(John Carmack)在《雷神之锤 III 竞技场》源代码中的平方根倒数速算法(Fast Inverse Square Root,Fast InvSqrt()),看过之后大为惊奇。

该算法的意义在于减少了求平方根倒数时浮点运算操作带来的巨大的运算消耗,毫无疑问,这对游戏图形运算具有非凡意义。

其中的魔术数字——0x5f3759df——到底是什么鬼——迄今为止仍未能明确这个神秘的特殊常数起源何处…

您可能感兴趣的与本文相关的镜像

Kotaemon

Kotaemon

AI应用

Kotaemon 是由Cinnamon 开发的开源项目,是一个RAG UI页面,主要面向DocQA的终端用户和构建自己RAG pipeline

### 平方根倒数速算法的原理 平方根倒数速算法是一种高效的数值近似方法,主要用于快速计算 \( \frac{1}{\sqrt{x}} \),即一个数的平方根倒数。该算法的核心思想是利用浮点数在内存中的二进制表示形式以及一种特殊的初始猜测值来加速计算过程。 #### 初始猜测值的选择 算法的关键之一是一个被称为“魔术数字”的常量 `0x5f3759df`。这个常量用于生成一个接近真实结果的初始估计值。具体来说,通过将浮点数转换为整数并执行简单的位操作,可以得到一个合理的初值[^1]。这种技巧显著减少了后续迭代所需的计算量。 #### 牛顿迭代法的应用 为了提高精度,通常会在初步估算之后应用牛顿迭代法。这是一种经典的优化技术,能够逐步逼近目标函数的真实值。对于平方根倒数的情况,其更新公式可写成: \[ y_{n+1} = y_n \cdot \left( 1.5 - \frac{x}{2} \cdot y_n^2 \right) \] 其中 \( y_n \) 是当前估计值,\( x \) 是待处理的数据。经过几次这样的修正后,最终的结果将会非常接近实际值[^4]。 ### Python实现示例 下面展示了一个基于上述理论构建的Python版本解决方案: ```python class Solution(): def mySqrt(self, num): t = num t = 0x5f3759df - (t >> 1) # 应用魔术数字进行初始化 while not (t * t <= num and (t + 1) * (t + 1) > num): # 调整直到满足条件 t = (num / t + t) / 2 # 执行一次牛顿迭代 return t ``` 此代码片段定义了一个类 `Solution` ,它包含一个名为 `mySqrt` 的成员函数用来完成指定功能[^3]。 ### C++实现实例 另外还提供了一段C++风格的例子供参考: ```cpp #include <iostream> float Q_rsqrt(float number){ long i; float x2,y; const float threehalfs = 1.5F; x2 = number * 0.5F; // 计算一半的number y = number; i = *(long*)&y; // 浮点转整型视图 i = 0x5f3759df - (i>>1); // 魔术变换 y = *(float*)&i; // 整形再转回浮点 y = y * (threehalfs - (x2*y*y)); // 运行牛顿步长 return y; } int main(){ float test_val[] = {4.0, 16.0, 25.0}; for(auto val : test_val){ std::cout << "Reciprocal square root of " << val << ": " << Q_rsqrt(val) << "\n"; } return 0; } ``` 这段程序展示了如何在不同数据上测试我们的新创建的功能,并打印相应的输出结果[^4]。
评论
成就一亿技术人!
拼手气红包6.0元
还能输入1000个字符
 
红包 添加红包
表情包 插入表情
 条评论被折叠 查看
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值