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

Этот пример показывает основы того, как использовать фиксированную точку числовой объект 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ложь или 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 масштабирование, отношение между сохраненным целочисленным значением и реальным значением

$$ \mbox{Real-world value} = (\mbox{Stored integer})\cdot
2^{-\mbox{Fraction length}}.$$

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

$$ \mbox{Real-world value} = (\mbox{Stored integer})\cdot
\mbox{Slope}+ \mbox{Bias}$$

где

$$ \mbox{Slope} = (\mbox{Slope adjustment factor})\cdot
2^{\mbox{Fixed exponent}}.$$

и

$$\mbox{Fixed exponent} = -\mbox{Fraction length}.$$

Математические операторы 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 =...

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

$$\mbox{\texttt{fi}}(\pi)$$

a.bin = '0110010010001000'
a = 

              3.1416015625

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

$$\mbox{\texttt{fi}}(\phi)$$

a.oct = '031707'
a = 

           1.6180419921875

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

$$\mbox{\texttt{fi}}(e)$$

a.dec = '22268'
a = 

             2.71826171875

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

$$\mbox{\texttt{fi}}(0.1)$$

a.hex = '0333'
a = 

           0.0999755859375

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

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

Когда FractionLength свойство не задано, оно вычислено, чтобы быть лучшей точностью для величины значения и дано размер слова. Можно также задать дробную длину непосредственно в качестве четвертого числового аргумента в fi конструктор или третий числовой аргумент в sfi или ufi конструктор. В следующем сравните дробную длину 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>