Floating-Point Usage on GitHub: A Large-Scale Study of Statically Typed Languages

本文通过对 GitHub 上数百万静态类型语言仓库的大规模实证研究,揭示了现实世界中浮点数算术的使用特征,验证了现有基准测试的部分代表性并指出了其不足,同时发布了一个包含 1000 万个真实浮点函数的数据集以推动相关自动推理技术的发展。

Andrea Gilot, Tobias Wrigstad, Eva Darulova

发布于 Wed, 11 Ma
📖 1 分钟阅读☕ 轻松阅读

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

这篇论文就像是一次对全球代码世界的“人口普查”,专门为了搞清楚程序员们到底是怎么使用“浮点数”(一种用来表示小数、让计算机处理更精确数字的工具)的。

想象一下,你想教一个机器人(也就是自动化的数学分析工具)如何完美地处理小数计算。但是,你发现现有的教材(也就是学术界常用的测试题集)和现实生活中的情况大相径庭。这篇论文就是为了解决这个“教材与现实脱节”的问题。

以下是用通俗语言和比喻对这篇论文核心内容的解读:

1. 为什么要做这个研究?(发现“教材”的偏差)

  • 现状: 以前,研究人员在开发能自动检查浮点数错误的工具时,就像是在用“教科书上的理想题目”来训练学生。这些题目(比如 FPBench 基准测试集)通常很完美、很干净,只有简单的加减乘除和三角函数。
  • 问题: 但是,现实世界中的代码(就像真实生活中的数学题)要混乱得多。它充满了各种奇怪的分支判断(如果...就...)、循环(重复做某事),而且往往不是孤立存在的。
  • 比喻: 这就像你教人游泳,只在平静的游泳池里练(教科书),但真正要下海(真实代码)时,面对的是海浪、暗流和复杂的洋流。如果工具只会在游泳池里表现好,那到了大海里就会“翻船”。
  • 目标: 作者们决定不再猜,而是直接去 GitHub(全球最大的代码仓库,就像全世界的“代码图书馆”)里,大规模地统计一下,真实的程序员到底是怎么写浮点数代码的

2. 他们是怎么做的?(“淘金”与“过滤”)

为了从海量的代码中找到真正有用的信息,他们设计了一套非常严谨的“淘金”流程:

  • 第一步:随机抽样(不偏不倚)。 他们没有只挑那些“明星项目”(比如有很多星星点赞的项目),因为那样会有偏见。他们像在沙滩上随机抓一把沙子一样,随机抽取了 GitHub 上数百万个项目的 ID。
  • 第二步:剔除“玩具”(去伪存真)。 他们排除了那些刚创建不久、太小或者只是个人笔记的项目,只保留那些真正在运行的“正经”软件项目。
  • 第三步:只找“静态类型”语言(锁定目标)。 他们只研究像 C、C++、Java、Go 这样在写代码时就必须明确告诉计算机“这是小数”的语言
    • 比喻: 这就像在找鱼。动态语言(如 Python)就像水太浑,看不清鱼是不是浮点数;而静态语言就像清澈的水,只要看到标签(类型注解),就能一眼认出哪条是“浮点鱼”。
  • 第四步:关键词搜索与去重(去重与提取)。 他们编写程序,像拿着金属探测器一样,在代码里搜索“小数”、“正弦”、“无穷大”等关键词。同时,他们非常小心地剔除了重复的代码(比如很多项目都复制粘贴了同一个库文件),确保统计的是独特的代码。
  • 第五步:切片分析。 最后,他们把代码切成一个个“函数”(就像把大蛋糕切成小块),分析每一小块里有什么:有多少个循环?有多少个判断?用了什么类型的小数?

3. 他们发现了什么?(现实与想象的巨大反差)

这次“人口普查”得出了几个惊人的结论:

  • 浮点数无处不在: 超过 62% 的开源项目里都有浮点数代码。这证实了大家一直以来的直觉:小数计算在软件中非常普遍。
  • 现实代码比“教材”复杂得多:
    • 教材(FPBench): 像是一个个独立的数学公式,很少有大段的逻辑判断。
    • 现实代码: 充满了循环(比如 for 循环)和条件判断(比如 if 语句)。
    • 比喻: 教科书里的题目是“计算 1+1",而现实代码是“如果下雨,就计算 1+1;如果不下雨,就计算 2+2,并且重复做 100 次”。现有的工具往往只擅长做第一种,对第二种很头疼。
  • 常用的库并不常用: 学术界经常用“GNU 科学计算库”(GSL)里的函数来做测试,但作者发现,在真实的 GitHub 代码中,几乎没人用这个库。这就像考试总考“微积分”,但实际工作中大家主要用“加减法”一样。
  • 代码其实很“小”: 虽然浮点数代码很复杂,但大多数函数本身并不大。它们更像是乐高积木,由很多小函数拼凑而成,而不是那种巨大的、难以理解的“怪兽代码”。

4. 他们贡献了什么?(送给大家的“新教材”)

作者们没有止步于发现,他们还做了一件大好事:

  • 发布了 1000 万个真实函数数据集: 他们把从 GitHub 挖出来的 1000 万个真实的浮点数函数整理成了一个巨大的数据库,免费开放给所有人。
  • 制作了 59 个“挑战题”: 他们从数据库里挑了 59 个典型的 C 语言函数,打包成可以直接运行的测试题。
    • 比喻: 以前大家用“游泳池模拟题”来测试游泳教练;现在,他们直接给教练扔进了59 个真实的“海浪场景”,看看谁能真正游过去。

5. 总结与启示

这篇论文的核心思想是:“别在温室里练枪法,要去战场上练。”

  • 对工具开发者的建议: 未来的浮点数分析工具,不能只盯着简单的数学公式,必须学会处理循环、判断分支模块化的代码结构。
  • 对研究界的呼吁: 别再只用那些手选的、过于简单的“教科书题目”来评价新工具了。应该用这篇论文提供的真实数据集来测试,这样开发出来的工具才能真正帮到现实世界的程序员。

一句话总结:
作者们像一群代码考古学家,在 GitHub 的深海里挖掘了 1000 万个真实的“浮点数化石”,发现现实中的代码比教科书里的复杂得多,并把这些真实的样本整理成册,呼吁大家用这些“真家伙”来重新训练和测试我们的智能工具。