Этот пример показывает основы того, как использовать фиксированную точку числовой объект 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
Вторые и третьи числовые аргументы задают 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 = fi(pi); double(a)
ans = 3.1416015625
возвращает "реальное" значение с плавающей точкой с двойной точностью a
, квантованный с точностью a
.
Мы можем также установить реальное значение в двойном.
a.double = exp(1)
a = 2.71826171875 DataTypeMode: Fixed-point: binary point scaling Signedness: Signed WordLength: 16 FractionLength: 13
устанавливает реальное значение a
к e
, квантованный к a
числовой тип.
storedInteger(a)
ans = int16 22268
возвращает "сохраненное целое число" в самом маленьком встроенном доступном целочисленном типе, до 64 битов.
В BinaryPoint
масштабирование, отношение между сохраненным целочисленным значением и реальным значением
Существует также SlopeBias
масштабирование, которое имеет отношение
где
и
Математические операторы fi
работайте с BinaryPoint
масштабирование и SlopeBias
с действительным знаком масштабированный
fi
объекты.
возвратите сохраненное целое число в двоичном файле, восьмеричном, десятичном числе без знака и шестнадцатеричных строках, соответственно.
bin(a)
ans = '0101011011111100'
oct(a)
ans = '053374'
dec(a)
ans = '22268'
hex(a)
ans = '56fc'
установите сохраненное целое число от двоичного файла, восьмеричного, десятичного числа без знака и шестнадцатеричных строк, соответственно.
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
свойство не задано, оно вычислено, чтобы быть лучшей точностью для величины значения и дано размер слова. Можно также задать дробную длину непосредственно в качестве четвертого числового аргумента в 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>