算法神话的祛魅:Russ Cox 与浮点数转换的 15 年求索之路

本文永久链接 – https://tonybai.com/2026/02/03/russ-cox-15-year-war-on-floating-point-conversion

大家好,我是Tony Bai。

“浮点数到十进制的转换一直被认为很难。但本质上,它们非常简单直接。” —— Russ Cox (2011)

“我错了。快速的转换器也可以很简单,这篇文章将展示如何做到。” —— Russ Cox (2026)

在计算机科学的深处,潜伏着一条名为“浮点数转换”的恶龙。将一个二进制浮点数(如 float64)转换为人类可读的十进制字符串(如 “0.1″),看似简单,实则是一个困扰了业界半个世纪的难题。

2011 年,Go 语言的核心人物 Russ Cox 写下了一篇博文,试图用一种简单的算法来“驯服”这条龙。然而,在随后的十几年里,学术界和工业界爆发了一场军备竞赛:Dragon4, Grisu3, Ryū, Schubfach, Dragonbox… 每一个新算法都试图在速度上压倒前一个,但也让代码变得越来越复杂,数学证明越来越晦涩。

2026 年初,Russ Cox 带着他的新系列文章强势回归。这一次,他不仅带来了一套比所有已知算法都更快的全新算法,而且证明了:极致的性能不需要极致的复杂性。

这套算法已被确定将在 Go 1.27 (2026年8月) 中发布。今天,我们就来深度解析这项可能改写浮点数处理历史的技术突破。

历史的迷宫与“不可能三角”

要理解 Russ Cox 的成就,我们首先要理解这个问题的难度。一个完美的浮点数打印算法,必须同时满足三个苛刻的条件(“不可能三角”):

  1. 正确性 (Correctness):转换必须是双射的。Parse(Print(f)) == f 必须恒成立。这意味着你不能随意丢弃精度。
  2. 最短性 (Shortest):输出的字符串必须是所有能转回原值的字符串中最短的。例如,0.3 在二进制中无法精确表示,打印时应该是 “0.3″ 而不是 “0.2999999999999999889″。
  3. 速度 (Speed):在大规模数据处理(如 JSON 序列化)中,转换速度直接决定了系统的吞吐量。

历史的演进:
* Dragon4 (1990):实现了正确性和最短性,但依赖大整数(BigInt)运算,慢如蜗牛。
* Grisu3 (2010):Google 的 V8 引擎引入。速度极快,但不保证最短性,约 0.5% 的情况会失败并回退到慢速算法。
* Ryū (2018) & Dragonbox (2020):通过复杂的数学技巧(查表法),终于在不使用 BigInt 的情况下实现了正确且最短。这是性能的巅峰,但代码极其复杂,充满魔术数字。

Russ Cox 的目标,就是打破这个迷宫:能不能既像 Ryū 一样快且正确,又像 2011 年的那个算法一样简单?

核心技术——“未舍入缩放” (Unrounded Scaling)

Russ Cox 的新算法核心,源于一个极其精妙的数学原语:快速未舍入缩放 (Fast Unrounded Scaling)

什么是“未舍入数”?

在传统算法中,我们总是纠结于“何时舍入”。Russ Cox 引入了 “未舍入数” (Unrounded Number) 的概念 ⟨x⟩。它由三部分组成:

  • 整数部分: floor(x)
  • ½ bit: 标记 x – floor(x) >= 0.5
  • sticky bit (粘滞位): 标记 x 是否有非零的小数残余。

这种表示法不仅保留了用于正确舍入(Round half to even)的所有必要信息,而且可以通过极其廉价的位运算(| 和 &)来维护。这就像是在计算过程中保留了一个“高精度的尾巴”,直到最后一步才决定如何截断。

缩放的魔法

浮点数打印本质上是计算 f = m * 2^e 对应的十进制 d * 10^p。核心步骤是将 m * 2^e 乘以 10^p。

Russ Cox 使用查表法(预计算 10^p 的 128 位近似值)来实现这一缩放。但他最惊人的发现是:在 64 位浮点数转换的场景下,我们甚至不需要完整的 128 位乘法!

他证明了:只需计算 64 位 x 64 位的高位结果,并利用低位的“粘滞位”来修正,就能得到完全正确的结果。这意味着,曾经需要几十次乘法或大整数运算的转换过程,现在被缩减为极少数几次 CPU 原生乘法

