这不是一条蹭热点的60天新片,而是算法解说区的常青神课:Nemean 频道的《Fast Inverse Square Root — A Quake III Algorithm》。每当“代码里的暴力美学”话题回潮,它就会被算法翻出来,喂给新一代程序员——播放量长期停留在数百万量级,评论区至今仍在更新。它讲的是一段1999年《雷神之锤3》源码里“看一眼终身难忘”的函数:不用除法、不用开方,靠一行魔数算出 1/√x。本文带你把这条视频的知识完整吸收:代码为什么能跑、魔数从哪来、哪些传说是真的、哪些早就过时了。看过视频的人,能多懂一层;没看过的人,等于看完了。
| 项目 | 内容 |
|---|---|
| 视频标题 | Fast Inverse Square Root — A Quake III Algorithm |
| 中文译名 | 快速平方根倒数——一条来自《雷神之锤3》的算法 |
| 频道 | Nemean |
| 发布时间 | 2017年(约) |
| 播放量 | 数百万量级(历史公开数据之约数) |
| 主题标签 | 算法、图形学、C语言、数值分析 |
编辑注:本轮编辑端实时抓取受限,以上热度与日期为历史公开数据的约数,精确数字请以频道页面为准。选题依据其长年“常青爆款”属性。
视频的推进像一部紧凑的悬疑短片,我们按叙事顺序拆成五幕。
视频开场直接把代码拍在桌面上。1999年 id Software 的《雷神之锤3》(Quake III Arena)源码里,有个函数叫 Q_rsqrt,任务是求 1/√x——图形学里最常见的运算之一。三维空间里每一条向量要做光照、碰撞、归一化,都绕不开“除以自己的长度”,一帧画面要算几十万次,一秒就是上千万次。1999年的家用处理器,浮点除法和开方都是几十个时钟周期的重活,于是这段代码选择了邪路:
i = 0x5f3759df - ( i >> 1 );
把浮点数按位硬看成整数,右移一位,再用一个十六进制常数一减。旁边那句注释的大意是“邪恶的浮点位级黑客操作”,紧跟着还有一句著名的惊叹。第一次看到这行代码的人几乎都会经历同样的心理过程:这是乱码吧?它真的能跑?视频的全部价值,就是回答这两个问题。
答案的第一半是 IEEE 754——1985年由英特尔顾问、伯克利教授 William Kahan 主导定稿的浮点数标准(Kahan 后来凭数值计算贡献拿到1989年图灵奖)。32位浮点数不是一串均匀的刻度,它由三段拼成:1位符号、8位指数、23位尾数。
而整数的位模式,是我们熟悉的均匀二进制。两种编码看似毫不相干,但视频第二幕点破了那个“所有人第一次都会愣住”的事实:如果你把一个正浮点数的32位位模式直接当成整数来读,得到的结果约等于它的对数乘以一个常数。原因不难想:指数段按2的幂排列,尾数段在指数段之间线性铺开,两者拼起来恰好是对数函数的“折线近似”——大刻度对数、小刻度线性。这不是巧合,这是浮点数编码的天然副产品。
第三幕是最烧脑也最漂亮的一段。既然位模式 ≈ 对数,那么“开平方再取倒数”就可以在对数世界里完成:log₂(1/√x) = −½·log₂(x)。对数世界里除以2再取负,翻回位的世界,就是“右移一位再取负”——这正是 i >> 1 和那个减号的来历。
剩下的只有那个常数。按上面的近似一路推下来,基准值应该是 1.5 × 2²³ × 127,恰好等于十六进制的 0x5F400000。但真实代码里写的是 0x5f3759df,比理论值小了一截。这段修正来自对近似误差的折中:尾数段的线性近似存在系统性偏差,把常数往回挪一点,能让全范围的误差更均匀。视频用几页推导把这件事讲透了:魔数不是咒语,是一个经过调校的数学近似常数——它可推导、可复算,只是长得凶。
位级魔法给出的只是初猜值,误差大约在几个百分点。要精度,得请出数值分析的老祖宗:牛顿-拉弗森迭代法(17世纪牛顿与拉弗森先后提出,是求方程近似解的通用武器)。对 f(y) = 1/y² − x 做一次牛顿步,就得到代码里那行更新式:
y = y * ( threehalfs - ( x2 * y * y ) );
妙处在于:初猜值已经足够好,一次迭代就能把相对误差压到约0.17%的水平(据 Lomont 的分析),对游戏画面里的向量归一化绰绰有余。两次迭代当然更准,但没人需要——当时的开发者甚至把第二次迭代注释掉留作备用。视频在这里完成闭环:对数近似负责“猜得准”,牛顿法负责“修得快”,两者各干一半活。
最后一幕是考据时间。江湖传言这个函数出自 id Software 传奇程序员 John Carmack 之手,但 Carmack 本人在公开场合明确否认过——他说自己也是从别处看来的。流传最广的考证把源头指向上世纪80年代末90年代初的 SGI(硅图)工作站时代,当事人 Greg Walsh 的口述是最常被引用的版本,并且线索还能再往前追溯到数值计算圈更早的类似写法。要说明的是,这类溯源全靠口述与邮件考古,没有正式论文背书,视频对此的态度也是“最可信的版本”而非“定论”。2005年 id Software 把《雷神之锤3》以 GPL 协议开源,这行代码从此成了全人类可以随手翻阅的“考古地层”。
这条视频表面讲一段游戏代码,底下垫着的是一整条数值分析的历史脉络,每一层都有真实的名字。
IEEE 754 与 William Kahan。整个位级戏法的地基。没有“位模式近似对数”这个编码特性,一切无从谈起。Kahan 一生都在跟“浮点数如何既快又不出错”较劲,讽刺的是,这段代码恰恰是在 Kahan 们定义的精确编码之上,做了一次有意的“不精确”。
牛顿-拉弗森迭代。最后那行 threehalfs 更新式,是教科书级的牛顿法应用:利用函数在局部近似为切线的思想,把“解方程”变成“反复修正”。它是所有数值计算课程的第一课,而这段代码是它最著名的实战案例之一。
Chris Lomont 的2003年论文。数学家 Chris Lomont 在论文《Fast Inverse Square Root》里系统分析过这个魔数:他用穷举和推导寻找最优常数,发现 0x5f3759df 并非严格最优——存在若干略优的候选(如常被引用的 0x5f37642f),但提升量在小数点后三四位,实战中可以忽略。这篇论文反过来证明了原作者的厉害:那个“拍脑袋”常数离理论最优近得可怕。双精度版本也有对应魔数,位数更长,思路一致。
硬件化的结局。故事还有个续集:就在《雷神之锤3》发售的同一年(1999年),英特尔在奔腾III的 SSE 指令集里加入了 RSQRTSS 指令——把同样的“查表近似+牛顿精修”方案直接焊进了硬件,一个周期级完成。Intel 官方手册对它的精度说明与这段软件实现的误差量级惊人地一致。换句话说,这段代码的使命在它成名之前就已经被硬件接管了。据多方复盘,此后图形 API 与编译器的底层库都逐步转向硬件指令。
证据充分的部分。代码本身在 id Software 官方开源仓库里白纸黑字可查;数学推导可以在纸面完整复现;Lomont 论文的常数搜索任何人都能复算。这部分是铁证,视频讲得也克制。
被神话的部分。第一,“史上最神秘的代码”这个叙事被夸大了。拆开看,它就是对数线性近似加一次牛顿迭代——1980年代数值计算与图形圈子里并不罕见的组合拳,神秘感更多来自 C 语言类型双关的障眼法,而非算法本身超纲。第二,“作者之谜”至今没有定论,口述溯源不能当史实引用,视频在此处理得当,转述时容易失真。
已经过时的部分。这是最需要给读者打预防针的一点:这段代码的性能优势在今天已经不成立。现代 x86 芯片有专用硬件指令,编译器会自动选用,现代写法该用内置函数就用内置函数。更要命的是,原代码通过指针强转把 float 看成 long,在 C 语言标准里属于未定义行为——类型双关违反严格别名规则,在高优化等级下编译器有权做出让结果变糟的重排。今天想玩同样的把戏,正确姿势是用 memcpy。也就是说:这是一件该进博物馆的兵器,你去看它的锋利,但别拿它切菜。
精度语境要交代清楚。约0.17%的误差对法线归一化无感,但放进需要长时间积分的物理仿真里会逐步积累;对非规格化数、溢出边界的行为也不干净。任何“这个技巧万能”的转述都值得警惕。
1. 做一次自己的“位考古”。找十分钟,用 memcpy 把一个 float 的四个字节拷进 int,按位打印出来,再和 log₂(x)+127 对比。亲手验证一次“位模式≈对数”,胜过看十遍推导——这个直觉日后读任何序列化、编码、哈希代码都用得上。
2. 把“传说级优化”放进同一个基准里测。写一个20行的 benchmark:Q_rsqrt 原版、memcpy 合规版、硬件指令版,跑一下数据。多数人会惊讶于结果与直觉的差距。这段代码留给后人最大的教训是:性能直觉有保质期,1999年的结论不能免检用到2026年。
3. 读源码时把注释当地层。去开源仓库翻 q_math.c,注意原注释里那句自嘲和那句惊叹——它们记录的正是作者自己的不确定。遇到任何“神技”,先问一句:它当年解决的那个约束(除法慢、没有硬件单元、内存以字节计),今天还成立吗?约束消失,神技就该退场;约束还在,你就学到了一条真规则。
flowchart TD
A["问题: 1/√x 太慢"] --> B["观察: 浮点位模式<br/>近似对数"]
B --> C["对数世界开方<br/>移位取负"]
C --> D["魔数补正<br/>0x5f3759df"]
D --> E["牛顿迭代<br/>一次精修"]
E --> F["误差约0.17%<br/>够游戏用"]
A --> G["硬件接管<br/>RSQRTSS指令"]
G --> H["今天正确姿势<br/>内置函数加测量"]
从“问题”到“魔法”再到“过时”,这条视频真正讲的其实不是一行代码,而是技术方案的生命周期:聪明的近似诞生于约束,约束消失后,聪明沉淀为数学,代码沉淀为传说。
code/game 目录下找 q_math.c,Q_rsqrt 原码就在里面,连同那句著名的注释。RSQRTSS/RSQRTPS 指令的精度与实现说明(按手册名检索,无稳定公开直链)。本文由「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 等场景全覆盖。
