许多开发者都听说过阿丽亚娜 5 号(Ariane 5)缺陷,这是航空航天工程史上最臭名昭著的软件故障之一。它发生在 1996 年 6 月 4 日阿丽亚娜 5 号火箭的首次飞行中,该火箭原计划将四颗 Cluster 卫星送入轨道,以研究地球磁层。
这个缺陷本身是一个与火箭制导系统相关的软件问题。负责将 64 位浮点值转换为 16 位有符号整数以供制导系统使用的软件组件,因溢出错误导致了未处理的异常。最终,仅仅一行代码就酿成了一次耗资数百万美元的失败,使阿丽亚娜 5 号的发射成为历史上代价最高的软件故障之一。
但您是否知道有一行代码可能价值数百万美元?
就是这句著名的 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 游戏引擎。游戏编程的许多方面,如寻路、光照和反射,都重度依赖向量归一化,而这需要平方根倒数运算。然而,执行涉及浮点除法的平方根倒数运算对处理器来说计算成本很高。在《雷神之锤 III 竞技场》这样节奏快、视觉沉浸感强的游戏中,这些计算每秒要发生数百万次。因此,即使这些计算的性能只有微小的提升,也能显著加快图形处理速度并提高游戏的帧率。为了避免平方根倒数函数的计算开销,id Tech 3 引擎的程序员们设计出了一个异常快速且精确的近似算法。

没有这个巧妙的优化,《雷神之锤》可能就无法取得在游戏行业中的标杆地位。
谁是这个创新解决方案背后的天才?
AMD RTG 欧洲游戏工程团队高级经理 Rys Sommerfeldt 于 2004 年发起了一项调查,以查明这个函数的起源。调查最终将作者指向 Greg Walsh。Greg Walsh 是计算机界的一座丰碑。他在施乐帕洛阿尔托研究中心(Xerox PARC)帮助设计了第一个所见即所得(WYSIWYG)文字处理器,并参与创立了 Ardent Computer。在 Ardent 期间,Greg 与 Matlab 的作者 Cleve Moler 密切合作,而 Greg 称 Cleve 正是快速平方根倒数函数的灵感来源。
故事的启示
对于某些问题,花时间跳出思维定式是值得的。跳出思维定式意味着摆脱常规或传统的思维方式,探索非常规、创新和富有创造性的问题解决方案。当问题难以解决时,花时间从不同角度去探究它。您可能会找到一个超出预期的解决方案。
