В этом примере показано, как задать дополнительное целое число two со знаком и без знака и числа фиксированной точки.
Этот пример иллюстрирует определения и signed-two's-complement чисел целочисленной и фиксированной точки без знака.
Беззнаковое целое представлено в системе двоичного числа следующим образом. Пусть
b = [b(n) b(n-1) ... b(2) b(1)]
будьте двоичными цифрами n-bit беззнакового целого, где каждый b (i) является любой единицей или нулем. Затем значение b
u = b(n)*2^(n-1) + b(n-1)*2^(n-2) + ... + b(2)*2^(1) + b(1)*2^(0)
Например, давайте зададим 3-битный квантизатор беззнаковых целых чисел и давайте перечислим его область значений.
originalFormat = get(0, 'format'); format q = quantizer('ufixed',[3 0]); [a,b] = range(q); u = (a:eps(q):b)' % Now, let's display those values in binary. b = num2bin(q,u)
u =
0
1
2
3
4
5
6
7
b =
8x3 char array
'000'
'001'
'010'
'011'
'100'
'101'
'110'
'111'
Давайте выстроим их вокруг циферблата с их соответствующими двоичными и десятичными значениями.
fidemo.numbercircle(q);

Значения фиксированной точки без знака являются беззнаковым целым, которое масштабируется степенью двойки. Мы вызываем отрицательную экспоненту степени двойки "fractionlength".
Если беззнаковое целое u задано как прежде, и fractionlength является f, то значение номера фиксированной точки без знака
uf = u*2^-f
Например, давайте зададим 3-битный квантизатор фиксированной точки без знака с fractionlength 1 и давайте перечислим его область значений.
q = quantizer('ufixed',[3 1]); [a,b] = range(q); uf = (a:eps(q):b)' % Now, let's display those values in binary. b = num2bin(q,uf)
uf =
0
0.5000
1.0000
1.5000
2.0000
2.5000
3.0000
3.5000
b =
8x3 char array
'000'
'001'
'010'
'011'
'100'
'101'
'110'
'111'
Давайте выстроим их вокруг циферблата с их соответствующими двоичными и десятичными значениями.
fidemo.numbercircle(q);

Дробные числа фиксированной точки без знака являются числами фиксированной точки, кто fractionlength f, равно wordlength n, который производит масштабирование, таким образом, что область значений чисел между 0 и 1 2\U 005E\f, включительно. Это - наиболее распространенная форма чисел фиксированной точки, потому что она имеет хорошее свойство, которого все числа меньше один, и продукт двух чисел, меньше чем один - номер меньше чем один, и таким образом, умножение не переполняется.
Таким образом определение дробной фиксированной точки без знака совпадает с фиксированной точкой без знака с ограничением, что f=n, где n является wordlength в битах.
uf = u*2^-f
Например, давайте зададим 3-битный дробный квантизатор фиксированной точки без знака, который подразумевает fractionlength 3.
q = quantizer('ufixed',[3 3]); [a,b] = range(q); uf = (a:eps(q):b)' % Now, let's display those values in binary. b = num2bin(q,uf)
uf =
0
0.1250
0.2500
0.3750
0.5000
0.6250
0.7500
0.8750
b =
8x3 char array
'000'
'001'
'010'
'011'
'100'
'101'
'110'
'111'
Давайте выстроим их вокруг циферблата с их соответствующими двоичными и десятичными значениями.
fidemo.numbercircle(q);

Целые числа со знаком представлены в two's-дополнении в системе двоичного числа следующим образом. Пусть
b = [b(n) b(n-1) ... b(2) b(1)]
будьте двоичными цифрами n-bit целого числа со знаком, где каждый b (i) является любой единицей или нулем. Затем значение b
s = -b(n)*2^(n-1) + b(n-1)*2^(n-2) + ... + b(2)*2^(1) + b(1)*2^(0)
Обратите внимание на то, что различием между этим и номером без знака является отрицательный вес на больше-всего-значимом-бите (MSB).
Например, давайте зададим 3-битный квантизатор целого числа со знаком и давайте перечислим его область значений.
q = quantizer('fixed',[3 0]); [a,b] = range(q); s = (a:eps(q):b)' % Now, let's display those values in binary. b = num2bin(q,s) % Note that the most-significant-bit of negative numbers is 1, and positive % numbers is 0.
s =
-4
-3
-2
-1
0
1
2
3
b =
8x3 char array
'100'
'101'
'110'
'111'
'000'
'001'
'010'
'011'
Давайте выстроим их вокруг циферблата с их соответствующими двоичными и десятичными значениями.
Причина этого неловко выглядящего определения отрицательных чисел состоит в том, что сложение всех чисел, и положительных и отрицательных, выполняется, как будто они были все положительны, и затем n+1 несут бит, отбрасывается. Результат будет правилен, если не будет никакого переполнения.
fidemo.numbercircle(q);

Значения фиксированной точки со знаком являются целыми числами со знаком, которые масштабируются степенью двойки. Мы вызываем отрицательную экспоненту степени двойки "fractionlength".
Если целое число со знаком s задано как прежде, и fractionlength является f, то значение номера фиксированной точки со знаком
sf = s*2^-f
Например, давайте зададим 3-битный квантизатор фиксированной точки со знаком с fractionlength 1 и давайте перечислим его область значений.
q = quantizer('fixed',[3 1]); [a,b] = range(q); sf = (a:eps(q):b)' % Now, let's display those values in binary. b = num2bin(q,sf)
sf =
-2.0000
-1.5000
-1.0000
-0.5000
0
0.5000
1.0000
1.5000
b =
8x3 char array
'100'
'101'
'110'
'111'
'000'
'001'
'010'
'011'
Давайте выстроим их вокруг циферблата с их соответствующими двоичными и десятичными значениями.
fidemo.numbercircle(q);

Дробные числа фиксированной точки со знаком являются числами фиксированной точки, кто fractionlength f, тот меньше, чем wordlength n, который производит масштабирование, таким образом, что область значений чисел между-1 и 1 2\U 005E\f, включительно. Это - наиболее распространенная форма чисел фиксированной точки, потому что она имеет хорошее свойство, что продукт двух чисел, меньше чем один - номер меньше чем один, и таким образом, умножение не переполняется. Единственное исключение имеет место, когда мы умножаемся-1 на-1, потому что +1 не элемент этой системы счисления. Некоторые процессоры имеют специальную инструкцию по умножению для этой ситуации, и некоторые добавляют дополнительный бит в продукте, чтобы принять меры против этого переполнения.
Таким образом определение дробной фиксированной точки со знаком совпадает с подписанной фиксированной точкой с ограничением, что f=n-1, где n является wordlength в битах.
sf = s*2^-f
Например, давайте зададим 3-битный дробный квантизатор фиксированной точки со знаком, который подразумевает fractionlength 2.
q = quantizer('fixed',[3 2]); [a,b] = range(q); sf = (a:eps(q):b)' % Now, let's display those values in binary. b = num2bin(q,sf)
sf =
-1.0000
-0.7500
-0.5000
-0.2500
0
0.2500
0.5000
0.7500
b =
8x3 char array
'100'
'101'
'110'
'111'
'000'
'001'
'010'
'011'
Давайте выстроим их вокруг циферблата с их соответствующими двоичными и десятичными значениями.
fidemo.numbercircle(q); set(0, 'format', originalFormat); %#ok<*NOPTS,*NASGU>
