Ошибки в единицах, которые стоили реальные деньги: Mars Climate Orbiter и Gimli Glider

Последняя проверка: 2026-07-29

Две катастрофы, одна причина

Ни один из нижеприведённых инцидентов не был вызван неправильным числом. Оба были вызваны правильным числом без указания единицы измерения, которое кто-то интерпретировал как относящееся к другой единице. Это различие важно: неверный коэффициент пересчёта — это математическая ошибка, которую легко обнаружить, проверив арифметику. Отсутствие или несоответствие обозначения единицы проходит все арифметические проверки, потому что все перемножаемые числа верны — программное обеспечение, электронная таблица, расчёт выполняются ровно так, как написано. Ошибка существует исключительно в том, что человек предположил, что означает число.

Сентябрь 1999: орбитальный аппарат прибыл на 169 километров ниже требуемой высоты

Mars Climate Orbiter покинул Землю 11 декабря 1998 года в рамках программы NASA по изучению марсианской атмосферы и климата. Его траектория к Марсу требовала небольших коррекций курса в пути и периодических срабатываний ориентационных двигателей для разгрузки маховиков реакции аппарата — рутинная хозяйственная работа, выполняемая примерно десять раз в день на протяжении всего девятимесячного перелёта.

Программное обеспечение, моделирующее эффект каждого срабатывания двигателя, было написано компанией Lockheed Martin Astronautics, производителем аппарата. Согласно спецификации программного интерфейса миссии, оно должно было выводить результирующий импульс (тяга, умноженная на время горения) в ньютон-секундах, единице СИ. Программное обеспечение Lockheed, файл под названием SM_FORCES, вместо этого выводило результаты в фунт-силах-секундах, традиционном эквиваленте. Он записывал этот файл в другой, файл AMD, который команда навигации JPL считывала как входные данные для своей модели траектории — и модель JPL предполагала, согласно спецификации, что читаемые ею числа уже были в ньютон-секундах. Одна фунт-сила-секунда примерно равна 4,45 ньютон-секундам, поэтому каждое из этих срабатываний двигателя на протяжении девяти с половиной месяцев моделировалось примерно в 4,45 раза слабее, чем реальный импульс, который реально получил аппарат. Никто этого не заметил, потому что обе стороны обмена были внутренне согласованы: числа Lockheed были верными фунт-силами-секундами, модель JPL корректно обрабатывала любые полученные числа как ньютон-секунды. Формат файла не содержал поля единицы измерения.

Аппарат был нацелен пролететь на высоте 226 км над поверхностью Марса при вводе на орбиту — достаточно близко, чтобы манёвр сработал, но достаточно высоко, чтобы остаться выше атмосферы. Примерно за 24 часа до прибытия обновлённые данные слежения (всё ещё основанные на той же неправленой модели траектории) показали предполагаемую высоту около 110 км, тревожно низко, но всё же, по пониманию команды в то время, выше примерно 80–90 км, высоты, на которой атмосферные силы стали бы опасными. Реконструкция комиссии по расследованию катастроф, основанная на последней полученной телеметрии, показала, что реальная высота была ближе к 57 км — достаточно низко, чтобы атмосферный нагрев и сопротивление, вероятно, уничтожили аппарат или отправили его по траектории бегства с орбиты Марса. Связь была потеряна 23 сентября 1999 года в 09:04:52 UTC, когда орбитальный аппарат скрылся за Марсом перед манёвром введения на орбиту; он так и не показался вновь. Отчёт Комиссии первого этапа, опубликованный 10 ноября 1999 года, назвал коренную причину откровенно: ПО одной команды производило имперские единицы, где спецификация интерфейса требовала метрических, и ни один этап проверки в процессе моделирования траектории не проверял физические единицы потребляемых данных, только их числовую правдоподобность.

Сам аппарат обычно сообщается как потеря стоимостью 125 миллионов долларов — цифра, которую не следует путать с общей стоимостью 327,6 миллиона долларов более широкой программы Mars Surveyor '98, которая также финансировала отдельный Mars Polar Lander (потерянный в другой, не связанной аварии три месяца спустя). Цифра, относящаяся конкретно к орбитальному аппарату, — это та, на которую следует ссылаться для этого инцидента.

Июль 1983: величина плотности выжила с неправильной единицей

Air Canada Flight 143, Boeing 767, летевший из Монреаля в Эдмонтон 23 июля 1983 года, исчерпал топливо на высоте 41 000 футов над Red Lake в Онтарио и совершил аварийную посадку на выведённой из эксплуатации взлётно-посадочной полосе военно-воздушных сил в Гимли, Манитоба — с 69 людьми на борту и, примечательно, без жертв. Непосредственной причиной был вышедший из строя датчик количества топлива; причина, по которой экипаж всё же вылетел, рассчитав запас топлива вручную, — это история о единицах.

