Найкругліші баги з округленням

Rounding

Багатьом з нас доводилось користуватись та тестувати функції округлення або ж відсікання “зайвих” знаків після коми. Я наприклад свіжий баг з округленням зовсім недавно знаходив – на минулому тижні: він не давав користувачу CRM системи зберегти та надіслати розрахований бюджет, якщо автоматично розрахована та округлена як відсоток вартість його складових в сумі не збігалась із задекларованою загальною вартістю. Це не критично, просто дратуюча дрібничка, але світ знає багато прикладів, коли баги з округленням приводили до набагато більш драматичних наслідків. Ось декілька з них:

🚀 В червні 1996 одна з перших ракет європейського космічного агенства Arianne 5-го покоління самознищилась на 39-й секунді після старту разом із 4-ма науковими супутниками на борту через конвертацію 64-бітного floating point показника горизонтальної швидкості в 16-бітний signed integer. І все було б ок, тому що цей модуль використовувався безліч разів в Arianne 4, але нова ракета 5-го покоління була набагато швидша, тому навігаційна система отримала неочікувано велике значення, видала exception та відрубилась, бортовий компьютер віддав команду на самознищення. Ось тут є детальний аналіз проблеми: хабр.

📉 У 1982-му році Ванкуверська фондова біржа започаткувала новий індекс, який стартував з відмітки 1000. Суми транзакцій обчислювались як floating point, й потім для підрахунку індексу не округлялись, а просто обрізались до трьох знаків після коми. 3000 таких підрахунків на день й через 22 місяці індекс цієї біржи впав майже в два рази – до відмітки 524.811. Помилку врешті решт знайшли та пофіксили, й в понеділок 28.11.1983 біржа відкрилась з перерахованим індексом 1098.892. wiki

📡 У 1991-му під час війни в Персидській затоці американська протиракетна система Patriot займалась округленням значень внутрішнього таймеру при переводі з integer в decimal шляхом простого множення на 0.1. Інкремент часу внутрішнього годинника відбувався кожні 0.1с, і накопичував 0.000000095с помилки. За 100 годин роботи накопичена помилка становила вже ~0.34с. Це все ще замало для людини, але вже забагато при розрахунку відстані до ворожої іракської ракети, яка не була перехвачена й успішно вразила ціль: військові бараки. Результат: 28 загиблих (та 260 поранених) – це третина всіх втрат американських військових за цю війну. Детальна стаття з аналізом: хабр.

🗳 Ще одна історія з Німеччини, на щастя без жертв, але з потенційно серйозними наслідками. На виборах у квітні 1992 партія Зелених ледь подолала прохідний бар’єр у 5%. Але дуже швидко з’ясувалось, що своєму досягненню Зелені мають завдячувати програмі яка друкувала результат із округленням 🙂 Бо насправді вони набрали 4,97%. Повз Бундестагу партія пролетіла, й завдяки перерахунку розподілу місць Соціал-Демократи отримали мінімально можливу більшість в Бундестагу. Стаття з деталями: risks register

🎁 Бонусом, стаття про фундаментальні проблеми обчислень з плаваючою комою (включно з округленням): хабр

Цікаво буде дізнатись про ваші історії або баги з округленням. Гоу в коменти!

18 December 2019
Автор: 
Mikhail Chub

Leave a comment

Leave a Reply