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