Грешка с плаваща запетая, която е причинила щета на стойност половин милиард

Ако някога сте правили малко програмиране, трябва да сте наясно с термина: плаваща точка. Една от най-пренебрегваните и потенциално опасни грешки е грешката с плаваща запетая.

Обзалагам се, че един програмист трябва да е видял грешката с плаваща запетая поне веднъж в живота си. Но колко щети може да направи грешката с плаваща запетая? Попитайте това за Европейската космическа агенция, която е загубила усилията си от повече от десетилетие и 500 милиона долара, всичко това благодарение на грешка с плаваща точка.

Историята на Ариана 5:

На 4 юни 1996 г. първият полет на ракетата Ариана 5 завърши с неуспех. Само около 40 секунди след започване на полетната последователност, на височина от около 3700 м, стартерът се отклони от траекторията на полета си, разби се и експлодира.

Неуспехът на Ariane 501 е причинен от пълната загуба на информация за ориентиране и поведение 37 секунди след стартирането на основната последователност на запалване на двигателя (30 секунди след излитането). Тази загуба на информация се дължи на спецификации и грешки при проектирането в софтуера на инерционната референтна система.

Вътрешното изключение на софтуера SRI * е причинено по време на изпълнението на преобразуване на данни от 64-битова с плаваща запетая до 16-битова стойност на цяло число. Числото с плаваща запетая, което е преобразувано, има стойност, по-голяма от тази, която може да бъде представена от 16-битово означено цяло число.

И така, какво точно се случи?

64-битово число с плаваща запетая, свързано с хоризонталната скорост на ракетата по отношение на платформата, беше преобразувано в 16-битово означено число. Броят беше по-голям от 32, 767, като най-голямото цяло число можеше да се съхранява в 16-битово подписано цяло число, като по този начин конвертирането се провали.

Софтуерът завърши с диагностика на системата, която изхвърли данните за отстраняване на грешки в областта на паметта, използвана от програмите, управляващи двигателите на ракетата. В същото време контролът бе превключен на резервен компютър, който за съжаление имаше същите данни.

Това се тълкува погрешно като необходимост от силни коригиращи действия и двигателите на ракетата се завъртат до границите на техните монтажни елементи. Последва бедствие.

Кодирането е направено в Ада . Последният ред е, че е причинил трагедията:

 L_M_BV_32: = TBD.T_ENTIER_32S ((1.0 / C_M_LSB_BV) * G_M_INFO_DERIVE (T_ALG.E_BV)); ако L_M_BV_32> 32767 след това P_M_DERIVE (T_ALG.E_BV): = 16 # 7FFF #; elsif L_M_BV_32 <-32768 след това P_M_DERIVE (T_ALG.E_BV): = 16 # 8000 #; иначе P_M_DERIVE (T_ALG.E_BV): = UC_16S_EN_16NS (TDB.T_ENTIER_16S (L_M_BV_32)); край, ако; P_M_DERIVE (T_ALG.E_BH): = UC_16S_EN_16NS (TDB.T_ENTIER_16S ((1.0 / C_M_LSB_BH) * G_M_INFO_DERIVE (T_ALG.E_BH))); 

Допълнителна информация:

Тези връзки може да са полезни, ако искате да прочетете за този скъп случай на грешка с плаваща запетая:

//www.ima.umn.edu/~arnold/disasters/ariane.html //www.intel.com/standards/floatingpoint.pdf //www.theinquirer.net/inquirer/news/1047844/floating-point-bugs -explode //en.wikipedia.org/wiki/Cluster_(spacecraft) //www.ima.umn.edu/~arnold/disasters/ariane5rep.html //www.around.com/ariane.html

Препоръчано

Solus 3 Издаден! Проверете новите функции
2019
Вокал: Приложение за подкаст за Linux
2019
Liferea: Клиент на RSS и още
2019