首页 › programming › 魔数开根号:浮点黑客神课

魔数开根号:浮点黑客神课深读

在程序员的江湖里,流传着一串比任何咒语都神秘十六进制数字:0x5f3759df。它来自《雷神之锤3》源码里一个只有十几行的函数,注释里写着一句光秃秃的"what the fuck?"。YouTube上一条专门拆解它的算法讲解视频,多年来被无数开发者反复考古,堪称长青神课。这条视频用十几分钟讲透了一个问题:1999年的游戏机,凭什么每秒算出上百万次平方根倒数?

本文带你把这条视频的知识彻底吃透:魔数从哪来、为什么有效、传说里掺了多少水分,以及它能给今天的你什么启发。

视频基本信息

项目 内容
标题 Fast Inverse Square Root — A Quake III Algorithm(雷神之锤3的快速平方根倒数算法)
频道 Nemean(海外程序员向讲解频道)
上线时间 2010年代上线,长青内容,具体日期以频道页面为准
播放数据 百万级以上播放,长期被社区与算法反复推荐,具体数字以频道页面为准
观看方式 YouTube 搜索“Fast Inverse Square Root A Quake III Algorithm”即可直达

核心主张拆解:视频讲了什么

第一个节点:问题——每帧上百万次的除法

视频从一个再普通不过的图形学操作讲起:向量归一化。光照计算、法线修正、碰撞检测,都要求把向量变成“长度为1”的单位向量。做法是把每个分量除以向量长度,也就是乘以它的倒数——1/√x。

关键在量级:一个3D场景每帧要对成千上万个顶点、法线、光向量做这件事,分辨率一高,一秒之内这个运算要执行数百万次。而1999年的CPU没有专门的快速开方单元,走标准浮点流程,sqrt加除法都是出了名的慢指令。视频在这里立住了全片的冲突:渲染想要实时,数学不给力。

第二个节点:第一步障眼法——把浮点当整数看

接下来是全片最烧脑也最精彩的一段。C语言里那段著名代码先做了件“违法”的事:把一个float的内存位,硬生生当成long整数来读(指针强转重解释)。视频放慢速度讲清了这一步为什么疯狂又合理。

浮点数在内存里的排布是:1位符号、8位指数、23位尾数。当你把这套二进制位按整数解读时,会发现一个惊人的巧合——整数值大致正比于这个浮点数的对数。也就是说,浮点数的位模式,天然就是一张对数表。这一个洞察,是整条魔数传说的地基。

第三个节点:右移一位,就是对数域里除以二

既然整数值约等于对数,那么整数右移一位(除以2),就约等于在真数域开平方。视频用一个直观类比:科学家常用对数坐标纸,把乘除法变成加减法——这行代码干的是同一件事,只不过用的是CPU里最便宜的移位指令。

但我们要的不是√x,而是它的倒数1/√x,对应对数域里的“取负再减半”。翻译成整数运算,就是拿一个常数减去移位后的结果。问题只剩一个:这个常数该是多少?

第四个节点:魔数登场——0x5f3759df

这就是标题里那串十六进制的戏份。视频按推导走了一遍:设浮点数x=2^e·(1+m),取对数后 log₂x ≈ e + m + σ,其中σ≈0.045是用来抹平线性近似的修正项。把“1/√x等于对数取负减半”完整翻译回整数域,会解出一个常数——加上σ的微调,正好落在0x5f3759df附近。

用它减去移位结果再按浮点读回来,得到的就是1/√x的第一个近似值,误差只有约3.4%。视频在这里点了一句题眼:这个数字不是神迹,是数学推导加一点经验微调的产物。

第五个节点:牛顿迭代——粗坯抛光成良品

最后一步是三百多年前就发明的牛顿-拉夫逊迭代。对函数f(y)=1/y²−x求根,迭代公式化简后只有一行:y = y·(1.5 − 0.5x·y²)。跑一遍,误差从3.4%直接压到约0.17%——对游戏光照来说绰绰有余。《雷神之锤3》源码里其实预留了第二次迭代,但被注释掉了:一次就够,第二次纯属浪费帧率。

整条流水线,四次整数运算加两次浮点乘法,避开了当年最慢的开方与除法指令。视频结尾用精度对比图收尾:黑线是真值,红线是魔数近似,几乎重合。

知识与理论溯源

这条视频不是孤证式的民间传说,背后每一层都有真实的文献与工程脉络:

批判性审查:哪些可信,哪些是传说

证据充分的部分:代码本体千真万确。id Software在2005年按GPL协议开源《雷神之锤3》后,Q_rsqrt函数连同"evil floating point bit level hacking"和"what the fuck?"两句注释原文可查,数学推导任何人都能亲手验证。

被夸大或以讹传讹的部分,至少有三处:

