В этом примере показано, как задать беззнаковые и подписанные целые числа двух комплементов и фиксированных точек.
Этот пример иллюстрирует определения беззнаковых и знаковых целых чисел двух комплемента и чисел с фиксированной точкой.
Беззнаковые целые числа представлены в двоичной системе чисел следующим образом. Давайте
b = [b(n) b(n-1) ... b(2) b(1)]
быть двоичными цифрами n-битного беззнакового целого числа, где каждый 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);
Беззнаковые значения с фиксированной точкой являются беззнаковыми целыми числами, которые масштабируются степенью двойки. Отрицательную экспоненту степени двойки мы называем «дробилкой».
Если беззнаковое целое число u задано как ранее, а длина дроби равна f, то значение беззнакового числа с фиксированной точкой является
uf = u*2^-f
Например, давайте определим 3-битный беззнаковый квантователь с фиксированной точкой с дробной длиной 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);
Беззнаковые дробные числа с фиксированной точкой являются числами с фиксированной точкой, whos дробь f равна длине слова n, что создает масштабирование, такое что область значений чисел находится между 0 и 1-2 ^ -f, включительно. Это наиболее распространенная форма чисел с фиксированной точкой, потому что она имеет хорошее свойство, что все числа меньше единицы, и продукт двух чисел меньше единицы является числом меньше единицы, и поэтому умножение не переполнено.
Таким образом, определение беззнаковой дробной фиксированной точки аналогично беззнаковой фиксированной точке с ограничением, что f = n, где n - длина слова в битах.
uf = u*2^-f
Например, зададим 3-битный беззнаковый дробный квантователь с фиксированной точкой, который подразумевает дробную длину 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);
Целые числа со знаком представлены в дополнении двух в двоичной системе чисел следующим образом. Давайте
b = [b(n) b(n-1) ... b(2) b(1)]
быть двоичными цифрами n-битного целого числа со знаком, где каждый 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);
Подписанные значения с фиксированной точкой являются целыми числами со знаком, которые масштабируются степенью двойки. Отрицательную экспоненту степени двойки мы называем «дробилкой».
Если целое число с знаком задано как ранее, а длина дроби равна f, то значение числа с фиксированной точкой со знаком является
sf = s*2^-f
Например, давайте определим 3-битный квантователь с фиксированной точкой с дробью 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);
Подписанные дробные числа с фиксированной точкой являются числами с фиксированной точкой, whos длина f на единицу меньше, чем длина n слова, что создает масштабирование, такое что область значений чисел находится между -1 и 1-2 ^ -f, включительно. Это наиболее распространенная форма чисел с фиксированной точкой, потому что она имеет то хорошее свойство, что продукт двух чисел меньше единицы является числом меньше единицы, и поэтому умножение не переполнено. Единственным исключением является случай, когда мы умножаем -1 на -1, потому что + 1 не является элементом этой системы чисел. Некоторые процессоры имеют специальную инструкцию умножения для этой ситуации, а некоторые добавляют дополнительный бит в продукт, чтобы защитить от этого переполнения.
Таким образом, определение подписанной дробной фиксированной точки аналогично подписанной фиксированной точке с ограничением, что f = n-1, где n - длина слова в битах.
sf = s*2^-f
Например, зададим 3-разрядный дробный квантователь с фиксированной точкой, который подразумевает дробную длину 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>