Converting Binary Floating-Point Numbers to Shortest Decimal Strings: An Experimental Review

本文通过跨硬件架构和数据集的实证研究,对比了多种二进制浮点数转最短十进制字符串的算法,发现 Schubfach 和 Dragonbox 等现代技术在速度上比传统 Dragon4 快十倍,但现有实现(包括标准库)往往无法始终生成最短字符串且指令数远高于最优方案,从而为未来优化指明了方向。

Jaël Champagne Gareau, Daniel Lemire

发布于 2026-03-10
📖 1 分钟阅读☕ 轻松阅读

Each language version is independently generated for its own context, not a direct translation.

这篇文章就像是一场**“数字翻译官”的奥林匹克运动会**。

想象一下,计算机的大脑(CPU)只懂一种语言:二进制(0 和 1 的排列组合,比如 13176795 × 2^-22)。而人类只懂另一种语言:十进制(比如 3.1415927)。

当我们需要把计算机里的数据存成文本(比如 CSV 表格、JSON 文件)或者在屏幕上显示时,就必须请一位“翻译官”把二进制翻译成人类能读的字符串。这篇文章就是两位科学家(Jaël Champagne Gareau 和 Daniel Lemire)对市面上所有“翻译官”进行的一次大规模压力测试和性能大比拼

以下是用大白话和比喻对这篇论文核心内容的解读:

1. 为什么要比这个?(背景)

以前,计算机处理这种翻译任务就像是用算盘来算微积分——虽然能算对,但慢得要命,而且算出来的数字往往很长、很啰嗦。

  • 老派翻译官(Dragon4):就像一位极其严谨但动作迟缓的老教授。他为了确保翻译绝对准确,会反复核对,甚至用“大整数”去硬算。结果就是:虽然算得对,但每翻译一个数字,CPU 要跑几千步指令(就像老教授要翻几页书才能说出一句话)。
  • 现代翻译官(Dragonbox, Schubfach 等):就像一群受过特种训练的年轻特工。他们掌握了新技巧,能在几十步指令内就搞定同样的任务,速度提升了10 倍

2. 比赛规则:不仅要快,还要“短”

翻译的目标有两个:

  1. 准确:翻译出来的字符串,必须能完美还原回原来的二进制数字(不能丢信息)。
  2. 最短:在准确的前提下,字符串越短越好。比如,把 0.00011 写成 1.1e-4(6 个字符)比写成 0.00011(7 个字符)更省空间。

文章发现了一个惊人的“潜规则”:
虽然现在的算法都能算出“最精简的数字部分”(比如算出 1.1),但在最终生成字符串时,很多主流库(比如 C++ 标准库 std::to_chars)为了遵守旧时代的格式规定(比如指数必须写两位,或者正数也要加 + 号),故意把字符串写得比必要的长了 20% 到 30%

  • 比喻:就像你寄快递,明明只要一个信封就能装下,但快递公司非要给你套个巨大的纸箱,还填了多余的表格。虽然东西没坏,但运费(存储空间和传输带宽)贵了。

3. 谁是冠军?(实验结果)

作者测试了各种硬件(从苹果 M4 Max 到亚马逊的服务器芯片)和各种数据集(从简单的整数到复杂的科学数据)。

  • 速度之王DragonboxSchubfach 是目前的“短跑冠军”。它们不仅算得快,而且指令数极少(每个数字只需 200 多步指令,而老派的 Dragon4 需要 1500-5000 步)。
  • 老派选手:Dragon4 依然能工作,但速度慢得像蜗牛,指令数多得像在爬楼梯。
  • 标准库的尴尬:C++ 和 Swift 等语言自带的标准库,虽然方便,但在速度上远不如这些专门的“特种算法”。它们就像是用“通用型工具”去干“精密活”,效率不高。

4. 硬件与软件的关系

  • 硬件不是万能的:作者发现,即使换上了最新的超级电脑芯片(比如 Apple M4 或 AMD Zen 5),如果算法本身写得笨重,速度也提不起来。这就好比给一辆拖拉机装上了法拉利的引擎,它跑起来还是像拖拉机。
  • 算法才是核心:选择好的算法(如 Dragonbox),比升级硬件带来的提升要大得多。
  • 新指令没用?:作者还测试了现代 CPU 的高级指令(比如 SIMD,可以一次处理多个数据)。结果发现,目前的翻译算法大多是“单兵作战”,并没有充分利用这些“集团军”功能。这意味着未来还有很大的提速空间。

5. 未来的方向

文章最后提出了两个改进方向:

  1. 优化“包装”环节:既然算数字很快了,那么把数字“打包”成字符串的最后一步(格式化)就成了瓶颈。未来的算法应该把“算数”和“打包”彻底分开,让打包也变快。
  2. 批量处理:现在的算法是一次翻译一个数字。未来的算法应该像流水线一样,一次翻译一堆数字(批量处理),这样才能真正榨干现代 CPU 的性能。

总结

这就好比翻译界的技术革命
过去,我们还在用手摇磨坊(Dragon4)来磨面粉(转换数字),虽然能磨出粉,但累且慢。
现在,我们有了电动磨坊(Dragonbox/Schubfach),速度快了 10 倍。
但是,很多工厂(标准库)因为习惯,还是用旧的大包装袋(格式限制)来装这些面粉,导致运输成本虚高。

这篇论文告诉我们: 想要让计算机处理数据更快、更省空间,不仅要升级硬件,更要升级“翻译”的算法,并且要打破旧格式的束缚,追求真正的“最短路径”。