news 2026/5/20 0:43:36

0x5f3759df --比sqrt还快ovo

作者头像

张小明

前端开发工程师

1.2k 24
文章封面图
0x5f3759df --比sqrt还快ovo

- 0x5f3759df 是快速平方根倒数算法的核心,它通过位运算直接给出 1/√x 的初始近似值。
- 配合牛顿迭代法,只需 1~2 次迭代就能达到极高精度,整体速度超传统 sqrt 。
- 这种“位级黑科技”是当年程序员在硬件受限下的极致优化,至今仍是计算机科学中的经典案例。



一、神奇的 0x5f3759df

在快速平方根倒数算法中, 0x5f3759df 是那个让无数程序员拍案叫绝的魔法数字(Magic Number)。它能在没有浮点运算单元(FPU)的年代,用纯整数位运算就给出平方根倒数的一个极佳初始近似值,再配合牛顿迭代法快速收敛到精确结果,整体速度比传统 sqrt 快数倍。





二、算法核心代码解析

float Q_rsqrt( float number ) {
long i;
float x2, y;
const float threehalfs = 1.5F;

x2 = number * 0.5F;
y = number;
i = * ( long * ) &y; // 邪恶的浮点位级黑科技
i = 0x5f3759df - ( i >> 1 ); // what the fuck?
y = * ( float * ) &i;
y = y * ( threehalfs - ( x2 * y * y ) ); // 第一次迭代
// y = y * ( threehalfs - ( x2 * y * y ) ); // 第二次迭代,可选

#ifndef Q3_VM
#ifdef __linux__
assert( !isnan(y) ); // bk010122 - FPE?
#endif
#endif
return y;
}



这段代码的关键思路:

1. 位级黑科技:把浮点数的二进制位直接当成整数来操作,这是实现近似的基础。
2. 魔法数字计算: 0x5f3759df - (i >> 1) 一步就给出了 1/√number 的初始估计值。
3. 牛顿迭代法:用 y = y * (1.5 - (x2 * y * y)) 迭代修正,一次迭代就能把误差降到千分之二以内。



三、浮点数格式与初始估计原理

要理解魔法数字的来源,先看 32 位单精度浮点数的结构:

- 符号位 s(1 位):0 为正,1 为负
- 指数位 E(8 位):存储 E - 127 (偏移量 127)
- 尾数位 M(23 位):存储小数部分,实际值为 1 + M/2²³

浮点数的数值公式:

x = (-1)^s \left(1 + \frac{M}{2^{23}}\right) 2^{E-127}


我们想求 y = \frac{1}{\sqrt{x}},两边取二进制对数并近似,最终可以推导出:

- 把浮点数 x 的整数表示 i 右移一位,再用魔法数字 0x5f3759df 去减,就能得到 y 的整数近似表示。
- 这个魔法数字是通过数学推导和大量实验找到的,能让初始估计的相对误差最小。




四、魔法数字的求解:三分搜索

魔法数字不是凭空来的,而是通过三分搜索在合理区间内找到的最优值。

if __name__ == "__main__":
mant = np.arange(0, 1 << 23, dtype=np.uint32)

# 给一个合理的搜索区间,围绕 0x5f3759df 一带
lo = 0x5f000000
hi = 0x5f900000

best_magic, best_err = ternary_search_magic(lo, hi, mant)
print(f"best_magic = 0x{best_magic:08x}")
print("最小最大相对误差 =", best_err)


实验结果对比(以 32 位为例):

来源 值 初始估计相对误差 一次迭代相对误差
数学证明值 0x5f37642f 3.421282e-02 1.775889e-03
三分查找 0x5f375a87 3.436540e-02 1.751287e-03
Magic Number 0x5f3759df 3.437577e-02 1.752338e-03
64位数学证明值 0x5fe6ec85e7de30da 3.421281e-02 -

可以看到,0x5f3759df 与理论最优值几乎一致,是工程上的最优选择。



五、实验效果:64位对比 Magic Number

在 64 位双精度浮点数中,也有对应的魔法数字 0x5fe6ec85e7de30da 。它同样遵循位运算近似 + 牛顿迭代的思路,只是浮点数的指数位(11 位)和尾数位(52 位)长度不同,魔法数字的取值也随之调整

版权声明: 本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若内容造成侵权/违法违规/事实不符,请联系邮箱:809451989@qq.com进行投诉反馈,一经查实,立即删除!
网站建设 2026/5/8 13:25:05

费雪的创新型公司识别方法

费雪的创新型公司识别方法 关键词:费雪、创新型公司、识别方法、投资分析、公司评估 摘要:本文深入探讨了费雪的创新型公司识别方法。首先介绍了该方法的背景,包括其目的、预期读者和文档结构等内容。接着阐述了核心概念,展示了概念原理和架构的文本示意图与 Mermaid 流程图…

作者头像 李华
网站建设 2026/5/11 10:46:04

AI的“语言的流利度”不能等同于“思想的深度”

以下是为什么说我们可能“误会”了 AI 的三个核心真相&#xff1a;1. 它是“概率机器”&#xff0c;不是“逻辑器官”人类的智能是**“自顶向下”的&#xff1a;我们先有目标、有逻辑、有对世界的物理感知&#xff0c;最后才用语言表达出来。 而 AI&#xff08;Transformer&…

作者头像 李华
网站建设 2026/5/11 0:38:52

“Lm/Lr/Cr 初算 + 校核清单”

0)先定“你要的 LLC ”🎯 LLC 其实就三句话: 想高效:就把 RMS 电流压下去(MOS、变压器、整流都跟着凉快)。 想稳 ZVS:就保证死区里电流能把 Coss 的电荷搬完。 Lm 就是那个“既能压 RMS、又会影响 ZVS”的关键旋钮。拓扑和典型波形见上面配图。 1)最少的公式,但够用…

作者头像 李华
网站建设 2026/5/14 14:33:27

【开题答辩全过程】以 某县农村留守儿童爱心帮扶平台为例,包含答辩的问题和答案

个人简介一名14年经验的资深毕设内行人&#xff0c;语言擅长Java、php、微信小程序、Python、Golang、安卓Android等开发项目包括大数据、深度学习、网站、小程序、安卓、算法。平常会做一些项目定制化开发、代码讲解、答辩教学、文档编写、也懂一些降重方面的技巧。感谢大家的…

作者头像 李华
网站建设 2026/5/19 5:58:35

[Android] vFlow v1.4.0 可视化工作流自动化工具

[Android] vFlow v1.4.0 可视化工作流自动化工具 链接&#xff1a;https://pan.xunlei.com/s/VOjjR7O4Q_YOy8rd8tdQB1EtA1?pwdmfgj# vFlow 是一款为 Android 平台设计的、强大且高度可扩展的自动化工具。它允许你通过图形化界面&#xff0c;将一系列“动作模块”自由组合成强…

作者头像 李华
网站建设 2026/5/15 7:10:45

JBoltAI框架:模型队列服务助力Java企业级AI开发

在Java企业级AI应用开发中&#xff0c;如何高效处理大量AI请求并合理分配计算资源&#xff0c;是开发者面临的关键挑战。JBoltAI框架的模型队列服务&#xff08;MQS&#xff09;通过请求排队和多模型负载均衡机制&#xff0c;为这一难题提供了稳健的解决方案。 请求排队&#…

作者头像 李华