这一发现被称为 “Omit Needless Multiplications”(省略不必要的乘法),它是新算法性能超越 Ryū 的关键。

从理论到 Go 1.27

基于这个核心原语,Russ Cox 构建了一整套算法家族:

  • FixedWidth: 定点打印(如 %.2f)。
  • Shortest: 最短表示打印(如 %g)。
  • Parse: 字符串转浮点数。

性能碾压

Russ Cox 在 Apple M4 和 AMD Ryzen 9 上进行了详尽的基准测试:

  • 定点打印:新算法 (uscale) 显著快于 glibc 和 double-conversion,甚至快于 Ryū。
  • 最短打印:在纯算法层面,新算法与业界最快的 Dragonbox 持平或更快,但代码逻辑要简单得多。
  • 解析:同样基于该原理的解析算法,性能超越了目前业界标杆 fast_float (Eisel-Lemire 算法)。

更令人兴奋的是,Go 1.27 将直接集成这套算法或算法的一部分。对于 Gopher 来说,这意味着你的 fmt.Sprintf、json.Marshal 和 strconv.ParseFloat 将在下个版本中自动获得显著的性能提升,而无需修改一行代码。

证明的艺术

除了代码,Russ Cox 还做了一件很“极客”的事:他用 Ivy(一种 APL 风格的语言)编写了完整的数学证明。

他没有选择形式化验证工具(如 Coq),而是通过编写可执行的代码来验证算法在每一个可能的 float64 输入下都是正确的。这种“通过计算来证明” (Proof by Computation) 的方法,不仅验证了算法的正确性,也为后来者留下了一份可交互的、活生生的文档。

小结:简单是终极的复杂

从 2011 年的初次尝试,到 2026 年的最终突破,Russ Cox 用 15 年的时间完成了一个完美的闭环。

这一系列文章是一种工程哲学的胜利。它告诉我们:当我们面对复杂的遗留问题时,不要只是盲目地堆砌优化技巧。回到数学的源头,重新审视问题的本质,或许能找到那条既简单又快的“捷径”。

现在的 Go 标准库中,即将拥有一颗比以往任何时候都更强大、更轻盈的“心脏”。

资料链接:https://research.swtch.com/fp-all


你更看重哪一点?

在算法的世界里,正确性、最短表示、运行速度,这“不可能三角”总是让我们反复权衡。在你平时的开发中,有哪些场景曾让你被浮点
能或精度困扰?或者,你对 Russ Cox 这种“死磕 15 年”的工程精神有何感触?

欢迎在评论区分享你的看法!如果这篇文章让你对浮点数实现算法方面有了新的认识,别忘了点个【赞】和【在看】,并转发给你的Go开发朋友们!


还在为“复制粘贴喂AI”而烦恼?我的新专栏 AI原生开发工作流实战 将带你:

  • 告别低效,重塑开发范式
  • 驾驭AI Agent(Claude Code),实现工作流自动化
  • 从“AI使用者”进化为规范驱动开发的“工作流指挥家”

扫描下方二维码,开启你的AI原生开发之旅。


你的Go技能,是否也卡在了“熟练”到“精通”的瓶颈期?

  • 想写出更地道、更健壮的Go代码,却总在细节上踩坑?
  • 渴望提升软件设计能力,驾驭复杂Go项目却缺乏章法?
  • 想打造生产级的Go服务,却在工程化实践中屡屡受挫?

继《Go语言第一课》后,我的《Go语言进阶课》终于在极客时间与大家见面了!

我的全新极客时间专栏 《Tony Bai·Go语言进阶课》就是为这样的你量身打造!30+讲硬核内容,带你夯实语法认知,提升设计思维,锻造工程实践能力,更有实战项目串讲。

目标只有一个:助你完成从“Go熟练工”到“Go专家”的蜕变! 现在就加入,让你的Go技能再上一个新台阶!


商务合作方式:撰稿、出书、培训、在线课程、合伙创业、咨询、广告合作。如有需求,请扫描下方公众号二维码,与我私信联系。

Claude Code 创始人亲授:解锁 10 倍效率的 10 个“隐藏技能”

本文永久链接 – https://tonybai.com/2026/02/03/claude-code-founder-10x-efficiency-10-hidden-skills

大家好,我是Tony Bai。

Claude Code 发布后,迅速成为了 AI 编程领域的“当红炸子鸡”。

大多数开发者对它的使用方式还停留在:“打开终端 -> 输入需求 -> 等待代码生成”。

但这真的发挥出它的全部潜力了吗?

