Главная | Обратная связь | Поможем написать вашу работу!
МегаЛекции

Арифметика с плавающей точкой: форматы данных и реализация операций




Недостатком описания чисел в формате с фиксированной точкой является неудобство представления очень больших и очень маленьких чисел при использовании разумной длины слова w. Это ограничение снимается, если используется формат описания с плавающей точкой. Любое двоичное число с плавающей точкой можно представить в виде ±F·2E, где F обозначает мантиссу, или дробную часть, 2 - основание системы исчисления, а E - порядок. Длина слова при представлении числа в формате с плавающей точкой - w = f+e+1, где f - количество бит, отводимых для хранения мантиссы (длина мантиссы), а e - количество бит, отводимых для хранения порядка (длина порядка). Ещё один бит используется для записи знака числа, он обозначается символом s (sign). Знаковый бит положительного числа содержит нуль (s = 0), отрицательного - единицу (s = 1). Общее представление числа в формате с плавающей точкой показано на рис. 11 а.


Рисунок 11. Представление числа в формате с плавающей точкой: общее представление (а), а также форматы single (б) и double (в)

Работая с библиотекой Filter Design и, в частности, с программой fdatool, пользователь может применять один из трёх форматов с плавающей точкой: single, double (с обычной и двойной точностью, соответственно), определяемые стандартом IEEE 754 для двоичной арифметики с плавающей точкой, а также формат float. Выбор того или иного формата осуществляется, как ранее было отмечено, в окнах колонки Mode страницы Set Quantization Parameters. В колонке Format устанавливается спецификация формата, имеющая ту же форму, что и для арифметики с фиксированной точкой: [w, f], где w - длина слова, f - длина мантиссы.

В соответствии со стандартом IEEE 754, показатель записывается со смещением B. Это значит, что для получения истинного значения порядка надо из содержимого поля порядка, то есть из величины E, вычесть величину B, определяемую по формуле

B = 2e-1 – 1.

Например, если длина порядка равна 8 (e = 8), то E может принимать значения в интервале [0, 255]. Значит, значение порядка лежит в пределах интервала

[0, 255] – (28-1 – 1) = [0, 255] – 127 = [-127, 128].

В системе MATLAB граничные значения порядка зарезервированы для особых случаев, например, для отображения результатов деления конечной величины на нуль (inf), деления нуля на нуль (NaN) и др. Поэтому в приведённом примере диапазон порядка лежит в интервале [-126, 127].

Мантиссу числа с плавающей точкой можно записать по-разному. Сдвигая позицию двоичной точки влево или вправо, надо лишь соответствующим образом увеличивать или уменьшать порядок. Для достижения наибольшей точности мантиссу логично было бы расположить так, чтобы её старший бит (ближайший справа от точки) содержал единицу. Однако, раз при таком расположении содержимое старшего бита мантиссы всегда единица, её нет нужды запоминать. Этот бит является скрытым. Следовательно, если под мантиссу отведено e бит, запоминается на самом деле e+1 бит (e бит, следующие за старшим, скрытым битом мантиссы, плюс скрытый бит). Таким образом, взаимосвязь между величиной, записанной в формате, показанном на рис. 11 а, и истинным значением v задаётся в виде

v = (-1)s(2E-B)(1. F).

Числа, представленные таким способом, называются нормализованными.

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

E = порядок + B < 0.

Это явление называется исчезновением разрядов порядка, или антипереполнением порядка. Для того, чтобы увеличить порядок и тем самым избежать явления переполнения, используются денормализованные числа. Они получаются из нормализованного представления сдвигом мантиссы вправо и соответствующим увеличением порядка (то есть уменьшением модуля порядка). Для денормализованных чисел взаимосвязь записи в формате, показанном на рис. 11 а, и истинного значения определяется соотношением

v = (-1)s(2-B+1)(0. F).

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

Представления чисел при использовании форматов single и double показаны на рис. 11 б и в, соответственно. При выборе одного из этих форматов автоматически устанавливаются параметры в колонках Round mode, Overflow mode и Format. Параметрами Round mode в этом случае являются значения round, а Overflow mode - saturate. В табл. 2 указаны допустимые значения порядков и численных значений при использовании форматов single и double.

Таблица 2. Допустимые значения порядков и численных значений при использовании форматов single и double

Формат

Single

double

