
Уявіть: війна майже скінчилася. Ви — солдат, який чекає на повернення додому. Ви почуваєтеся в безпеці, адже вас захищає один із найсучасніших у світі комплексів протиракетної оборони. І раптом — вибух.
Саме це сталося 25 лютого 1991 року в казармі американських військ у місті Дахран, Саудівська Аравія. Війна в Перській затоці добігала переможного кінця. Але того дня іракська ракета «Скад» влучила в ціль, миттєво вбивши 28 і поранивши близько 100 людей.
Найстрашніше в цій історії те, що їхній захисник — високотехнологічний комплекс «Петріот» — бачив ракету. Але просто не вистрілив. Чому? Відповідь криється не в тактичному прорахунку чи відмові обладнання, а в мікроскопічній математичній помилці, захованій глибоко в програмному коді.
Годинник, що трохи відставав
Щоб перехопити надшвидку ціль, «Петріот» мусить працювати з неймовірною точністю. Він постійно прогнозує, де ракета буде за долі секунди, і скеровує свою «увагу» туди. В основі цих розрахунків лежить час, який відміряв внутрішній системний годинник.
Цей годинник тікав з інтервалом в одну десяту секунди (0,1 с). І тут починається трагедія комп'ютерної математики.
Ми звикли до десяткової системи. А комп'ютери мислять мовою нулів та одиниць — двійковою. Спробуйте записати дріб 1/3 у нашому звичному вигляді, і ви отримаєте нескінченне 0,33333... Так само і для комп'ютера число 0,1 було «незручним». У двійковій системі воно виглядає як нескінченний дріб: 0.0001100110011...
Оскільки пам'ять комп'ютера не гумова, він не може зберігати нескінченність. Тому система «Петріота» просто «обрізала» це число після 24-го знака.
В результаті кожну десяту секунди система оперувала числом, яке було на крихітну, майже невидиму частинку меншим за ідеальне — приблизно на 0,000000095 секунди. Це ніби годинник, що відстає на одну секунду за 3000 годин. Дрібниця, правда?
Як сніжний ком котиться з гори
Розробники знали про цю неточність. Але вони виходили з того, що «Петріот» — це мобільний комплекс, який постійно переміщують і перезавантажують. За кілька годин роботи помилка просто не встигла б накопичитися до критичного рівня.
Але війна внесла свої корективи. Батарея в Дахрані працювала безперервно понад 100 годин.
Кожну десяту секунди крихітна помилка додавалася до попередньої. Це перетворилося на цифровий сніжний ком:
- За хвилину помилка ставала помітною.
- За годину — відчутною.
- Через 100 годин безперервної роботи внутрішній годинник системи відстав від реального часу на 0,34 секунди.
Фатальні пів секунди
Що таке третина секунди в нашому житті? Час, за який ми встигаємо кліпнути. Але для ракети «Скад», що летить зі швидкістю 1,7 кілометра на секунду (це в п'ять разів швидше за звук), це ціла вічність.
Коли «Петріот» засік ворожу ракету, його розрахунки базувалися на неправильному часі. Через відставання в 0,34 секунди система шукала ціль там, де її вже не було. Прорахунок у часі створив прорахунок у просторі — на понад 600 метрів.
«Петріот» дивився в порожнє небо, а в цей час «Скад» вразив казарму.
Іронія долі полягала в тому, що програмісти вже створили виправлення для цього багу. Патч був відправлений до військ, але він просто не встиг дійти до тієї самої батареї в Дахрані.
Ця трагедія стала гірким уроком для всього світу технологій. Вона показала, що в епоху, коли наше життя, безпека та майбутнє залежать від коду, не буває «незначних» помилок. Навіть найменша неточність, загублена десь після двадцятої цифри після коми, може перетворитися на катастрофу.









