1. I found a 55 year old bug in the first Lunar Lander game (martincmartin.com)
55年前登月游戏中的错误
1969年,在尼尔·阿姆斯特朗历史性登月几个月后,马萨诸塞州列克星敦高中的学生吉姆·斯托勒编写了第一个登月着陆游戏。到1973年,它已成为当时最流行的电脑游戏。玩家通过控制燃料燃烧量来引导登月舱垂直降落。
作者在探索以最少燃料、最平稳着陆的最优策略(即“自杀式燃烧”)时,发现了一个令人惊讶的问题:理论上最优的着陆点速度略高于理想值,但只需增加极其微小的燃烧量,登月舱就会完全错过月表。这表明游戏的物理模拟存在缺陷。
经过深入分析,作者发现了游戏代码中的一个错误:在计算登月舱轨迹最低点(速度为零点)所用的二次求根公式中,分母根号内的项少除了一个2。
- 游戏原本的高明之处:令人惊讶的是,作为1969年的高中生,吉姆·斯托勒没有使用常见的简化欧拉积分,而是采用了精确的齐奥尔科夫斯基火箭方程并进行泰勒级数展开,以减少计算误差。为了处理轨迹最低点的计算(该方程无封闭解),他巧妙地使用了一种在数值计算中更稳定的替代形式的二次公式(将平方根放在分母),以避免当推力近似于重力时可能出现的数值不稳定问题。
- 错误的影响:由于公式中缺失了“除以二”,游戏持续低估了到达轨迹最低点的时间。这使得最优的“自杀式着陆”策略(全程满推力直至瞬间刹停)无法实现,因为游戏会误判登月舱已穿过月表。
- 错误长期未被发现的原因:尽管存在此缺陷,但游戏本身的玩法和挑战性依然存在,玩家可以通过其他策略平稳着陆并享受游戏。因此,这个bug潜伏了近55年才被发现。
总的来说,这个发现凸显了吉姆·斯托勒在计算机科学尚未普及的年代,作为高中生所展现出的卓越的数学和物理模拟能力,同时也解释了为何这个微妙的数值计算错误能长期隐藏于这款经典游戏之中。