設萬維讀者為首頁 廣告服務 聯繫我們 關於萬維
簡體 繁體 手機版
分類廣告
版主:白夫長
萬維讀者網 > 軍事天地 > 帖子
美軍愛國者導彈攔截失敗,只因這項計算BUG
送交者: 三把刀 2025年07月02日08:51:09 於 [軍事天地] 發送悄悄話

飛來橫禍

1991年2月25日,第一次海灣戰爭正如火如荼地進行着。當天晚上20時40分左右,突如其來的爆炸聲劃破了沙特達摩地區寧靜的夜空——伊拉克發射的"飛毛腿"導彈精確命中美軍位於達蘭的空軍基地。霎時間,原本秩序井然的軍營化作一片火海,哀嚎遍野。

圖片

美軍在化作廢墟的軍營中搜尋生還者

當時美軍為了防範伊拉克的導彈襲擊,早已在重要軍事據點部署了以"愛國者"導彈為核心的攔截系統。不過在這場致命的襲擊中,號稱先進的"愛國者"系統忠實地充當了“吃瓜”群眾的角色,對來襲的導彈毫無反應。最終,襲擊導致28名美軍士兵喪生,97人受傷,這成為海灣戰爭期間美軍最慘重的單次傷亡事件。事後的調查顯示,這場災難的罪魁禍首是一個看似微不足道的數字計時器精度問題。

浮點運算的“迷惑”

實數在計算機中的表示,也就是浮點數,是科學計算操作的基本對象。可以想見,只具備有限存儲空間的計算機永遠也不能精確地表示不可數的實數集合。就像上文提到的愛國者,它的計時器只有24位精度。在連續運行100小時後,系統已經累計出了的0.34秒的誤差。對於以6倍音速飛行的導彈而言,這相當於700米的定位偏差,足以讓整個防禦系統形同虛設。

浮點數表示的標準化肇始於上世紀80年代產生的IEEE754規範。隨着體系架構的演進,近三十年來計算機工業完成了從32位至64位系統的變革。現代計算機系統已經普遍支持64位雙精度浮點數,但這絕不意味着使用者可以忽視數值精度背後的複雜性。數值計算的藝術就是與誤差共舞的藝術,"舞技"不好的表演者會在意想不到之處付出慘痛的代價……

讀者對浮點數運算的性質了解多少呢?猜一猜下面這個表達式的結果:

>>> 0.1 + 0.1 == 0.2

試着在計算機上運行一下,返回結果為True,看起來一切正常。然而,很容易構造一個可能讓人小吃一驚的案例:

>>> 0.1 + 0.2 == 0.3

返回的結果為False。事實上,雙精度浮點計算下 的結果是

>>> 0.30000000000000004

浮點數的表示原理

人類使用十進制系統的原因很可能是我們擁有十根手指。但是在構造一個機器系統時,只有兩種狀態的比特位是最容易實現的。所以對於計算機,二進制表示是更自然的方式。在表示數時,十進制的位擁有10的若干次冪的權重。類似地,二進制(比特)位帶有2的若干次冪權重。下面的一個從二進制轉換至十進制的案例很好地說明了這一點:

圖片

1.1001 1001 1001 1001 1001 1001 1001 1001 1001 1001 1001 1001 1001 [1001...] * 2^(-4)
--------------------------------------------------------------------------------------1.1001 1001 1001 1001 1001 1001 1001 1001 1001 1001 1001 1001 1010 * 2^(-4)

圖片

1.1001 1001 1001 1001 1001 1001 1001 1001 1001 1001 1001 1001 1010 * 2^(-4)
+ 1.1001 1001 1001 1001 1001 1001 1001 1001 1001 1001 1001 1001 1010 * 2^(-4)--------------------------------------------------------------------------------11.0011 0011 0011 0011 0011 0011 0011 0011 0011 0011 0011 0011 0100 * 2^(-4)= 1.1001 1001 1001 1001 1001 1001 1001 1001 1001 1001 1001 1001 1010 * 2^(-3)

圖片

為什麼0.1+0.2≠0.3

圖片

1.0011 0011 0011 0011 0011 0011 0011 0011 0011 0011 0011 0011 0011 * 2^(-2)

圖片

0.1100 1100 1100 1100 1100 1100 1100 1100 1100 1100 1100 1100 1101 * 2^(-3)

然後進行加法和捨入:

1.1001 1001 1001 1001 1001 1001 1001 1001 1001 1001 1001 1001 1010 * 2^(-3)
+ 0.1100 1100 1100 1100 1100 1100 1100 1100 1100 1100 1100 1100 1101 * 2^(-3)--------------------------------------------------------------------------------10.0110 0110 0110 0110 0110 0110 0110 0110 0110 0110 0110 0110 0111 * 2^(-3)= 1.0011 0011 0011 0011 0011 0011 0011 0011 0011 0011 0011 0011 0100 * 2^(-2)

圖片

愛國者導彈

“愛國者”導彈系統內置了一個用於計時的鐘——每0.1秒進行一次更新。與IEEE規則不同,這個運算是通過24位固定小數點寄存器實現的——在不採用科學計數法的情況下直接存儲0.1的二進制表示。按理說,與0.1最接近的計算機近似表示是它的過剩值:

0.00011001100110011001100[1100...]
-------------------------------0.00011001100110011001101

可是“愛國者”系統莫名其妙地使用了直接截斷的不足近似值:

0.00011001100110011001100

圖片

事實上,在2月11日,“愛國者”導彈項目組在分析以色列軍方提供的系統日誌時已經發現了這個軟件錯誤:當系統連續工作8小時以上時,定位目標就會偏離正常位置的20%。他們在21日向所有使用“愛國者”的部隊發出了消息:在“長時間”啟動“愛國者“系統的情況下,射程就會發⽣偏離, 導致追蹤⽬標的失敗。也許是項目組覺得軍方肯定不會讓導彈系統的運行時間長到無法成功追蹤目標,他們在發出的通告中完全沒有解釋這個“長時間”究竟是多長時間...

2月26日,也就是事故發生後的第二天,修復後的軟件被運抵了達蘭空軍基地。

結語

從現在的視角來看,"愛國者"導彈的悲劇並不是源於什麼深奧的技術謎題,但是簡單的bug依然可以讓人們付出慘痛的代價。人類認識世界、改造世界的步伐就是以這樣一種蜿蜒曲折的方式前進着。浮點運算像是布滿暗礁的海域,理解了潮汐規律的人才能安全航行。在數字化浪潮席捲一切的今天,每個0與1的抉擇都可能成為命運的轉折點。我們無法徹底消除誤差,但每一次跌倒後的反思都將讓我們在下一次跌倒前走得更穩、更遠——只要我們永不停止從錯誤中學習的腳步。

0%(0)
0%(0)
標 題 (必選項):
內 容 (選填項):
實用資訊
回國機票$360起 | 商務艙省$200 | 全球最佳航空公司出爐:海航獲五星
海外華人福利!在線看陳建斌《三叉戟》熱血歸回 豪情築夢 高清免費看 無地區限制