Un errore in virgola mobile che ha causato un danno di mezzo miliardo

Se hai mai fatto un po 'di programmazione, devi essere consapevole del termine: virgola mobile. Uno degli errori più trascurati e potenzialmente pericolosi che si incontrano è l'errore in virgola mobile.

Scommetto che un programmatore deve aver visto l'errore in virgola mobile almeno una volta nella sua vita. Ma quanto danno può fare un errore in virgola mobile? Chiedilo all'Agenzia spaziale europea che ha perso uno sforzo di oltre un decennio e $ 500 milioni, tutto grazie a un bug in virgola mobile.

La storia di Ariane 5:

Il 4 giugno 1996, il primo volo del lanciatore Ariane 5 si è concluso in un fallimento. Solo circa 40 secondi dopo l'inizio della sequenza di volo, a un'altitudine di circa 3700 m, il lanciatore ha deviato dalla traiettoria di volo, si è rotto ed è esploso.

Il fallimento di Ariane 501 è stato causato dalla perdita completa di guida e informazioni sull'assetto 37 secondi dopo l'inizio della sequenza di accensione del motore principale (30 secondi dopo il decollo). Questa perdita di informazioni era dovuta a specifiche e errori di progettazione nel software del sistema di riferimento inerziale.

L'eccezione del software SRI * interno è stata causata durante l'esecuzione di una conversione di dati da virgola mobile a 64 bit a un valore intero con segno di 16 bit. Il numero in virgola mobile che è stato convertito aveva un valore maggiore di quello che poteva essere rappresentato da un intero con segno a 16 bit.

Quindi, cosa è successo esattamente?

Un numero in virgola mobile a 64 bit relativo alla velocità orizzontale del razzo rispetto alla piattaforma è stato convertito in un numero intero con segno a 16 bit. Il numero era maggiore di 32.767, il più grande intero memorizzabile in un intero con segno a 16 bit, e quindi la conversione falliva.

Il software ha finito per attivare una diagnostica del sistema che ha scaricato i suoi dati di debug in un'area di memoria utilizzata dai programmi che guidano i motori del razzo. Allo stesso tempo, il controllo è stato trasferito su un computer di backup che sfortunatamente aveva gli stessi dati.

Ciò è stato erroneamente interpretato come se richiedesse una forte azione correttiva e i motori del razzo girassero fino ai limiti dei loro supporti. Seguito il disastro.

La codifica è stata fatta in Ada . L'ultima riga è quella che ha causato la tragedia:

 L_M_BV_32: = TBD.T_ENTIER_32S ((1.0 / C_M_LSB_BV) * G_M_INFO_DERIVE (T_ALG.E_BV)); se L_M_BV_32> 32767 poi P_M_DERIVE (T_ALG.E_BV): = 16 # 7FFF #; elsif L_M_BV_32 <-32768 quindi P_M_DERIVE (T_ALG.E_BV): = 16 # 8000 #; else P_M_DERIVE (T_ALG.E_BV): = UC_16S_EN_16NS (TDB.T_ENTIER_16S (L_M_BV_32)); finisci se; 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))); 

Ulteriori letture:

Questi collegamenti potrebbero tornare utili se vuoi leggere questo costoso caso di errore in virgola mobile:

//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_(spececraft) //www.ima.umn.edu/~arnold/disasters/ariane5rep.html //www.around.com/ariane.html

Raccomandato

KDE annuncia il sistema operativo open source basato su Linux: Plasma Mobile
2019
9 cose da fare dopo l'installazione di Ubuntu 16.04
2019
3 migliori applicazioni per Internet Streaming Radio su Ubuntu
2019