Особенности арифметики с плавающей запятой

 

В арифметике с плавающей запятой из–за погрешностей округления нарушаются фундаментальные законы алгебры (слайд 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) уменьшить влияние ошибок округления можно путем использования данных двойной точности.

 


Понравилась статья? Добавь ее в закладку (CTRL+D) и не забудь поделиться с друзьями:  



double arrow
Сейчас читают про: