본문 바로가기

에세이

컴퓨터에 0.1을 저장해 100명이 다친 사고

    1991년 2월 25일 걸프전 당시 미사일 격추기인 패트리어트 미사일이 오작동하여 100명 남짓의 사람들이 죽거나 다쳤다.미사일의 오작동은 미사일 격추 프로그램을 짠 프로그래머의 실수때문이였다.프로그래머는 0.1초 마다 미사일을 확인해 격추하는 코드를 작성했다.문제는 0.1초가 컴퓨터 언어 이진법으로 0.000111001100110011001100초가 바뀌였다.컴퓨터는 이숫자를 저장하는 대신 중간에 숫자를 잘라버렸다.잘라진 수는 0.1초보다 0.0001%밖에 차이나지 않았지만 0.1초마다 0.0001%의 오차를 계속 더했다.

    미사일 작동 후 5일뒤 0.0001%의 오차가 0.3초가 돼었다.당연히 미사일 격추는 불가능했다.미사일 제조사도 이 문제를 몰랐던건 아니지만,문제를 발견하고 '주기적'으로 재시작 하라는 대책을 내놨다.물론 구형 패트리어트만 그런 조치를 했었지,원래 모든 미사일에 이런 대책을 내놓진 않았다.그와달리 '주기적'의 기준을 몰랐던 군은 5일을 연달아 켰던것이다.

    이런 문제를 해결하려면 가급적이면 코딩할때 0.1을 변수에 선언해선 안됀다.필요한 경우 long long float로 시간을 미루거나 int 로 아예 변수로 쓰면 됀다.에를들어 0.1달러를 센트로 바꿔 저장하거나 0.1초를 0.05초 같은 수로 바꾸면 됀다.