其一,“卡马克写的”是美丽的误会。这串魔数长期被安在传奇程序员John Carmack头上,但据Carmack本人透露这并非他的手笔,2006年Beyond3D的调查也把源头指向更早的Greg Walsh。社区调查结论并非官方定论,但“卡马克原创”这一流传最广的版本,基本可以断定不成立。

其二,“唯一魔数”的神话。Lomont的研究表明,在0x5f37附近存在一整个表现相近的常数家族,0x5f3759df只是其中被实测选出的优等生,不是孤本。“这串数字独一无二”的说法是传播过程中的神化。

其三,“今天还该这么写”的错觉。在现代CPU上,硬件开方指令加编译器优化早已跑赢这段代码;更少有人提的是,源码里的指针强转重解释在现代C/C++里违反strict aliasing规则,属于未定义行为——编译器有权优化掉它。魔数是博物馆展品,不是生产代码模板。

另外,视频与网文常用的“误差仅0.17%”是一个理想化的最大误差量级,具体精度随输入分布而变化,若要用于精度敏感场景需自行实测。这也是所有“神课”数字的正确打开方式。

认知提升与实用启示

第一,换表示法,往往比换算法更狠。 魔数函数的精髓不是某个聪明的循环,而是换了一套坐标系:在对数域里,开方变成了移位,乘法变成了加法。你遇到性能瓶颈时,除了苦想更快的过程,值得先问一句——换个数据表示,问题会不会自动消失?压缩编码、位图索引、对数表查找,全是这一思想的变体。

第二,“近似+校正”是实时系统的万能钥匙。 先确定误差预算(光照能容忍0.17%,航天导航不行),再选能达到预算的最便宜方案,最后用迭代打磨。这条流程适用于任何你能写出粗略猜测的函数,不必迷信精确算法一步到位。

第三,对祖传代码保持考古习惯。 面对看不懂的magic number,别急着供奉也别急着删掉:查源码仓库、翻社区调查、找原始论文——Beyond3D那场调查示范了完整的溯源链路。传说在传播中会不断变形,“卡马克写的”就是教训:追到源头,才知道你继承的到底是什么。

一张图看懂论证结构

flowchart TD
    A["问题:3D渲染每帧<br/>百万次求 1/√x"] --> B["常规解法:开方加除法<br/>当年CPU最慢指令"]
    B --> C["障眼法一:<br/>浮点位硬读成整数"]
    C --> D["整数近似正比对数<br/>位模式天然是对数表"]
    D --> E["障眼法二:<br/>右移一位等于对数减半"]
    E --> F["取负减半需减常数<br/>推导出魔数 0x5f3759df"]
    F --> G["牛顿迭代一次打磨<br/>误差3.4%压到0.17%"]
    G --> H["避开慢指令<br/>实时光照成为可能"]

延伸阅读

  1. id Software官方开源仓库 q_math.c——亲手跑一遍Q_rsqrt,读原文注释,比任何二手解读都过瘾。
  2. Chris Lomont《Fast Inverse Square Root》(2003)——想看魔数的完整数学最优解,这篇十几页的短论文是唯一正解,维基词条附有链接。

参考来源

  1. Fast Inverse Square Root — A Quake III Algorithm(YouTube) — Nemean频道讲解视频,本文解读对象
  2. id-Software/Quake-III-Arena 官方源码仓库 — 2005年开源,Q_rsqrt函数原始出处
  3. q_math.c 源文件 — 含"what the fuck?"注释的原始代码
  4. Fast inverse square root — Wikipedia — 历史考证、数学推导与Lomont论文、Beyond3D调查线索汇总

本文由「51学通信」技术团队出品。51学通信由通信行业18年老兵爱卫生(微信ID: gprshome201101)维护,聚焦5G/6G核心网、3GPP标准解读、通信前沿技术深度分析。 出版作品有《5G核心网原理与实践》《IMS原理与实践》等4本通信专业书籍。知识星球「51学通信」提供深度技术答疑和行业洞察。

[!tip] 51学通信知识星球 星主:爱卫生(微信:gprshome201101)——公众号「51学通信」创办者,19 年通信行业运维与讲师经验,著有《GPRS网络信令实例详解》《EPC原理与实践》《5G核心网原理与实践》三本纸质书(各大电商平台有售)。 星球定位:深耕 5G 核心网、IMS、NFV/AI、云原生等 ICT 领域,主打运维岗位与信令分析。 当前规模:5200 篇主题 / 990 个回答,198 元/年。 加入福利:加入星球后请加爱卫生微信,拉您进知识星球年度陪伴与答疑群——不限量回复您的各种问题,另有群内分享。 AI 加持:51学通信知识星球已作为 skill 接入 WorkBuddy,使用 deepseek-4-flash 在海量星球帖子中精准找贴、找视频、找 FAQ 和案例,做总结、找文档和 PPT 等场景全覆盖。

51学通信知识星球海报-扫码加入