Настройте объекты фиксированной точки

Создайте данные фиксированной точки

Этот пример показывает основы того, как использовать фиксированную точку числовой объект fi.

Обозначение

Числовой объект фиксированной точки называется fi, потому что Дж.Х. Уилкинсон использовал fi, чтобы обозначить вычисления фиксированной точки в его классических текстовых Погрешностях округления в Алгебраических Процессах (1963) и Алгебраической Задаче о собственных значениях (1965).

Настройка

Этот пример может использовать настройки отображения или настройки, которые отличаются от того, что вы в настоящее время используете. Чтобы гарантировать, что ваши текущие настройки отображения и настройки не изменяются путем выполнения этого примера, пример автоматически сохраняет и восстанавливает их. Следующий код получает текущие состояния для любых настроек отображения или свойств, которые изменяет пример.

originalFormat = get(0, 'format');
format loose
format long g
% Capture the current state of and reset the fi display and logging
% preferences to the factory settings.
fiprefAtStartOfThisExample = get(fipref);
reset(fipref);

Атрибуты фиксированной точки по умолчанию

Чтобы присвоить тип данных с фиксированной точкой номеру или переменной с параметрами фиксированной точки по умолчанию, используйте конструктора fi. Получившееся значение фиксированной точки называется объектом fi.

Например, следующее создает объекты fi a и b с атрибутами, показанными в отображении, все из которых мы можем задать, когда переменные создаются. Обратите внимание на то, что, когда свойство FractionLength не задано, оно установлено автоматически в "лучшую точность" для данного размера слова, сохранив старшие значащие биты значения. Когда свойство WordLength не задано это значения по умолчанию к 16 битам.

a = fi(pi)
a = 

              3.1416015625

          DataTypeMode: Fixed-point: binary point scaling
            Signedness: Signed
            WordLength: 16
        FractionLength: 13
b = fi(0.1)
b = 

        0.0999984741210938

          DataTypeMode: Fixed-point: binary point scaling
            Signedness: Signed
            WordLength: 16
        FractionLength: 18

Определение со знаком и свойства WordLength

Вторые и третьи числовые аргументы задают Signed (true или 1 = signed, false или 0 = unsigned), и WordLength в битах, соответственно.

% Signed 8-bit
a = fi(pi, 1, 8)
a = 

                   3.15625

          DataTypeMode: Fixed-point: binary point scaling
            Signedness: Signed
            WordLength: 8
        FractionLength: 5

Конструктор sfi может также использоваться, чтобы создать объект fi со знаком

a1 = sfi(pi,8)
a1 = 

                   3.15625

          DataTypeMode: Fixed-point: binary point scaling
            Signedness: Signed
            WordLength: 8
        FractionLength: 5
% Unsigned 20-bit
b = fi(exp(1), 0, 20)
b = 

          2.71828079223633

          DataTypeMode: Fixed-point: binary point scaling
            Signedness: Unsigned
            WordLength: 20
        FractionLength: 18

Конструктор ufi может использоваться, чтобы создать объект fi без знака

b1 = ufi(exp(1), 20)
b1 = 

          2.71828079223633

          DataTypeMode: Fixed-point: binary point scaling
            Signedness: Unsigned
            WordLength: 20
        FractionLength: 18

Точность

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

a = ufi(0.1, 100);
bin(a)
ans =

    '1100110011001100110011001100110011001100110011001101000000000000000000000000000000000000000000000000'

Обратите внимание на то, что бесконечное повторяющееся бинарное расширение 0,1 отключено на уровне 52-го бита (на самом деле, 53-й бит является значительным, и это окружено в 52-й бит). Это вызвано тем, что переменные с плавающей точкой с двойной точностью (тип данных MATLAB® по умолчанию), хранятся в 64-битном формате с плавающей точкой, с 1 битом для знака, 11 битами для экспоненты и 52 битами для мантиссы плюс один "скрытый" бит для эффективных 53 битов точности. Даже при том, что с двойной точностью с плавающей точкой имеет очень большой спектр, его точность ограничивается 53 битами. Для получения дополнительной информации об арифметике с плавающей точкой обратитесь к Главе 1 книги Клева Молера, Числового Вычисления с MATLAB. Версия PDF может быть найдена здесь: https://www.mathworks.com/company/aboutus/founders/clevemoler.html

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

Обратите внимание на то, что продукт полной точности 40-битных операндов составляет 80 битов, который является большей точностью, чем стандарт, с двойной точностью с плавающей точкой.

a = fi(0.1, 0, 40);
bin(a)
ans =

    '1100110011001100110011001100110011001101'

b = a*a
b = 

        0.0100000000000045

          DataTypeMode: Fixed-point: binary point scaling
            Signedness: Unsigned
            WordLength: 80
        FractionLength: 86
bin(b)
ans =

    '10100011110101110000101000111101011100001111010111000010100011110101110000101001'

Доступ к данным

К данным можно получить доступ различными способами, которые сопоставляют со встроенными типами данных и двоичными строками. Например,

ДВОЙНОЙ (A)

a = fi(pi);
double(a)
ans =

              3.1416015625

возвращает "реальное" значение с плавающей точкой с двойной точностью a, квантованного с точностью a.

A.DOUBLE =...

Мы можем также установить реальное значение в двойном.

a.double = exp(1)
a = 

             2.71826171875

          DataTypeMode: Fixed-point: binary point scaling
            Signedness: Signed
            WordLength: 16
        FractionLength: 13

устанавливает реальное значение a к e, квантованному к числовому типу a.

STOREDINTEGER (A)

storedInteger(a)
ans =

  int16

   22268

возвращает "сохраненное целое число" в самом маленьком встроенном доступном целочисленном типе, до 64 битов.

Отношение между сохраненным целочисленным значением и реальным значением

В масштабировании BinaryPoint, отношении между сохраненным целочисленным значением и реальным значением

Существует также масштабирование SlopeBias, которое имеет отношение

где

и

Математические операторы fi работают с масштабированием BinaryPoint, и SlopeBias с действительным знаком масштабировал объекты fi.

ИНТЕРВАЛ (A), ОКТЯБРЬ (A), DEC (A), ШЕСТНАДЦАТЕРИЧНОЕ ЧИСЛО (A)

возвратите сохраненное целое число в двоичном файле, восьмеричном, десятичном числе без знака и шестнадцатеричных строках, соответственно.

bin(a)
ans =

    '0101011011111100'

oct(a)
ans =

    '053374'

dec(a)
ans =

    '22268'

hex(a)
ans =

    '56fc'

A.BIN =..., A.OCT =..., A.DEC =..., A.HEX =...

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

a.bin = '0110010010001000'
a = 

              3.1416015625

          DataTypeMode: Fixed-point: binary point scaling
            Signedness: Signed
            WordLength: 16
        FractionLength: 13

a.oct = '031707'
a = 

           1.6180419921875

          DataTypeMode: Fixed-point: binary point scaling
            Signedness: Signed
            WordLength: 16
        FractionLength: 13

a.dec = '22268'
a = 

             2.71826171875

          DataTypeMode: Fixed-point: binary point scaling
            Signedness: Signed
            WordLength: 16
        FractionLength: 13

a.hex = '0333'
a = 

           0.0999755859375

          DataTypeMode: Fixed-point: binary point scaling
            Signedness: Signed
            WordLength: 16
        FractionLength: 13

Определение FractionLength

Когда свойство FractionLength не задано, оно вычислено, чтобы быть лучшей точностью для значения значения и дано размер слова. Можно также задать дробную длину непосредственно в качестве четвертого числового аргумента в конструкторе fi или третьего числового аргумента в конструкторе ufi или sfi. В следующем сравните дробную длину a, который был явным образом установлен в 0 в дробную длину b, который был установлен в лучшую точность для значения значения.

a = sfi(10,16,0)
a = 

    10

          DataTypeMode: Fixed-point: binary point scaling
            Signedness: Signed
            WordLength: 16
        FractionLength: 0
b = sfi(10,16)
b = 

    10

          DataTypeMode: Fixed-point: binary point scaling
            Signedness: Signed
            WordLength: 16
        FractionLength: 11

