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 位)长度不同,魔法数字的取值也随之调整

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.mzph.cn/news/1210955.shtml

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈email:809451989@qq.com,一经查实,立即删除!

相关文章

09. 枚举

1.枚举简介 2.枚举基本用法 3.普通枚举的缺点 4.强类型枚举 1.枚举简介 枚举的核心是给一组整数常量起"有意义的名字", 语法格式:// 语法&#xff1a;enum 枚举名 { 枚举常量1, 枚举常量2, ... }; enum Weekday {Monday, // 默认值为0Tuesday, // 依次递增1…

【C++】C++11 核心特性深度解析(二) - 实践

【C++】C++11 核心特性深度解析(二) - 实践pre { white-space: pre !important; word-wrap: normal !important; overflow-x: auto !important; display: block !important; font-family: "Consolas", &qu…

AI原生应用领域模型量化的安全考量

AI原生应用领域模型量化的安全考量 关键词:模型量化、AI原生应用、安全风险、对抗攻击、隐私保护 摘要:随着AI原生应用(完全基于AI技术构建的应用,如智能驾驶助手、医疗诊断系统)的普及,模型量化作为提升部署效率的核心技术被广泛使用。但量化过程可能引入精度损失、对抗…

一天一个开源项目(第1篇):everything-claude-code - 最全的 Claude Code 配置集合

引言 “好的工具配置能让 AI 助手从’能用’变成’好用’&#xff0c;从’助手’变成’伙伴’。” 这是"一天一个开源项目"系列的第1篇文章。今天带你了解的项目是 everything-claude-code&#xff08;GitHub&#xff09;。 如果你正在使用 Claude Code&#xff08;…

搭建终身学习系统时,AI应用架构师容易犯哪些错?(避坑指南)

AI应用架构师搭建终身学习系统的10个常见坑与避坑指南 副标题&#xff1a;从数据管道到模型部署的实践教训 摘要/引言 在AI从“静态工具”转向“动态系统”的今天&#xff0c;终身学习&#xff08;Lifelong Learning&#xff09; 已成为企业保持AI竞争力的核心能力——它让模型…

学霸同款2026 AI论文工具TOP9:专科生毕业论文写作全测评

学霸同款2026 AI论文工具TOP9&#xff1a;专科生毕业论文写作全测评 2026年AI论文工具测评&#xff1a;为何值得一看&#xff1f; 随着人工智能技术的不断进步&#xff0c;越来越多的专科生开始借助AI工具提升论文写作效率。然而&#xff0c;面对市场上琳琅满目的产品&#x…

前端萌新别慌!30分钟搞懂CSS阴影:text-shadow和box-shadow实

前端萌新别慌&#xff01;30分钟搞懂CSS阴影&#xff1a;text-shadow和box-shadow实 前端萌新别慌&#xff01;30分钟搞懂CSS阴影&#xff1a;text-shadow和box-shadow实战指南先别急着写代码&#xff0c;咱先吐槽五分钟先整点能跑的&#xff0c;把士气提上来text-shadow&#…

AI编程实战 : 使用 TRAE CN 将 MasterGo 设计稿转化为前端代码

文章目录 什么是 MCP前置条件1. 账号权限2. 环境要求3. 设计稿准备 MasterGo AI Bridge 支持的能力操作步骤第一步: 安装/升级 TRAE CN IDE第二步: 获取 MasterGo 的 Personal Access Token第三步: 添加 MCP Server第四步: 创建自定义智能体&#xff08;可选&#xff09;第五步…

实用指南:Linux Crontab命令详解:轻松设置周期性定时任务

pre { white-space: pre !important; word-wrap: normal !important; overflow-x: auto !important; display: block !important; font-family: "Consolas", "Monaco", "Courier New", …

分析一下当前项目如果browser或者node包需要引用common包中的方法,如何设计项目架构

当前项目架构分析:项目使用 pnpm workspace 管理 monorepo 有三个包:common(通用)、browser(浏览器专用)、node(Node.js专用) 每个包都是独立的 npm package,有自己的 package.json 当前三个包之间没有任何依…

导师推荐8个AI论文写作软件,继续教育学生轻松搞定毕业论文!

导师推荐8个AI论文写作软件&#xff0c;继续教育学生轻松搞定毕业论文&#xff01; AI 工具让论文写作不再难 在当前的学术环境中&#xff0c;继续教育学生面临着越来越高的论文写作要求。无论是本科、硕士还是博士阶段&#xff0c;撰写一篇高质量的毕业论文不仅是对知识的总…

Firewalld 配置端口转发、SNAT、DNAT

Firewalld通过富规则(rich rules)和直接规则(direct rules)支持端口转发和NAT。 下面详细说明各种配置方法: 端口转发(Port Forwarding) 方法1:使用富规则(推荐) 基础端口转发(本地转发) # 将外部访问 808…

探索AI原生应用领域AI工作流的新趋势

探索AI原生应用领域AI工作流的新趋势 引言:从“AI+应用”到“AI原生应用”的范式转移 2023年以来,AI原生应用(AI-Native Application)成为科技行业最热门的关键词之一。从Notion AI的智能笔记、GitHub Copilot X的全生命周期开发辅助,到Perplexity的实时知识问答,这些应…

AI智能体完全指南:无需编程基础,四步打造专属AI助手

本文详解AI智能体搭建方法&#xff0c;从入门到进阶&#xff0c;包括四步创建流程、个性化设置、知识库运用和指令迭代技巧。文章强调将AI视为协作者而非工具&#xff0c;根据场景选择适合的大模型&#xff0c;并提供多个国内免费平台推荐。无需编程基础&#xff0c;即可打造专…

指针与数组:为什么数组名是特殊的指针?

指针与数组&#xff1a;为什么数组名是特殊的指针&#xff1f; 在C编程中&#xff0c;指针与数组的关系是入门阶段的核心难点&#xff0c;也是高频考点。很多开发者会发现一个有趣的现象&#xff1a;数组名既能像普通变量一样通过下标访问元素&#xff0c;又能像指针一样进行地…

指针进阶:二级指针与指针的指针的应用场景

指针进阶&#xff1a;二级指针与指针的指针的应用场景 在C指针学习中&#xff0c;二级指针&#xff08;又称指针的指针&#xff09;是从基础指针迈向进阶的关键节点。前文我们了解到&#xff0c;一级指针存储的是普通变量的内存地址&#xff0c;而二级指针的核心是“存储一级指…

AI人工智能-RAG方法-第十四周(小白)

一、RAG到底是什么? RAG是 Retrieval Augmengted Generation(检索增强生成)的缩写,核心逻辑特别好理解——就像我们写作文时,先查资料再动笔,而不是凭脑子硬记硬写。 简单说:AI回答问题时,不会只靠自己“记住”的知识,而是从外部文档库(或搜索引擎)里检索出和问题相…

AI人工智能-Agent相关介绍-第十四周(小白)

一、Agent是什么 Agent翻译过来时“智能体”,你可以把它理解为一个“有自主能力的智能助手”——它不用人一步步指挥,能自己理解任务,规划步骤、使用工具、记住过往经历,甚至和其他Agent或人类协作,最终完成目标。 简单说:普通LLM是“你问我答”的工具,二Agent是“你交…

AI人工智能-Function Call 与MCP-第十四周(小白)

一、Function Call是什么 Function Call直译是“函数调用”,但用通俗的话讲,它就是 LLM 的 “工具箱使用能力”—— 就像我们遇到算不清的数学题会拿计算器,LLM 遇到自己搞不定的问题(比如查实时数据、复杂计算、翻译),会 “喊工具来帮忙”。 核心逻辑:LLM 当 “决策者…

基于西门子PLC1214C的三原料自动称重配料搅拌系统程序修改探讨

基于西门子PLC1214C三原料自动称重配料搅拌系统改程序仅用于学时探讨。 功能&#xff1a; 三个原料仓按照配比先称重&#xff0c;然后进入配料仓&#xff0c;配料仓有两个重量档位&#xff0c;可以手动选择&#xff0c;当原料在配料仓里满足档位要求&#xff0c;原料仓停止称重…