단위 오류로 인한 실제 손실: 화성 기후 궤도선과 김리 글라이더

마지막 검토: 2026-07-29

두 가지 재난, 하나의 근본 원인

다음의 두 사건 모두 잘못된 숫자 때문에 발생한 것이 아니었다. 둘 다 올바른 숫자에 단위가 붙지 않아 이를 접한 누군가가 다른 단위를 가정함으로써 발생했다. 이 구별이 중요한 이유는 잘못된 환산 계수는 수학 오류로서 산술을 확인하면 쉽게 찾을 수 있기 때문이다. 그러나 누락되거나 맞지 않는 단위 레이블은 곱해지는 모든 숫자가 올바르기 때문에 모든 산술 검사를 통과한다 — 소프트웨어, 스프레드시트, 계산 모두 작성된 그대로 정확하게 실행된다. 실수는 전적으로 한 인간이 그 숫자가 의미하는 바를 무엇으로 가정했는지에 존재한다.

September 1999: 화성 궤도선이 169km 너무 낮은 고도로 도착

Mars Climate Orbiter는 11 December 1998에 지구를 떠났으며, 화성의 대기와 기후를 연구하기 위한 NASA 프로그램의 일부였다. 화성으로의 궤도 전이에는 중간에 작은 궤도 수정이 필요했으며, 주기적으로 우주선의 반응 휠을 감속시키기 위해 자세 제어 추진기를 작동시켰다 — 아홉 개월 반의 전체 항해 기간 동안 대략 하루에 열 번 정도 수행되는 일상적인 유지보수 작업이었다.

각 추진기 작동의 효과를 모델링하는 소프트웨어는 우주선 제작사인 Lockheed Martin Astronautics에 의해 작성되었으며, 미션의 소프트웨어 인터페이스 사양에서는 각 작동의 결과로 나오는 임펄스(추력에 작동 시간을 곱한 값)를 SI 단위인 뉴턴초로 출력하도록 요구했다. 그러나 Lockheed의 지상 소프트웨어인 SM_FORCES 파일은 관례적 단위인 파운드포스초로 결과를 작성했다. 이 파일은 JPL의 항법팀이 궤도 모델에 입력으로 읽는 AMD 파일에 기록되었다 — 그리고 JPL의 모델은 사양에 따라 읽는 숫자들이 이미 뉴턴초 단위라고 가정했다. 한 파운드포스초는 약 4.45 뉴턴초와 같으므로, 아홉 개월 반 동안의 모든 추진기 작동이 우주선이 실제로 받은 임펄스의 약 4.45배 약하게 모델링되었다. 아무도 이를 발견하지 못했는데, 그 이유는 교환의 양쪽이 내부적으로 일관성이 있었기 때문이다: Lockheed의 숫자는 올바른 파운드포스초였고, JPL의 모델은 도착하는 모든 숫자를 뉴턴초로 올바르게 처리했다. 파일 형식에는 단위 필드가 없었다.

우주선은 궤도 삽입 시 화성 표면 위 226km에서 통과하도록 목표가 설정되었다 — 연소가 작동하기에 충분히 가깝고 대기권 위에 머물기에 충분히 높았다. 도착 약 24시간 전, 업데이트된 추적 데이터(여전히 동일한 수정되지 않은 궤도 모델을 기반으로 함)는 예상 고도를 약 110km 근처로 놓았다 — 놀라울 정도로 낮았지만, 당시 팀의 이해로는 대기 힘이 위험해지는 대략 80–90km 고도 위에 있었다. Mishap Investigation Board의 사후 손실 재구성은 실제로 수신한 마지막 원격 측정을 사용하여 실제 고도를 약 57km에 더 가깝게 놓았다 — 대기 가열과 항력이 우주선을 파괴했거나 화성 궤도 밖의 탈출 궤도로 방향을 바꿀 정도로 낮았다. 교신은 09:04:52 UTC on 23 September 1999에 끊겼으며, 궤도선이 삽입 연소를 위해 화성 뒤로 통과할 때였고, 다시 나타나지 않았다. Board의 Phase I 보고서는 10 November 1999에 발표되었으며, 근본 원인을 분명히 명시했다: 한 팀의 소프트웨어는 인터페이스 사양에서 요구한 메트릭 단위 대신 영국 단위를 생성했으며, 궤도 모델링 프로세스의 검증 단계 중 어느 것도 소비하는 데이터의 물리적 단위를 확인하지 않았고, 숫자의 타당성만 확인했다.

우주선 자체는 일반적으로 $125 million 손실로 보도된다 — 이 수치는 $327.6 million 비용의 더 광범위한 Mars Surveyor '98 프로그램과 혼동되어서는 안 되며, 이 프로그램은 별도의 Mars Polar Lander에도 자금을 제공했다(Mars Polar Lander는 석 달 후 다른 무관한 사고로 손실되었다). 궤도선 특정 수치가 이 사건에 인용할 수 있는 수치이다.

July 1983: 밀도 수치가 잘못된 단위로 생존하다

Air Canada 143편, Montreal에서 Edmonton으로 향하는 Boeing 767은 23 July 1983에 Red Lake, Ontario 상공의 41,000피트에서 연료가 떨어졌고, Manitoba의 Gimli에 있는 폐기된 공군 활주로로 비상 착륙했다 — 탑승객 69명이 있었고, 놀랍게도 사망자는 없었다. 직접적인 원인은 고장난 연료량 계기였다; 승무원이 계기가 고장난 상태에서 계속 출발한 이유는, 수동으로 연료 적재량을 계산했기 때문이며, 이는 단위 문제였다.

