Источники погрешностей: модель, метод и машинное округление
Почему 0.1+0.2 не равно 0.3, откуда берутся ошибки в расчётах и как считать абсолютную и относительную погрешность. Живые числа, таблицы и карточки — без воды.
Калькулятор уверенно показывает 0.3, а язык Python — 0.30000000000000004. Кому верить? И второй сюрприз: программа посчитала координату моста с пятнадцатью знаками после запятой, а через месяц пролёт «гулял» на сантиметры. Численные методы начинаются с честного признания: любой расчёт врёт. Вопрос лишь в том, насколько, откуда и можно ли этим враньём управлять.
Три источника погрешности: модель, метод, округление#
Ошибка подстерегает на каждом этаже вычислительной задачи. Сначала вы заменяете реальность формулой — это погрешность модели. Потом заменяете точную формулу приближённым алгоритмом — это погрешность метода. Наконец, компьютер хранит числа в конечном числе битов — это погрешность округления.
- Модель: маятник описывают формулой без трения и без растяжения нити. Формула точна, а реальный маятник от неё отличается — это вина не математики, а упрощений
- Метод: производную заменяем разностью — даже при идеальной арифметике ответ отличается от на величину порядка
- Округление: в десятичной записи бесконечно, а в памяти компьютера под него отведено конечное число разрядов — хвост обрезан
Три источника ведут себя по-разному. Погрешность модели — вопрос физики и здравого смысла, её оценивают сравнением с экспериментом. Погрешность метода управляется выбором алгоритма и шага. Погрешность округления живёт в железе, и полностью победить её нельзя — можно только не дать ей разрастись.
Больше всего подлости — в первой. Формула пружины по закону Гука идеальна, пока деформации малы; вытяните её вдвое дальше предела пропорциональности — и расчётная жёсткость уйдёт в никуда, хотя арифметика будет безупречной. Поэтому опытный расчётчик сначала спрашивает: насколько честна сама формула? И только потом копает в машинные биты. Диагностика, какой из трёх этажей портит ответ, — навык, и собирается он из простых проверок.
Абсолютная и относительная погрешность: значащие цифры#
Пусть — точное значение, — приближённое. Абсолютная погрешность — это величина . Относительная погрешность — отношение , обычно в процентах; почему именно она судит о качестве приближения независимо от масштаба — словарная статья. Абсолютная погрешность отвечает на вопрос «на сколько врём», относительная — «на сколько процентов».
Пример из лабораторной. Масса детали: кг с точностью кг. Тогда кг, а . Толщина плёнки: мм с точностью мм — абсолютная погрешность в десять раз меньше, но относительная : измерение никуда не годится. Абсолютные цифры льстят, относительная — судит.
| Измерение | Абсолютная | Относительная | Вердикт |
|---|---|---|---|
| Мост длиной 500 м, ошибка 5 см | 0.05 м | 0.01% | блестяще |
| Масса 12 кг, ошибка 0.05 кг | 0.05 кг | 0.4% | хорошо |
| Плёнка 0.02 мм, ошибка 0.005 мм | 0.005 мм | 25% | ни о чём |
Отсюда и правило значащих цифр: число с пятью значащими цифрами гарантирует относительную погрешность порядка , и никак не лучше. Записывая , мы обещаем три значащих цифры (1, 2, 0 — завершающий ноль значим!), то есть ошибку около относительных процентов. Ответ с восемью знаками после запятой, полученный из данных с двумя, — враньё в лучших традициях отчётности.
Машинная арифметика: почему 0.1 + 0.2 ≠ 0.3#
Компьютер хранит дроби по стандарту IEEE 754. Тип double занимает 64 бита: 1 бит на знак, 11 бит на порядок, 52 бита на мантиссу (плюс неявная ведущая единица — итого 53). Это значит: любое число живёт в памяти в виде , где мантисса имеет ровно 53 двоичных разряда. Минимальный зазор между соседними числами около единицы — машинное эпсилон .
Десятичная дробь в двоичной системе — бесконечная периодическая дробь , как в десятичной. Компьютер обрезает её на 53-м бите. И , и хранятся с крошечной ошибкой; при сложении ошибки складываются, и результат оказывается ближайшим к истине машинным числом — но не тем, которое вы ждали:
- даёт — проверьте в консоли браузера
- Десять раз подряд сложить : получится , а не единица
- — реальный источник копеечных расхождений в бухгалтерских системах
53 бита мантиссы — это примерно 15–16 верных десятичных цифр. Для чертежа моста за глаза. Но ошибки перемножаются при миллиардах операций, и потому правило одно: числа с плавающей точкой не сравнивают через равенство. Пишут с разумным — например, .
Как погрешности гуляют по арифметике#
У арифметики есть честная бухгалтерия ошибок. При сложении и вычитании складываются абсолютные погрешности, при умножении и делении — относительные:
Числа. Пусть (то есть ) и (). Произведение с относительной погрешностью , то есть . Частное унаследует те же : . Ничего страшного.
А теперь вычитание близких чисел: , . Разность , но абсолютная погрешность складывается: . Относительная погрешность разности — . Два точных числа с точностью до одной тысячной процента дали ответ, который не заслуживает доверия вообще. Умножение и деление бережут относительную точность, вычитание близких чисел — убивает её. Запомните это как правило арбитра: судит не количество знаков, а относительная погрешность результата.
Катастрофическое сокращение: чем опасно √(x+1) − √x#
Классика жанра — функция . Математически она безобидна и при больших ведёт себя как . Но посчитайте её «в лоб» на double при больших — и посмотрите, что выдаёт машина:
| x | В лоб: √(x+1) − √x | Через сопряжённое | Сколько верных цифр |
|---|---|---|---|
| 5.00000006249·10⁻³ | 4.99999999999·10⁻³ | почти все | |
| 5.00000005559·10⁻⁵ | 4.99999998750·10⁻⁵ | около 8 | |
| 5.00003807·10⁻⁷ | 4.999999999999·10⁻⁷ | около 6 | |
| 0 | 7.0710678·10⁻⁹ | ни одной | |
| 0 | 5.0000000·10⁻⁹ | ни одной |
Что происходит? При соседние машинные числа отстоят друг от друга на 2. Значит, округляется обратно в , корни совпадают, и разность равна нулю — при том что истинный ответ . А при вычитание уничтожает двенадцать старших цифр, и остаются младшие — те самые, что были испорчены округлением корней. Это и есть катастрофическое сокращение (catastrophic cancellation): близкие числа вычитаются, значащие цифры гибнут.
- Умножаем и делим на сопряжённое выражение:
- Числитель сворачивается по разности квадратов:
- Получаем устойчивую формулу — без единого вычитания близких чисел
- Проверка на : машина возвращает — все обещанные цифры на месте
Тот же приём спасает квадратное уравнение: когда , корень считают через , а второй корень — по Виету. Мораль: прежде чем винить компьютер, поищите алгебраическое преобразование, убирающее вычитание близких величин.
Неустойчивые алгоритмы: ошибка, которая растёт#
Даже без вычитания близких чисел алгоритм может сам раздувать ошибку. Возьмём последовательность , и рекуррентную формулу . Точное решение — : подставьте и проверьте, коэффициенты подобраны так, что корни характеристического уравнения равны и . Но начальные данные хранятся в double, и обрезано на 16-й цифре. Эта крошечная примесь включается в общее решение с множителем — и растёт вчетверо каждый шаг:
| n | Вычислено в double | Точное 3⁻ⁿ | Что это значит |
|---|---|---|---|
| 10 | 1.6935075·10⁻⁵ | 1.6935088·10⁻⁵ | верны 6 цифр |
| 15 | 5.6398875·10⁻⁸ | 6.9691719·10⁻⁸ | сходится только порядок |
| 20 | −1.36·10⁻⁵ | 2.87·10⁻¹⁰ | мусор со знаком минус |
| 30 | −14.27 | 4.86·10⁻¹⁵ | полная катастрофа |
Формально мы делали всё правильно: четыре арифметических действия, никаких вычитаний близких чисел. Но алгоритм неустойчив: он усиливает входную ошибку, и она растёт экспоненциально — как множитель никуда не денешь. Устойчивая альтернатива здесь — считать напрямую или идти рекуррентность в обратную сторону, где ошибка делится на 4, а не умножается.
Отсюда практический вывод, ради которого всё затевалось: точность расчёта ограничивает слабейшее звено цепи «модель → метод → арифметика → алгоритм». Красивые 15 знаков от железа не спасут, если метод даёт ошибку , а алгоритм усиливает её на каждом шаге. Поэтому в численных методах сначала оценивают погрешность каждого этажа — и только потом верят ответу. Как диагностировать вредителя:
- Уменьшили шаг, а ошибка упала — главная погрешность метода: алгоритм в порядке, вопрос в дискретизации
- Шаг уже микроскопический, а ошибка стоит на месте или растёт — вы упёрлись в округление: меняйте формулу, а не шаг
- Ответ не сходится с экспериментом при идеальной сходимости — переоцените модель: где-то в ней нет существенного фактора
- Ошибка взрывается со временем или номером шага — ищите неустойчивость: где-то в решении спрятан растущий множитель
Куда двигаться дальше: в уроке про бисекцию и метод Ньютона критерий останова строится именно на относительной погрешности, а в численном дифференцировании методическая ошибка и шум округления тянут канат в разные стороны. Поведение последовательностей с растущими паразитными решениями — из той же оперы, что и рекуррентные соотношения из курса анализа: теория числовых последовательностей объяснит, почему решение рекуррентности обязано распадаться на комбинацию корней характеристического уравнения, а слово предел из словаря подскажет, к чему последовательность стремилась бы при идеальной арифметике.
Что вернёт double при вычислении ?
и . Какова относительная погрешность разности ?
Почему рекуррентный расчёт с точными формулами разваливается к ?
Частые вопросы
Что такое погрешность простыми словами?
Это разница между тем, что вычислила машина, и тем, что было на самом деле. Абсолютная погрешность показывает зазор в единицах величины (±0.05 кг), относительная — в процентах (0.4%). Судить о качестве расчёта по относительной честнее: ошибка в метр на мосту длиной километр и ошибка в метр при измерении спички — разные преступления.
Сколько значащих цифр хранит тип double?
53 бита мантиссы — это около 15–16 верных десятичных цифр, машинное эпсилон 2.22·10⁻¹⁶. Но гарантия относится к одному числу, а не к результату длинного расчёта: после тысяч операций верными могут остаться 5–6 цифр, а при неудачной формуле — ни одной.
Почему нельзя сравнивать числа с плавающей точкой через равенство?
Потому что результат арифметики — ближайшее машинное число, а не точное значение. Вместо if (s == 1) пишут if (Math.abs(s - 1) < 1e-9): сравнение с допуском. Допуск выбирают по масштабу задачи — для денег хватит 10⁻⁶, для физики частиц нужен относительный критерий.
Какой источник погрешности обычно главный?
Зависит от этапа: модель — если формула слишком груба, метод — если шаг слишком велик, округление — если формула содержит вычитание близких чисел или алгоритм неустойчив. Диагностика проста: уменьшите шаг — ошибка упала, значит, виноват метод; не упала — ищите вредителя в округлении или модели.
Готовитесь к контрольной?
Чеклист тем по «Численные методы»: что вы уже умеете, что повторить и в каком порядке.
Открыть чеклист предмета →
Проверьте себя в бою
Босс-экзамен по «Численные методы»: квизы всех уроков плюс бесконечный поток сгенерированных задач. Каждая попытка — новый расклад.
Начать босс-экзамен →