컴퓨터 소숫점 연산오차가 불러온 참사
![](https://gezip.net/img/level/xeicon/153.gif)
![](https://gezip.net/data/member/re/realkyk.gif)
1991년 2월 25일 사우디의 다란에 주둔중인 미군 병영에 이라크가 발사한 스커드 미사일이 명중해 28명이 사망함
당시 미군 기지엔 패트리어트가 배치되어있었고 요격을 시도했지만 실패했음
그 원인을 조사한 결과 패트리어트 컴퓨터의 시간 계산에 생긴 오류때문이라고 밝혀짐
패트리어트 컴퓨터는 시스템이 부팅된 후 시간을 0.1초의 정수배 단위로 측정하고 이 정수값에 0.1을 곱해 실제 시간을 계산했음
근데 그 계산을 하는 컴퓨터는 24비트 레지스터로 연산을 수행했고 이 때문에 오차가 생김
왜냐면, 0.1초를 2진수로 표현하면 0.0001100110011001100110011001100...로 딱 떨어지지 않는데, 실제로 24비트 레지스터에는 최대 소수점 아래 24자리까지만 저장될 수 있기 때문
따라서 소수점 아래 25자리부터의 값은 무시되어 아주 작은 오차(이 경우엔 약 0.000000095초)가 발생하게 됨
그 자체로는 매우 작은 오차지만 시스템이 부팅되고 오랫동안 작동중이었다면 오차 역시 작동시간에 비례해서 커짐
만약 부팅된지 20시간 정도 지난다면 시간 오차가 지나치게 커져서 레이더가 실제 미사일에서 130m 떨어진 지점을 추적하게 되어 표적을 놓치게 됨
당시 미군 패트리어트는 부팅된지 100시간은 지난 상태였고, 시간 오차는 0.34초에 달해서 레이더 추적위치 오차는 700m에 달하는 수준이었음
이 사건 이후 미군은 이 오차를 보정하는 소프트웨어를 보유중인 패트리어트 포대 전부에 업데이트했음
출처 : 군사 갤러리