C++ 阅读时间 5 分钟

AI 机器人能写出这样的 C++ 代码行吗:i = 0x5f3759df - (i >> 1);

分享本文
Could AI Bots Generate a C++ Line Like This One: i = 0x5f3759df - (i >> 1);

你知道哪一行 C++ 代码价值数百万美元吗?

就是这一行神奇的 C++ 代码:i = 0x5f3759df – (i >> 1);

这行代码最早出现在 Quake 的代码库中,用于优化平方根倒数的计算。

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

  x2 = number * 0.5F;
  y  = number;
  i  = * ( long * ) &y;                       // evil floating point bit level hacking
  i  = 0x5f3759df - ( i >> 1 );               // what the fuck?
  y  = * ( float * ) &i;
  y  = y * ( threehalfs - ( x2 * y * y ) );   // 1st iteration
  // y  = y * ( threehalfs - ( x2 * y * y ) );   // 2nd iteration, this can be removed

  return y;
}

为什么优化平方根倒数如此重要?

平方根倒数广泛应用于视频游戏图形,尤其是 3D 游戏引擎。游戏编程的各个方面,如寻路、光照和反射,都依赖它。

在 Quake III Arena 这样快节奏、视觉沉浸感强的游戏中,这些计算每秒要执行数百万次。因此,即使性能上微小的提升也意义重大。

没有这个巧妙的优化,Quake 或许就不会成为游戏行业的标杆。

这个创新解决方案背后的天才是谁?

AMD RTG 欧洲游戏工程团队高级经理 Rys Sommerfeldt 在 2004 年对该函数的起源展开了调查。最终看来,作者是 Greg Walsh。Greg Walsh 是计算机界的一座丰碑,他曾参与研制最早的 3D 图形硬件。

这行代码晦涩、巧妙,还带有软件史上最著名的注释之一。但在 AI 时代,它引出了一个越来越相关的问题:

AI 能写出这样的代码吗?应该让它写吗?如果不能,为什么?

简短回答:不完全是。但……某种程度上可以。

AI 代码生成工具——如 GitHub Copilot、ChatGPT 或 Google Gemini——在获得足够上下文提示后,绝对可以复现这行代码。

但关键词是复现,而不是发明

为什么不行?让我们来拆解一下。

1.这行代码不是“被发现”的——而是被“打造”出来的

常量0x5f3759df是一个魔法数字,来自对浮点格式(IEEE 754)的反复试错和深刻理解。它需要对以下方面的洞察:

  • 浮点数的位级表示
  • 二进制近似技术
  • 游戏引擎中的性能瓶颈

AI并不需要像人类那样“理解”这些东西——而如果训练数据中没有展示这个确切的技巧,它不太可能从零合成出来。

2.AI 擅长模式综合,而非发明

LLM(大型语言模型)从人类编写的代码中学习。它们能跨示例泛化,但在数学意义上并不具备天生的创造力。它们:

  • 组合已知概念
  • 优化已知结构
  • 预测最可能的下一个 token

除非训练集中包含类似这行代码的东西,否则它不太可能在新场景中自然地浮现。

3.这行代码在现代编码中是一种反模式

从软件工程角度看,这行代码:

  • 不可移植
  • 不安全(由于类型双关)
  • 难以阅读和维护

现代 AI 工具(尤其是那些对齐“安全”或“干净”代码理念的工具)不太可能输出它,除非明确要求“快速平方根倒数 hack”

AI 什么情况下复现它

如果你问 ChatGPT 类似这样的问题:

“用 C 写出 Quake III 中的快速平方根倒数函数”

你很可能会得到它。

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 );          
    y  = * ( float * ) &i;
    y  = y * ( threehalfs - ( x2 * y * y ) );
    return y;
}

在 GitHub 和 StackOverflow 代码上训练的 AI 工具见过它,只要你问,它们很乐意分享。

但它们不会自己发明这种优化,1.0f / sqrt(x)除非训练集中包含这个 hack,或者你给出非常具体的提示。

这告诉我们人类与 AI 创造力的差异

这行代码——以及随后那句绝妙的注释——提醒我们人类开发者带来的东西:

  • 洞察力:知道成本在哪里,以及什么技巧可能解决它
  • 冒险精神:因为有效而做一些“邪恶”的事
  • 探索精神:找到真正能解决问题的魔法数字

今天的 AI 可以辅助、翻译和优化——但像这样的代码行来自好奇心直觉,这是我们仍在努力教给机器的东西。

最后的思考

那么:AI 能从零写出这样的代码吗i = 0x5f3759df - (i >> 1);?

还不能。

在 AI 能够真正探索浮点内部机制、性能 hack 和不安全的内存操作——从第一性原理出发——之前,写出这种代码行的仍将是人类。

分享本文