Обратите внимание на то, что сохраненные целочисленные значения a и b отличаются, даже при том, что их реальные значения являются тем же самым. Это вызвано тем, что реальное значение a является сохраненным целым числом, масштабируемым 2^0 = 1, в то время как реальное значение b является сохраненным целым числом, масштабируемым 2^-11 = 0.00048828125.

storedInteger(a)
ans =

  int16

   10

storedInteger(b)
ans =

  int16

   20480

Определение свойств с парами параметра/Значения

К настоящему времени мы задавали числовые свойства типа путем передачи числовых аргументов конструктору fi. Мы можем также задать свойства путем давания имени свойства как строка, сопровождаемая значением свойства:

a = fi(pi,'WordLength',20)
a = 

          3.14159393310547

          DataTypeMode: Fixed-point: binary point scaling
            Signedness: Signed
            WordLength: 20
        FractionLength: 17

Для получения дополнительной информации о свойствах fi ввести

help fi

или

doc fi

в командной строке MATLAB.

Числовые свойства типа

Все числовые свойства типа fi инкапсулируются в объекте под названием numerictype:

T = numerictype
T =


          DataTypeMode: Fixed-point: binary point scaling
            Signedness: Signed
            WordLength: 16
        FractionLength: 15

Числовые свойства типа могут быть изменены также, когда объект создается путем передачи в аргументах параметра/значения

T = numerictype('WordLength',40,'FractionLength',37)
T =


          DataTypeMode: Fixed-point: binary point scaling
            Signedness: Signed
            WordLength: 40
        FractionLength: 37

или они могут быть присвоены при помощи записи через точку

T.Signed = false
T =


          DataTypeMode: Fixed-point: binary point scaling
            Signedness: Unsigned
            WordLength: 40
        FractionLength: 37

Все числовые свойства типа fi могут быть установлены целиком путем передачи в объекте numerictype. Это удобно, например, при создании больше чем одного объекта fi, которые совместно используют тот же числовой тип.

a = fi(pi,'numerictype',T)
a = 

          3.14159265359194

          DataTypeMode: Fixed-point: binary point scaling
            Signedness: Unsigned
            WordLength: 40
        FractionLength: 37
b = fi(exp(1),'numerictype',T)
b = 

          2.71828182845638

          DataTypeMode: Fixed-point: binary point scaling
            Signedness: Unsigned
            WordLength: 40
        FractionLength: 37

Объект numerictype может также быть передан непосредственно конструктору fi

a1 = fi(pi,T)
a1 = 

          3.14159265359194

          DataTypeMode: Fixed-point: binary point scaling
            Signedness: Unsigned
            WordLength: 40
        FractionLength: 37

Для получения дополнительной информации о свойствах numerictype ввести

help numerictype

или

doc numerictype

в командной строке MATLAB.

Отобразите настройки

Настройки отображения для fi могут быть установлены с объектом fipref. Они могут быть сохранены между сеансами работы с MATLAB с командой savefipref.

Отображение реальных значений

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

a = sfi(1,8,7)
a = 

                 0.9921875

          DataTypeMode: Fixed-point: binary point scaling
            Signedness: Signed
            WordLength: 8
        FractionLength: 7
bin(a)
ans =

    '01111111'

в то время как 100-битный дробный номер не может (1 быть отображенным, когда точное значение равняется 1 - 2^-99):

b = sfi(1,100,99)
b = 

     1

          DataTypeMode: Fixed-point: binary point scaling
            Signedness: Signed
            WordLength: 100
        FractionLength: 99

Обратите внимание, однако, что полная точность сохраняется во внутреннем представлении fi

bin(b)
ans =

    '0111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111'

Отображение объекта fi также затронуто командой format MATLAB. В частности, при отображении реальных значений удобно использовать

format long g

так, чтобы столько точности, сколько возможно, было отображено.

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

Для получения дополнительной информации о настройках отображения ввести

help fipref
help savefipref
help format

или

doc fipref
doc savefipref
doc format

в командной строке MATLAB.

Очистка

Следующие кодовые наборы любые настройки отображения или настройки, что пример, возвращенный к их исходным состояниям.

% Reset the fi display and logging preferences
fipref(fiprefAtStartOfThisExample);
set(0, 'format', originalFormat);
%#ok<*NOPTS,*NASGU>