Як математична помилка в округленні дробу коштувала життя 28 американським солдатам

Ціна однієї коми.

Уявіть: війна майже скінчилася. Ви — солдат, який чекає на повернення додому. Ви почуваєтеся в безпеці, адже вас захищає один із найсучасніших у світі комплексів протиракетної оборони. І раптом — вибух.

Саме це сталося 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 метрів.

«Петріот» дивився в порожнє небо, а в цей час «Скад» вразив казарму.

Іронія долі полягала в тому, що програмісти вже створили виправлення для цього багу. Патч був відправлений до військ, але він просто не встиг дійти до тієї самої батареї в Дахрані.

Ця трагедія стала гірким уроком для всього світу технологій. Вона показала, що в епоху, коли наше життя, безпека та майбутнє залежать від коду, не буває «незначних» помилок. Навіть найменша неточність, загублена десь після двадцятої цифри після коми, може перетворитися на катастрофу.

Підписуйтесь на новини UkrMedia в Telegram
Останні новини
Зараз читають