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

28 de outubro de 2019

Software Bugs In Computers Software Bugs In Computers Se você já fez um pouco de programação, 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 na vida. Mas quanto dano um erro de ponto flutuante pode causar? Peça isso à Agência Espacial Europeia, que perdeu um esforço de mais de uma década e $ 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 falha. Apenas cerca de 40 segundos após o início da sequência de vôo, a uma altitude de cerca de 3700 m, o lançador desviou de sua trajetória de vôo, quebrou e explodiu.

A falha do Ariane 501 foi causada pela perda completa de orientação e informações de atitude 37 segundos após o início da sequência de ignição do motor principal (30 segundos após a decolagem). Essa perda de informações ocorreu devido a erros de especificação e projeto no software do sistema de referência inercial.

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

Então, o que aconteceu exatamente?

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

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

Isso foi mal interpretado como necessitando de forte ação corretiva e os motores do foguete giraram até os limites de suas montagens O desastre se seguiu.

A codificação foi feita em Ada. A última linha é a 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 então 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:

http://www.ima.umn.edu/~arnold/disasters/ariane.html Clique para acessar floatingpoint.pdf

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

Confira também a versão original desse post em inglês
Esse post foi originalmente escrito por Abhishek Prakash e publicado no site itsfoss.com. Tradução sujeita a revisão.

A Floating Point Error That Caused A Damage Worth Half A Billion

Propaganda
Blog Comments powered by Disqus.
Propaganda