
Ошибки, о которых мало кто задумывается

Казалось бы, компьютер считает довольно точно и вычислить на нем можно все, что угодно. И это верно, однако компьютер — всего лишь инструмент, и как всякий инструмент, он допускает некоторые погрешности вычислений.
Теперь очень поучительный пример. В 1991 году ракета «Patriot», запущенная в Саудовской Аравии, не смогла сбить иракский снаряд «Scud» из-за проблемы точности. «Scud» попал в армейскую казарму, и погибло 28 американцев.
Самое важное, наверное, то, что компьютеры имеют дело, вообще говоря, с конечным числом цифр и символов. В силу этого мы не можем выполнять арифметические действия в классе вещественных чисел так, как привыкли в чистой математике. Арифметические операции, выполняемые ЭВМ аппаратно, ограничены конечным числом разрядов, в то время как численное представление большинства вещественных чисел требует бесконечного числа разрядов. Например, численное представление таких фундаментальных констант, как 𝜋 π и 𝑒 e, требует бесконечного числа цифр и никогда не может быть введено в ЭВМ абсолютно точно. Более того, даже если наши исходные данные допускают точное представление в ЭВМ, в результате выполнения арифметических операций мы в конце концов допустим некоторые погрешности. Например, для численного представления частного от деления двух четырехзначных чисел может потребоваться бесконечное число цифр. И даже произведение двух четырехзначных чисел в общем случае требует для представления восьми цифр, так что после нескольких умножений число разрядов, необходимое для точного запоминания результата, быстро выйдет за разумные пределы. Если, например, предположить, что на ЭВМ реализована четырехразрядная десятичная арифметика, то результат операции 0.8132 ⋅ 0.6135 = 0.49889820 0.8132⋅0.6135=0.49889820 будет, в зависимости от компьютера, представлен либо как 0.4988 0.4988, либо как 0.4989 0.4989. Мы не в состоянии выполнять арифметические действия на ЭВМ абсолютно точно. В результате выполнения очень большого числа операций полученная ошибка может достаточно сильно сказаться на результате вычислений.
Чтобы более точно описать то, о чем сказано выше, давайте вспомним, что такое бит и байт. Компьютер имеет дело только с двумя состояниями: ток есть (один) и тока нет (ноль). Каждый символ — один и ноль — занимает 1 бит информации. Бит по-английски — bit ( = = binary digit) — двоичная цифра. Один байт содержит 8 битов.
Каждая вычислительная машина характеризуется длиной слова, т.е. количеством двоичных разрядов, составляющих каждое слово памяти. Эта длина слова и определяет число цифр, с которыми в машине выполняются обычные арифметические действия, называемые арифметикой с одинарной точностью. В большинстве используемых для научных расчетов ЭВМ это число эквивалентно от 6 (Intel x86: 4 байта) до 16 (Intel x86: 8 байт) десятичным знакам. Возможна также реализация арифметики более высокой точности. На многих машинах арифметика с двойной точностью, в которой, по существу, удваивается число цифр, реализуется аппаратно. В этом случае выполнение программ, использующих арифметику с двойной точностью, если и увеличивает время счета по сравнению с вариантами одинарной точности, то весьма умеренно, и только в редких случаях время счета увеличивается вдвое. Большинство современных крупных ЭВМ с короткими длинами слов имеют очень эффективную арифметику двойной точности или «чуть более» (Intel x86 — 18, 10 байт). В то же время на некоторых машинах арифметика двойной точности реализована с помощью программного обеспечения и в несколько раз увеличивает время счета по сравнению с вариантами одинарной точности. Арифметика более высокой точности, чем аппаратная, реализуется только с помощью программного обеспечения и с увеличением порядка точности становится все более неэффективной. В практических задачах арифметика высокой точности используется редко.
Большинство вычислений на компьютере производится в арифметике с плавающей точкой. Число 𝑎 a в форме с плавающей точкой представляется в виде 𝑎 = 𝑀 𝑟 𝑝 a=Mr p , где 𝑟 r — основание системы счисления, 𝑝 p — порядок числа 𝑎 a, 𝑀 M — мантисса числа 𝑎 a, причем должно выполняться условие нормировки 𝑟 − 1 ≤ ∣ 𝑀 ∣ < 1 r −1 ≤∣M∣<1. Все персональные компьютеры и большинство рабочих станций поддерживают IEEE-стандарт двоичной арифметики (этот стандарт принят Institute of Electrical and Electronic Engineers). Стандарт предусматривает два типа чисел с плавающей точкой: числа обычной точности (представляются 32 битами — 4 байтами, мантисса занимает 23 + 1 23+1 бита, порядок — 8 битов, знак — 1 бит, наибольшее представимое нормализованное число 3.40282 ⋅ 10 38 3.40282⋅10 38 , наименьшее по модулю 1.17549435 ⋅ 10 − 38 1.17549435⋅10 −38 ) и числа двойной точности (представляются 64 битами — 8 байтами, мантисса занимает 52 + 1 52+1 бит, порядок — 11 битов, знак — 1 бит, наименьшее представимое нормализованное число 1.79769313486232 ⋅ 10 − 308 1.79769313486232⋅10 −308 , наибольшее по модулю 2.2250738585072014 ⋅ 10 308 2.2250738585072014⋅10 308 ). Здесь + 1 +1 бит в мантиссе обозначает один бит (первый значащий бит), который всегда в нормализованной мантиссе равен 1 1, и он не сохраняется (за исключением субнормальных чисел, для которых этот бит равен 0 0).
Пример. Запишем представление числа 0.375 0.375 в форме с плавающей точкой (одинарная точность). Сначала переведем это число в двоичную систему счисления:
0.375 ‾ 10 = 3 8 = 1 2 + 1 2 2 = 0.11 ‾ 2 = 1.1 ‾ 2 ⋅ 2 − 1 . 0.375 10 = 8 3 = 2 1 + 2 2 1 = 0.11 2 = 1.1 2 ⋅2 −1 .
Таким образом, сохраняется мантисса 10000000000000000000000 10000000000000000000000 и порядок − 1 −1.
Знак «плюс» представляется 0 0 в знаковом бите, «минус» — 1 1.
А теперь объяснение того, что произошло в Саудовской Аравии. Компьютер, который контролировал полет ракеты «Patriot», был создан на основе разработок 1970-х годов и использовал 24-битную арифметику. В отслеживающих вычислениях время записывалось системными часами в секундах, однако оно преобразовывалось в 24-битное число с плавающей точкой. Ошибки округления во времени стали причиной ошибки в слежении за ракетой. После 100 часов выполняемых операций вычисленное время в секундах было 359999.6567 359999.6567 вместо точного значения 360000 360000, ошибка в 0.3433 0.3433 секунды повлекла ошибку в 687 687 метров в расстоянии. Позднее было установлено обновленное оборудование.
Литература
Bj o ¨ o ¨ rk A., Dahlquist G., Numerical Mathematics and Scientific Computations, SIAM, Philadelphia, 2008. V. 1
Higham N. J., Accuracy and Stability of Numerical Algorithms, SIAM, Philadelphia, 1996.
![]()


