Погрешности чисел с плавающей запятой 


Мы поможем в написании ваших работ!



ЗНАЕТЕ ЛИ ВЫ?

Погрешности чисел с плавающей запятой

Поиск

Целое число N не имеет погрешности в формате с плавающей запятой, если
1. оно не выходит из диапазона представимости, например, в рассмотренном выше 32-разрядном формате должно быть N < 1038 ;
2. в дробной части двоичной записи нормализованного числа номер самого младшего разряда, содержащего единицу, меньше или равен числу разрядов в мантиссе. Например, N=233 представляется точно, а N=233 -1 имеет погрешность.

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

Погрешность возникает при записи в память чисел, значащая часть которых имеет количество цифр, превышающее размер мантиссы, а также при сохранении вещественных чисел, дробная часть которых в двоичном представлении имеет вид бесконечной дроби. Может показаться неожиданным, что 0,1 (одна десятая) не может быть представлена точно в формате с плавающей запятой, а 0,25 – представима. Погрешность возникает при представлении дробей, знаменатель которых содержит простые множители, отличные от двух, например:

       0.110 =1/(2*5) = 0.00011001100 . . . = 0.000(1100)                                                         в периоде

Точно в формате с плавающей запятой представляется число, модуль которого можно записать в виде следующей несократимой дроби:

  M/2n    , где M и n – натуральные числа.

Посмотрим, как можно оценить погрешность представления числа N в формате с плавающей запятой. Для простоты рассмотрим пример, в котором мантисса в формате с плавающей запятой имеет 6 двоичных разрядов (формат 12 битов: 1 бит – знак числа, 5 битов – порядок, 6 битов – мантисса), а N=1045.

Получим результат прямым переводом N в двоичную систему счисления:

   1045 = 1024 + 16 + 4 + 1 = 100000101012 = 1.00000101012*210    Мантисса m = 1.00000101012-1 = 0.00000101012    Порядок p = 1010 = 10102,смещенный порядок рсм = 15+10 = 25 = 110012

1|1|0|0

0|0|0|0|0|1

 

0 1 0 1

+

5 6

 

остаток

В ячейку памяти поместилось число 1.0000012*210.. Переведём сохраненное число в десятичную систему счисления: это будет 1040. Погрешность составляет 1045 – 1040 = 5.

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

Погрешности возникают и при арифметических операциях над числами с плавающей запятой. Сложив на ЭВМ 8-значное целое десятичное число N с единицей, используя 32-разрядный двоичный формат с плавающей запятой, получим

       N + 1 = N !!!,

так как восьмая, младшая цифра числа N не попадает в мантиссу.

Чтобы проще представить исчезновение единицы при сложении, рассмотрим вместо записи в двоичной системе счисления пример с десятичными числами, представленными в полулогорифмической форме с 7-разрядной мантиссой:

      N = 12 345 678 ≅ 0.1234567*108,                               7 цифр   N + 1 = 12 345 679 ≅ 0.1234567*108.

N и N+1 в полулогарифмической форме с семью знаками выглядят одинаково, так как погрешность превышает величину изменения числа. При сложении чисел в форме с плавающей запятой может нарушаться сочетательный (ассоциативный) закон:

       N + 1 + 1 + ... + 1 ≠ N + ( 1 + 1 + ... + 1) ,             20 единиц            20 единиц       N + 1 + 1 + ... + 1 = N = 0.1234567*108,              20 единиц   a      N + ( 1 + 1 + ... + 1) = N + 20 = 0.1234569*108 +             20 единиц

Примеры сложения чисел в 32-разрядном двоичном формате с плавающей запятой из-за большого количества разрядов теряют свою наглядность, поэтому рассмотрим сложение чисел 1040 и 1 в приведенном выше 12-битном формате с 6-битной мантиссой. Число 1040 точно представимо в данном формате. Его представление было рассмотрено выше: 1040 = 100000100002 = 1.0000012*210, число 1 будет представлено следующим образом: 1 = 1.000000*100 (хранимая мантисса = 0, порядок = 0, смещенный порядок = 15). Для выполнения сложения нужно привести слагаемые к одному порядку, для этого надо сдвинуть вправо мантиссу меньшего по модулю слагаемого на число разрядов, равное разности порядков складываемых чисел. В нашем примере нужно сдвинуть мантиссу единицы на 10-0=10 разрядов

1045    

1|1|0|0

0|0|0|0|0|1

 

 

1    

1|1|0|0

0|0|0|0|0|0

 

0 0 0 1

Происходит потеря значащей части меньшего слагаемого. В результате сложения получим 1,000001*210 = 1040

В первом приближении можно считать, что если

 a  > 107 , b то в 32-разрядном двоичном формате с плавающей запятой a + b = a.


Поделиться:


Последнее изменение этой страницы: 2024-06-17; просмотров: 57; Нарушение авторского права страницы; Мы поможем в написании вашей работы!

infopedia.su Все материалы представленные на сайте исключительно с целью ознакомления читателями и не преследуют коммерческих целей или нарушение авторских прав. Обратная связь - 216.73.216.198 (0.009 с.)