Основы программирования



              

Машинный эпсилон


Действия с плавающими числами из-за ошибок округления лишь приближенно отражают арифметику настоящих вещественных чисел. Так, если к большому плавающему числу прибавить очень маленькое, то оно не изменится. Действительно, при выравнивании порядков все значащие биты мантиссы меньшего числа могут выйти за пределы разрядной сетки, в результате чего оно станет равным нулю. Таким образом, с плавающими числами возможна ситуация, когда

a+b = a при b

0

Более того, для сложения не выполняется закон ассоциативности:

a+(b+c)

(a+b)+c

Действительно, пусть ? - максимальное плавающее число среди чисел, удовлетворяющих условию

1.0+? = 1.0

(приведенные выше рассуждения показывают, что такие числа существуют). Тогда

(1.0+?)+?

1.0+(?+?)

поскольку левая часть неравенства равна единице, а правая строго больше единицы (это следует из максимальности числа ?).

Число ? часто называют машинным эпсилоном или, чуть менее корректно, машинным нулем, поскольку при прибавлении к единице оно ведет себя как ноль. Величина машинного эпсилона характеризует точность операций компьютера. Она примерно одинакова для всех современных компьютеров: большинство процессоров работают с восьмибайтовыми плавающими числами (тип double в Си), а арифметика плавающих чисел подчиняется строгим международным стандартам.

Оценим величину машинного эпсилона для типа double. Число 1.0 записывается в плавающей форме как

1.0 = +20*1.0.

Порядок плавающего числа 1.0 равен нулю. При сложении 1.0 с числом ? производится выравнивание порядка путем многократного сдвига мантиссы числа ? вправо и увеличения его порядка на 1. Поскольку все разряды числа ? должны в результате выйти за пределы разрядной сетки, должно быть выполнено 53 сдвига. Порядок числа ? после этого должен стать равным порядку числа 1.0, т.е. нулю. Следовательно, изначально порядок числа ? должен быть равным -53:

? = 2-53*m

где m - число в диапазоне от единицы до двух. Таким образом, величина машинного эпсилона составляет примерно

2-53

10-16

Приблизительно точность вычислений составляет 16 десятичных цифр. (Это также можно оценить следующим образом: 53 двоичных разряда составляют примерно 15.95 десятичных, поскольку 53/log210

53/3.321928
15.95.)




Содержание  Назад  Вперед