이 767은 Air Canada가 Canada의 항공산업이 방금 채택한 메트릭 단위로 운영하는 첫 항공기 중 하나였다 — 킬로그램과 리터 단위의 연료였으며, 항공사의 구형 기체와 수십 년 동안 사용해온 지상 승무원의 파운드와 갤런 단위가 아니었다. 계기가 작동하지 않는 상태에서, 지상 승무원은 탱크에 이미 있는 연료를 드립스틱으로 측정했고, 기계적 측정을 통해 그 수치를 7,682리터의 부피로 변환했다. 필요한 연료의 질량을 계산하기 위해, 리터를 질량으로 바꾸기 위해 1.77의 환산 계수를 사용했다 — Jet A-1 연료의 밀도에 대한 실제이고 올바른 수치이지만, 리터당 1.77파운드에서만 올바르다. 휘발유 공급 프로세스에서 이제 요구하는 리터당 킬로그램으로 작업하고 있다고 믿으면서, 승무원과 급유 계약자는 1.77을 리터당 1.77킬로그램인 것처럼 취급했다 — 약 2.2배 높은 숫자이다.

비행기는 총 22,300kg의 연료가 필요했다. 잘못된 밀도를 사용하여, 7,682L은 이미 13,597 "킬로그램" (실제로는 파운드)을 포함하고 있고, 8,703 "킬로그램"이 여전히 필요하다고 계산되었다 — 같은 잘못된 계수를 사용하여 다시 부피로 변환하면, 4,917L이 실제로 탑승했다. 탱크는 항공기가 출발할 때 12,599L의 실제 연료를 보유했으며, 대략 10,100kg의 무게(참 0.803 kg/L 밀도에서): Edmonton에 도달하기에 충분하지 않았다.

작동 유도: 왜 부족분이 임의의 것이 아닌가

Gimli 급유 오류 뒤의 산술은 대수적으로 작성되면 놀라운 특성을 가지고 있다. V₁을 올바르게 드립스틱으로 측정한 이미 탑승한 연료(7,682L, 문제가 되지 않음)라고 하고, ρ을 참 밀도(0.803 kg/L)라고 하며, k를 파운드-킬로그램 비율(≈2.20462, 잘못된 계수 1.77lb/L이 ρ × k와 같기 때문)이라고 하자. 승무원은 다음을 계산했다:

로드할 추가 부피, V₂ = [22,300 − V₁×ρ×k] ÷ (ρ×k)

로드된 총 부피, V₁+V₂ = 22,300 ÷ (ρ×k)

V₁은 완전히 소거된다. 올바른 드립스틱 판독값은 최종 합계에 절대 중요하지 않았다 — 결함이 있는 밀도 계수만이 이를 결정했다. 로드된 실제 질량 = (V₁+V₂) × ρ = 22,300 ÷ k = 22,300 ÷ 2.20462 ≈ 10,113kg. 이를 파운드로 다시 변환하면 승무원의 킬로그램 목표인 거의 정확히 22,300lb로 나온다 — 파운드 대신 배달된. 이는 우연이 아니다: 단위 환산 계수가 "내가 가진 것, 내가 여전히 필요한 것" 계산의 양쪽에서 일관되게 적용될 때마다, 결과는 원래 목표 숫자에 도달하며, 단지 다른 단위로 측정된다. 비행기는 22,300이라는 숫자를 운반했다 — 승무원은 단지 엔진이 꺼질 때까지 그것이 어떤 단위에 첨부되었는지 알지 못했다.

Captain Bob Pearson은 그의 정규 업무 외에 경험 많은 글라이더 조종사였으며, 포워드 슬립 기동 — 컨트롤을 교차시켜 속도를 얻지 않고 항력을 증가시키는 — 을 사용하여 최종 접근에서 고도를 없애고 동력 없는 767을 안전하게 착륙시켰다. 탈출 중에 열 명이 경미한 상해를 입었다; 아무도 죽지 않았다. Air Canada의 내부 검토와 그 시대의 Aviation Safety Board(현재의 Transportation Safety Board of Canada의 전신)는 모두 Mars Climate Orbiter가 열여섯 년 후에 지적할 것과 동일한 근본적인 실패를 지적했다: 올바른 숫자, 그리고 그것이 어떤 단위에 속하는지 확인하는 프로세스가 없다.

두 사건이 공유하는 것

Mars Climate OrbiterGimli Glider
잘못된 단위파운드포스초가 뉴턴초로 읽혀짐리터당 파운드가 리터당 킬로그램으로 읽혀짐
불일치의 크기×4.45×2.20
그것이 숨어 있는 곳단위 필드가 없는 파일 형식, 각각 지정된 단위를 사용한다고 가정한 두 개의 다른 팀에 의해 두 번 확인됨하나의 밀도 수치, 한 단위 시스템에 대해 올바르지만, 새로 메트릭 프로세스 내에서 재도출 없이 적용됨
그것을 잡은 것우주선 자체의 궤도, 너무 늦게엔진, 비행 중, 활강할 충분한 고도가 남아 있었음
결과완전 손실, 부상 없음(무인)항공기 수리되고 운용 복귀; 사망자 없음

두 실패 모두 나쁜 숫자가 필요하지 않았다. 둘 다 두 개의 다른 단위 규칙이 만나는 정확한 지점에서 누군가가 그 레이블을 이중 확인하지 않은 숫자가 필요했다.

함께 보기: 방법론편집 정책 -- 이 사이트의 변환 계수가 어떻게 출처를 확보하고 검토되는지.