Этот 767 был одним из первых самолётов Air Canada, работающих в метрических единицах, которые только что приняла канадская авиационная промышленность — топливо в килограммах и литрах, а не в фунтах и галлонах, как использовал старший парк авиакомпании и её наземный персонал десятилетиями. При неработающем датчике наземный персонал измерил топливо, уже находящееся в баках, щупом — механическое измерение — и конвертировал это показание в объём 7 682 литров. Чтобы вычислить, сколько ещё топлива добавить, им нужна была масса топлива уже на борту, и они использовали коэффициент пересчёта 1,77 для преобразования литров в массу — действительная, правильная цифра для плотности топлива Jet A-1, но правильная только как 1,77 фунта на литр. Полагая, что они работают в килограммах на литр, как теперь требовалось для остального процесса заправки, экипаж и подрядчик по заправке топливом обращались с 1,77 как с 1,77 килограмма на литр — число примерно в 2,2 раза слишком большое.

Рейсу требовалось 22 300 кг топлива в целом. Используя неправильную плотность, 7 682 л рассчитывались как уже содержащие 13 597 «килограммов» (на самом деле фунтов), оставляя 8 703 «килограмма» всё ещё необходимых — конвертированные обратно в объём, используя тот же неправильный коэффициент, 4 917 л, что и было реально закачено на борт. Баки содержали 12 599 л реального топлива, когда самолёт вылетел, весившего примерно 10 100 кг при истинной плотности 0,803 кг/л: недостаточно для достижения Эдмонтона.

Расчётный вывод: почему дефицит был не случаен

Арифметика за ошибкой заправки в Гимли имеет поразительное свойство, если её выписать алгебраически. Пусть V₁ будет правильно измеренным щупом топливом уже на борту (7 682 л, не вызывало сомнений), ρ истинной плотностью (0,803 кг/л) и k коэффициентом пересчёта фунтов в килограммы (≈2,20462, так как неправильный коэффициент 1,77 фунта/л равен ρ × k). Экипаж рассчитал:

Дополнительный объём для заправки, V₂ = [22 300 − V₁×ρ×k] ÷ (ρ×k)

Общий заправленный объём, V₁+V₂ = 22 300 ÷ (ρ×k)

V₁ полностью сокращается. Правильное показание щупа вообще не имело значения для итогового суммарного объёма — только неправильный коэффициент плотности его определял. Реальная заправленная масса = (V₁+V₂) × ρ = 22 300 ÷ k = 22 300 ÷ 2,20462 ≈ 10 113 кг. Конвертируйте это обратно в фунты, и это получится почти ровно 22 300 фунтов — килограммовая цель экипажа, доставленная в фунтах вместо килограммов. Это не совпадение: всякий раз, когда единый неправильный коэффициент пересчёта единиц применяется непротиворечиво на обеих сторонах расчёта «что у меня есть, что мне ещё нужно», результат попадает на исходное целевое число, только измеренное в другой единице. Самолёт нёс число 22 300 — экипаж просто так и не узнал, какой единице оно соответствовало до отказа двигателей.

Капитан Боб Пирсон, опытный лётчик-планерист в свободное время, использовал манёвр переднего скольжения — скрещивание управления для увеличения сопротивления без набора скорости — чтобы снизить высоту на предпосадочном снижении и безопасно приземлить 767 без работающих двигателей. Десять человек получили лёгкие ранения при эвакуации; никто не погиб. Внутреннее расследование Air Canada и Aviation Safety Board того времени (предшественник современной Transportation Safety Board of Canada) оба указали на тот же основной отказ, на что указал бы Mars Climate Orbiter шестнадцать лет спустя: правильное число и процесс без проверки того, какой единице оно соответствовало.

Что общего в обоих инцидентах

Mars Climate OrbiterGimli Glider
Неправильная единицаФунт-силы-секунды, прочитанные как ньютон-секундыФунты на литр, прочитанные как килограммы на литр
Размер несоответствия×4,45×2,20
Где оно скрывалосьФормат файла без поля единицы, проверенный дважды двумя разными командами, каждая из которых предполагала, что другая использует указанную единицуОдна цифра плотности, правильная для одной системы единиц, применённая в только что переведённом метрическом процессе без переразработки
Что его обнаружилоСобственная траектория аппарата, слишком поздноДвигатели, в полёте, с достаточной оставшейся высотой для планирования
РезультатПолная потеря, без жертв (беспилотный аппарат)Самолёт отремонтирован и возвращён в эксплуатацию; без жертв

Ни один отказ не требовал плохого числа. Оба требовали числа, на этикетку единицы которого никто не перепроверял, ровно в точке, где встречались две разные соглашения единиц.

См. также: Методология и Редакционная политика -- как коэффициенты пересчёта на этом сайте подбираются и проверяются.