Погрешность машинного округления#

Представление чисел в памяти компьютера#

Действительные числа в машинном представлении приходится округлять до \(K\) цифр после запятой. При этом число \(x\), имеющее машинное представление \(X\), находится где-то в диапазоне

\[ x \in \left[X - \Delta X, X + \Delta X\right] \]

Величина \(\Delta X\) назвается абсолютной погрешностью представления \(x\).

Относительная погрешность представления чисел в арифметике с плавающей точкой зависит от количества используемых цифр \(K\), но не от самого числа \(x\):

\[ \frac{\Delta X}{|X|} \leqslant \delta = 2^{-(K+1)} \]

Стоит отметить, что двойка здесь потому, что числа в компьютере хранятся именно в двоичной системе счисления.

Стандартом IEEE 754 определяются несколько форматов представления чисел в компьютере. Самыми распространенными являются

  • одинарная точность, single precision (float в C). Имеет \(K = 23\) и обеспечивает относительную точность \(\delta = 2^{-24} \approx 5.96 \cdot 10^{-8}\)

  • двойная точность, double precision (double в C). Имеет \(K = 52\) и обеспечивает относительную точность \(\delta = 2^{-53} \approx 1.11 \cdot 10^{-16}\)

Таким образом, погрешность округления произвольного числа \(A\) в компьютере можно определить, зная его тип (float или double), из которого мы получаем \(\delta\). Тогда погрешность округления будет \(\varepsilon_\text{round} = \delta \cdot A\).

Накопление ошибок округления#

Cуммируя величину \(\displaystyle S_n = \sum_{k=0}^{n-1} a_n\) в машинной арифметике, мы на самом деле суммируем округленные величины. Каждое слагаемое \(a_n\) представлено с абсолютной погрешностью \(\Delta a_n \leqslant |a_n| \cdot \delta\), где \(\delta\) — относительная ошибка округления.

Так как при суммировании чисел их абсолюная погрешность суммируется, при вычислении \(S_n\) накопится ошибка $\( \Delta S_n \leqslant \varepsilon_\text{round} = \sum_{k=0}^{n-1} |a_n| \cdot \delta = \delta \cdot \sum_{k=0}^{n-1} |a_n|. \)$

Таблица погрешностей операций#

Погрешности округления для основных операций (а только в них, как правило, умеют компьютеры) выглядят следующим образом (Здесь \(\varepsilon_\text{round}=\Delta\))

\(\Delta(a \pm b)=\Delta a+\Delta b\)

\(\Delta\left(a^m\right)=m \cdot a^{m-1} \Delta a\)

\(\Delta(a \cdot b)=a \cdot b[\delta(a)+\delta(b)]=b \Delta a+a \Delta b\)

\(\Delta(a / b)=\frac{a}{b}[\delta(a)+\delta(b)]=\frac{b \Delta a+a \Delta b}{b^2}\)

Источник: «Е.Г. Агапова - Вычислительная математика»

В случае вычислений погрешности «на бумаге», адекватной оценкой погрешности вполне может служить линейное приближение, но стоит помнить, что на компьюетере :

\[ \Delta f(x) \approx | f'(x) | \cdot \Delta x \]

Пример - погрешность округлений конечно-разностной схемы

Вспомним, что функция \(f(x)\) вычисляется с погрешностью \(\Delta f\). При вычислении

\[f^{(1)}(x_0) \approx \frac{f(x_0 + h) - f(x_0)}{h}\]

из-за приближенных значений \(f(x_0 + h)\), \(f(x_0)\) и \(h\) появляется ошибка округления

\[ \varepsilon_\text{round} = \frac{ 2 h \Delta f + (f(x_0 + h) - f(x_0)) \Delta h}{h^2} \approx \frac{2\Delta f}{h} \]

соответственно. Эта ошибка при уменьшении \(h\) растет как \(O(h^{-1})\).

Отсюда понимаем, что не имеет смысла уменьшать \(h\) до нуля, т.к. это лишь приведёт к увеличению ошибки округления, которая может «съесть» весь выйгрыш от уменьшения ошибки метода. Отсюда следует существование некоторого оптимального шага, при котором суммарная погрешность минимизируется.