Этот пример показывает, как задать дополнительное целое число 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>