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