最近,Claude Code 的创始人 Boris Cherny 亲自下场,在社交媒体上分享了团队内部使用的 Best Practices

看完这些技巧,我才意识到:我们以前可能只用了它 10% 的功力。

Boris 揭示了如何将 Claude Code 从一个简单的 CLI 工具,升级为一个支持并行、具备规划能力、能自我进化的“数字研发团队”。

今天,我将这 10 个隐藏技能 拆解给你,助你解锁 10 倍的开发效率。

并行工程——一个人就是一支队伍

技能 1:多线程并发 (Parallel Worktrees)

  • 痛点:传统的 AI 编程是线性的,AI 写代码时,你只能干等。
  • 创始人解法:“Do more in parallel.”
    利用 git worktree,你可以瞬间克隆出 3-5 个独立的工作目录。在每个目录里启动一个 Claude Session,分别处理不同的 Feature。

    • 窗口 1:重构后端 API;
    • 窗口 2:编写前端组件;
    • 窗口 3:运行全链路测试。

这是最大的生产力解锁。你的大脑带宽不再受限于 AI 的生成速度,而是受限于你的“多任务指挥能力”。

技能 2:左右互搏 (Agent Review Agent)

  • 痛点:AI 写的代码有时候逻辑不严密,自己 Review 又太累。
  • 创始人解法:让 AI 审查 AI。
    • Session A (Writer): 负责生成 Plan 和 Code。
    • Session B (Reviewer): 扮演 “Staff Engineer”,专门负责挑刺。

Boris 透露:让 Session B 对 A 的产出进行 Review,不仅能发现 Bug,还能显著提升代码的鲁棒性。

思维升级——先谋后动

技能 3:Plan Mode 的“一击必杀”

  • 痛点:直接让 AI 改复杂逻辑,往往改得乱七八糟。
  • 创始人解法:“Start every complex task in plan mode.”

面对复杂任务,按两下 Shift+Tab 进入 Plan Mode。把你的精力全部花在打磨 Plan 上。一旦 Plan 完美了,切换回 Execute Mode,让 Claude “One-shot(一击必杀)” 完成实现。

技能 4:子智能体探索 (Subagents for Exploration)

  • 痛点:面对陌生的巨型代码库,主 Agent 读取太多文件会导致 Context 溢出。
  • 创始人解法: “Use 5 subagents to explore the codebase.”
    你可以直接下令:use 5 subagents to explore the codebase and map out the dependency graph.
    这 5 个子智能体会并行阅读代码,互不干扰,最后将精华信息汇总给主 Agent。这相当于派出了 5 个侦察兵。

能力扩展——打造私人技能库

技能 5:把重复劳动封装为 Skill

  • 痛点:每天都在重复输入相同的 Prompt,比如“扫描一下有没有重复代码”。
  • 创始人解法: “Create your own skills.”

如果你发现某件事一天要做两次以上,把它写成 Skill。 比如 创建一个 /techdebt 命令。每次会话结束前运行一下,自动扫描并删除重复代码。

技能 6:自我进化的 CLAUDE.md

  • 痛点:项目规则太多,写在 Prompt 里太麻烦,写在文档里又懒得更新。
  • 创始人解法:“Ruthlessly edit your CLAUDE.md over time.”

不要手写规则,让 Claude 自己写。当它犯错并被你修正后,对它说:“把这个错误的原因和避免方法,写入 CLAUDE.md,这样你下次就不会再犯了。” 让你的规则文件像生物一样自行生长、进化。

自动化闭环——自修复与自验证

技能 7:Slack 驱动修 Bug

  • 痛点:看到 Bug -> 复制报错 -> 切换 IDE -> 粘贴报错。太慢了。
  • 创始人解法:“Zero context switching.”

配置 Slack MCP。在 Claude Code 里直接粘贴 Slack 上的 Bug 链接,说一句 “Fix”。Claude 会自动读取 Slack 里的讨论上下文,复现问题,并提交修复。

技能 8:Chrome 驱动验 UI

  • 痛点:前端代码写完了,还是得自己打开浏览器点点点。
  • 创始人解法:“Chrome MCP is a game changer.”

配置 Chrome MCP。让 Claude 写完代码后,自己打开浏览器,截图,对比设计稿,甚至自动点击按钮进行验证。Eye > Code.

高阶 Prompting——把 AI 当人看

