В арифметике с плавающей запятой из–за погрешностей округления нарушаются фундаментальные законы алгебры (слайд 10):
1) коммутативный a + b = b + a
2) ассоциативный (a + b) + c = a + (b + c)
3) дистрибутивный (a + b) ∙ c = a ∙ c + b ∙ c
Сохраняет силу только первый из этих законов, в то время как остальные два могут быть нарушены. По той же причине в этой арифметике может оказаться, что
a + b = a, если a >> b
На слайде 11 приведен пример нарушения ассоциативного закона при вычислении суммы 5 чисел в арифметике с плавающей запятой с основанием β = 10 и разрядностью k = 4. Сложение производилось дважды: слева направо (в порядке возрастания) и справа налево (в порядке убывания). В первом случае погрешность оказывается значительно меньшей, при этом результат совпадает с округленным до 4 цифр точным значением суммы.
Аналогичный эффект происходит, разумеется, и в двоичной арифметике.
Рассмотрим еще один пример. Как известно, значения некоторых функций могут быть вычислены путем их разложения в бесконечный ряд Маклорена. Например, функция sin(x) раскладывается в следующий ряд:
Абсолютные величины членов этого ряда при n→∞ стремятся к 0, так как факториал растет быстрее, чем степень. Соответственно, сумма n членов ряда стремится к точному значению sin(x): ряд сходится, причем такая сходимость обеспечивается теоретически при любом значении x. Приближенное вычисление sin(x) путемразложения в ряд сводится к циклическому вычислению и суммированию его членов до тех пор, пока очередной член ряда не станет по абсолютной величине пренебрежимо малым (меньше допустимой абсолютной погрешности).
Однако при относительно больших значениях x первые члены ряда оказываются очень большими по абсолютной величине, и малые члены ряда при суммировании из–за округления не учитываются.
На слайде 12 приведена таблица значений sin(π/6 + 2kπ), полученных с помощью программы суммирования членов ряда с обычной и двойной точностью с допустимой погрешностью 0.000001. Точное значение функции при любом k составляет 0.5. Как видно из таблицы, при достаточно больших значениях k сначала погрешность результата становится больше заданной, а затем результат и вовсе перестает иметь смысл. Такой эффект называется катастрофической потерей верных цифр. В данном случае избежать данного эффекта можно путем предварительного приведения аргумента к первой четверти координатной плоскости (0 <= x <= π/2).
Из приведенных примеров можно сделать следующие выводы (слайд 13):
1) сложение последовательности чисел с сильно различающимися порядками лучше производить по возрастанию их абсолютных величин;
2) при разработке алгоритма решения задачи следует учитывать особенности арифметики с плавающей запятой;
3) уменьшить влияние ошибок округления можно путем использования данных двойной точности.