Порядок Значение Порядок Значение
Нормализованные 0 < E < 255 v = (-1)s(2E-127)(1. F) 0 < E < 2047 v = (-1)s(2E-1023)(1. F )
Денормализованные E = 0 v = (-1)s(2-126)(0. F) E = 0 v = (-1)s(2-1022)(0. F )

Ещё один формат, с которым работает fdatool - это float. Представление чисел в этом формате также соответствует приведённым выше формулам и обозначениям, показанным на рис. 11 а, но в этом случае пользователь может произвольно задавать длину мантиссы и порядка, а также устанавливать значения в полях Format и Round mode. При этом длина порядка должна находиться в интервале 1 £ e £ 11, а длина слова - в интервале e+1 £ w £ 64. Независимо от выбранного формата (single, double или float), в случае возникновения переполнения на выходе соответствующего квантователя устанавливается значение inf или -inf, поэтому окна колонки Overflow mode неактивны.

                                 Quantized Direct form II transposed filter                                 Numerator                                 QuantizedCoefficients{1} ReferenceCoefficients{1}                                 ( 1) 0. 000335693359375 0. 000330315544487904                                 ( 2) -0. 001007080078125 -0. 001020081231375195                                 ( 3) 0. 002593994140625 0. 002580261271031570                                 ( 4) -0. 004577636718750 -0. 004580740133027181                                 ( 5) 0. 007354736328125 0. 007347725797754056                                 ( 6) -0. 009704589843750 -0. 009715041792670265                                 ( 7) 0. 011993408203125 0. 011986955602516003                                 ( 8) -0. 013122558593750 -0. 013120022874790487                                 ( 9) 0. 013793945312500 0. 013803049933740345                                 (10) -0. 013122558593750 -0. 013120022874790454                                 (11) 0. 011993408203125 0. 011986955602515940                                 (12) -0. 009704589843750 -0. 009715041792670199                                 (13) 0. 007354736328125 0. 007347725797753998                                 (14) -0. 004577636718750 -0. 004580740133027142                                 (15) 0. 002593994140625 0. 002580261271031547                                 (16) -0. 001007080078125 -0. 001020081231375187                                 (17) 0. 000335693359375 0. 000330315544487902                                 Denominator                                   QuantizedCoefficients{2} ReferenceCoefficients{2}                                 +( 1) 0. 999969482421875 1                                 -( 2) -1. 000000000000000 -4. 0016106715603197                                 +( 3) 0. 999969482421875 13. 979587570568736                                 -( 4) -1. 000000000000000 -31. 703958726815337                                 +( 5) 0. 999969482421875 63. 654203987427906                                 -( 6) -1. 000000000000000 -100. 21434456606917                                 +( 7) 0. 999969482421875 141. 70189019442469                                 -( 8) -1. 000000000000000 -166. 01889747992664                                 +( 9) 0. 999969482421875 175. 86734947768485                                 -(10) -1. 000000000000000 -156. 48177861802839                                 +(11) 0. 999969482421875 125. 88638778866985                                 -(12) -1. 000000000000000 -83. 883343560153804                                 +(13) 0. 999969482421875 50. 201260500070624                                 -(14) -1. 000000000000000 -23. 538510095548396                                 +(15) 0. 999969482421875 9. 7742984716347578                                 -(16) -1. 000000000000000 -2. 6300444174959825                                    (17) 0. 619323730468750 0. 61932234850652279                                 FilterStructure = df2t                                 ScaleValues = [1]                                 NumberOfSections = 1                                 StatesPerSection = [16]                                 CoefficientFormat = quantizer(“fixed”, “round”, “saturate”, [16 15])                                 InputFormat = quantizer(“fixed”, “floor”, “saturate”, [16 15])                                 OutputFormat = quantizer(“fixed”, “floor”, “saturate”, [16 15])                                 MultiplicandFormat = quantizer(“fixed”, “floor”, “saturate”, [16 15])                                 ProductFormat = quantizer(“fixed”, “floor”, “saturate”, [32 30])                                 SumFormat = quantizer(“fixed”, “floor”, “saturate”, [32 30])                                 Warning: 16 overflows in coefficients.                                

Рисунок 12. Параметры фильтра-прототипа и квантованного фильтра

Поделиться:





Воспользуйтесь поиском по сайту:



©2015 - 2024 megalektsii.ru Все авторские права принадлежат авторам лекционных материалов. Обратная связь с нами...