Um erro de ponto flutuante que causou um dano no valor de meio bilhão

Se você já fez um pouco de programação, você deve estar ciente do termo: ponto flutuante. Um dos erros mais negligenciados e potencialmente perigosos que se encontra é o erro de ponto flutuante.

Aposto que um programador deve ter visto o erro de ponto flutuante pelo menos uma vez em sua vida. Mas quanto dano um erro de ponto flutuante pode fazer? Pergunte isso à Agência Espacial Européia que perdeu um esforço de mais de uma década e US $ 500 milhões, tudo graças a um bug de ponto flutuante.

A história de Ariane 5:

Em 4 de junho de 1996, o vôo inaugural do lançador Ariane 5 terminou em fracasso. Apenas cerca de 40 segundos após o início da sequência de voo, a uma altitude de cerca de 3700 m, o lançador desviou-se da sua trajectória de voo, desintegrou-se e explodiu.

A falha do Ariane 501 foi causada pela perda total de informações de orientação e atitude 37 segundos após o início da sequência de ignição do motor principal (30 segundos após o levantamento). Esta perda de informação deveu-se a erros de especificação e design no software do sistema de referência inercial.

A exceção interna do software SRI * foi causada durante a execução de uma conversão de dados do ponto flutuante de 64 bits para o valor inteiro assinado de 16 bits. O número de ponto flutuante que foi convertido tinha um valor maior do que o que poderia ser representado por um inteiro assinado de 16 bits.

Então, o que exatamente aconteceu?

Um número de ponto flutuante de 64 bits relacionado à velocidade horizontal do foguete em relação à plataforma foi convertido em um inteiro assinado de 16 bits. O número era maior que 32.767, o maior inteiro armazenável em um inteiro assinado de 16 bits e, portanto, a conversão falhava.

O software acabou acionando um diagnóstico do sistema que despejava seus dados de depuração em uma área de memória usada pelos programas que guiavam os motores do foguete. Ao mesmo tempo, o controle foi alterado para um computador de backup que, infelizmente, tinha os mesmos dados.

Isto foi interpretado erroneamente como necessitando de uma forte ação corretiva e os motores do foguete giraram para os limites de suas montagens. Desastre seguiu.

A codificação foi feita em Ada . A última linha é que causou a tragédia:

 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 então P_M_DERIVE (T_ALG.E_BV): = 16 # 7FFF #; elsif L_M_BV_32 <-32768, em seguida, 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)); fim 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))); 

Leitura adicional:

Esses links podem ser úteis, se você quiser ler sobre esse caro caso de erro de ponto flutuante:

//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

Recomendado

Como instalar o Gnome 3.10 no Ubuntu 13.10
2019
Conheça a Univention: Linux Alternativa Para o Controlador de Domínio do Windows
2019
Instalando o Budgie Desktop no Ubuntu
2019