技能 9:压力测试 (Challenge Claude)

  • 痛点:AI 容易顺从你的错误想法。
  • 创始人解法:“Grill me on these changes.”(拷问我)

告诉 Claude:“不要直接合并。直到你通过我的测试之前,不要生成 PR。证明这段代码是有效的。” 激发 AI 的批判性思维,让它从“执行者”变成“质检员”。

技能 10:状态栏定制 (Custom Statusline)

  • 痛点:开了 5 个终端,忘了哪个是干嘛的。
  • 创始人解法:使用 /statusline 自定义显示内容。

让每个终端的状态栏显示当前的 Git 分支、Context 使用量、以及当前任务的目标。一眼望去,掌控全局。

小结:从 Tool 到 Teammate

Boris 的分享向我们展示了 Claude Code 的终极形态:它不仅仅是一个 CLI 工具,它是一个可编程、可扩展、可并行的数字员工团队

掌握了这 10 个隐藏技能,你就不再是那个盯着屏幕发呆的 Coder,而是运筹帷幄的 Commander。

不要用蛮力去写代码,用架构去生成代码。

资料链接:https://x.com/bcherny/status/2017742741636321619


你的“提效”利器

创始人的这 10 个技巧中,哪一个最让你觉得“相见恨晚”?你自己在探索 Claude Code 或其他 AI Agent 时,是否也挖掘出了一些好用的“独门绝技”?

欢迎在评论区分享你的提效秘籍!让我们一起构建最强 AI 工作流。

如果这篇文章为你打开了新世界的大门,别忘了点个【赞】和【在看】,并转发给你的开发战友!


构建你的“数字特种部队”

看完这些技巧手痒了吗?

  • 如何配置 Slack MCPChrome MCP
  • 如何编写一个能自动修债的 /techdebt Skill
  • 如何用 Worktree 搭建并行流水线?

在我的极客时间专栏《AI原生开发工作流实战》中,我将带你实战 Boris 提到的一些高阶技巧。我们将手把手配置一个“一人抵十人”的超级开发环境。

扫描下方二维码,让你的开发效率原地起飞。


你的Go技能,是否也卡在了“熟练”到“精通”的瓶颈期?

  • 想写出更地道、更健壮的Go代码,却总在细节上踩坑?
  • 渴望提升软件设计能力,驾驭复杂Go项目却缺乏章法?
  • 想打造生产级的Go服务,却在工程化实践中屡屡受挫?

继《Go语言第一课》后,我的《Go语言进阶课》终于在极客时间与大家见面了!

我的全新极客时间专栏 《Tony Bai·Go语言进阶课》就是为这样的你量身打造!30+讲硬核内容,带你夯实语法认知,提升设计思维,锻造工程实践能力,更有实战项目串讲。

目标只有一个:助你完成从“Go熟练工”到“Go专家”的蜕变! 现在就加入,让你的Go技能再上一个新台阶!


商务合作方式:撰稿、出书、培训、在线课程、合伙创业、咨询、广告合作。如有需求,请扫描下方公众号二维码,与我私信联系。

如发现本站页面被黑,比如:挂载广告、挖矿等恶意代码,请朋友们及时联系我。十分感谢! Go语言第一课 Go语言进阶课 AI原生开发工作流实战 Go语言精进之路1 Go语言精进之路2 Go语言第一课 Go语言编程指南
商务合作请联系bigwhite.cn AT aliyun.com
这里是 Tony Bai的个人Blog,欢迎访问、订阅和留言! 订阅Feed请点击上面图片

如果您觉得这里的文章对您有帮助,请扫描上方二维码进行捐赠 ,加油后的Tony Bai将会为您呈现更多精彩的文章,谢谢!

如果您希望通过微信捐赠,请用微信客户端扫描下方赞赏码:

如果您希望通过比特币或以太币捐赠,可以扫描下方二维码:

比特币:

以太币:

如果您喜欢通过微信浏览本站内容,可以扫描下方二维码,订阅本站官方微信订阅号“iamtonybai”;点击二维码,可直达本人官方微博主页^_^:
本站Powered by Digital Ocean VPS。
选择Digital Ocean VPS主机,即可获得10美元现金充值,可 免费使用两个月哟! 著名主机提供商Linode 10$优惠码:linode10,在 这里注册即可免费获 得。阿里云推荐码: 1WFZ0V立享9折!


View Tony Bai's profile on LinkedIn
DigitalOcean Referral Badge

文章

评论

  • 正在加载...

分类

标签

归档



View My Stats