在编写科学软件:良好风格指南中,提到了几起灾难,包括导弹防御系统,该系统导致1991 年在沙特阿拉伯的美国基地死亡。
该错误是由于跟踪来袭飞毛腿导弹速度的灾难性取消造成的,以便在导弹击中基地之前发射导弹:
很明显,对于很大的时间和很小的差异,由于灾难性的取消,这可能导致错误的估计。当在他们的 C 程序中注意到这一点时,它显然是固定的,但怎么能做到呢?不包括第三方库的解决方案,例如 GMP。
在编写科学软件:良好风格指南中,提到了几起灾难,包括导弹防御系统,该系统导致1991 年在沙特阿拉伯的美国基地死亡。
该错误是由于跟踪来袭飞毛腿导弹速度的灾难性取消造成的,以便在导弹击中基地之前发射导弹:
很明显,对于很大的时间和很小的差异,由于灾难性的取消,这可能导致错误的估计。当在他们的 C 程序中注意到这一点时,它显然是固定的,但怎么能做到呢?不包括第三方库的解决方案,例如 GMP。
爱国者导弹系统的问题是时间以十分之一秒为整数存储。在计算之前(发送和再次检测到的雷达脉冲之间的时间差),该整数被转换为 24 位浮点数。这证明精度太低:运行 100 小时后,实际时间为 360,000 秒,浮点变量中的值为 359,999.6567 秒。这看起来很小,但是对于这种飞毛腿导弹的速度(大约 1676 m/s),这个时间偏移对应于大约 687 米的距离偏移。
在浮点表示中使用更多位(经典双精度为 64 位)可以解决问题。无需去更高级的固定精度库。
为了完整起见,这导致了 28 人伤亡。
@GertVdE 给出的答案包含美国总会计师办公室GAO IMTEC-92-26官方报告中给出的一些信息
然而,这份报告是不完整的!
在跟踪来袭导弹时,绝对时间无关紧要,而是两个雷达脉冲之间经过的时间才是重要的。
Patriot 系统的内部时钟滴答为 0.1 秒。它使用整数计算时间。函数调用通过乘以二进制近似值 0.1 秒将整数转换为实时。
原始函数使用 0.1 秒的 24 位近似值。为应对更快的导弹而设计的升级使用了 48 位近似值。不幸的是,至少对旧函数的调用没有被对新函数的调用替换!
因此,时间增量是通过从不太准确的绝对时间中减去高度准确的绝对时间来计算的。如果没有应用软件补丁,那么错误就会被取消,导弹就会发射。
我还没有找到证实这一点的官方报告。我能做的最好的就是引用SIAM 新闻 1992 年 7 月,第 25 卷,第 4 期,第 11 页
由于作者罗伯特·斯基尔后来在普渡大学的论文委员会任职,我倾向于接受它:)