Числа с фиксированной запятой: Вычисления с фиксированной точкой. Основные принципы (ч.1) / Хабр

n.

Вот, к примеру, макросы для такого преобразования:

#define fx16q16_make(a)  ((fx16q16_t)((a) * (1LL<<16)))
#define fx5q27_make(a)  ((fx5q27_t)((a) * (1LL<<27)))

Если вы преобразовываете целое число, то можно не умножать, а просто сдвигать, так как умножение на степени двойки — это тот-же сдвиг, но вариант с умножением — более общий:

#define fx16q16_make(a)  ((fx16q16_t)((a)<<16))
#define fx5q27_make(a)  ((fx5q27_t)((a)<<27))

Для обратного преобразования, как не странно, мы сдвигаем наше число обратно.

#define fx16q16_uint16(a)((uint16)((a) >> 16))
#define fx5q27_uint8(a)  ((uint8)((a)>>27))

Можно преобразовать и в число с плавающей запятой:

#define fx16q16_float(a) ((a) / (float)(1LL<<16))

Для преобразование числа из одного положения фиксированной запятой в другое, его нужно сдвинуть на разницу в количестве дробный бит:

#define fx16q16_to_fx5q27(a) ((fx5q27_t)a<<11)
Сложение, вычитание, умножение

Сложение и вычитание числе с фиксированной запятой точно такое-же, как и у целых чисел. Можно даже не определять макросы для этого

fx16q16_make(5)+fx16q16_make(8)==fx16q16_make(13)
fx16q16_make(18)-fx16q16_make(4)==fx16q16_make(14)

А вот для умножения и деления нам понадобится контейнер в два раза большего размера для хранения промежуточного результата, ведь при умножении 32 бит на 32 бита может получиться 64 бита:

#define fx16q16_mul(a,b) ((fx16q16_t)(((int64_t)(a) * (b)) >> 16))
#define fx16q16_div(a,b) ((fx16q16_t)(((int64_t)(a) << 16) / (b)))

Кстати, если вам нужно разделить на 10, или любую другую константу, можно заставить препроцессор посчитать 1/10, а потом — умножать на это число. Такой финт ушами позволяет сильно ускориться на процессорах без аппаратного делителя. К примеру:

fx16q16_t result = fx16q16_mul(number_to_divide_by_10, fx16q16_make(1.0f/10.0f))

Если вам нужно умножить или разделить на целое число, то можно делать эту операцию прямо на месте, без никаких сдвигов и преобразований

fx16q16_t mul_by_5 = fx_number * 5
fx16q16_t div_by_5 = fx_number / 5

Более эффективными способами умножения и деления поделился nevier в комментариях.

Скорость

Естественно, главная причина, по которой мы работаем с этими числами — скорость. Для эффективной работы, нам понадобится очень много сдвигов.

Для того, чтобы сдвиги происходить быстро, в процессоре должен быть так называемый barrel-shifter. barrel-shifter — это кусок АЛУ, которая позволяет сдвигать числа на любое количество бит за один такт.

Часто, barrel-shifter эмулируется умножителем. К примеру, чтобы сдвинуть число влево на 3 бита, его можно просто умножить на 8.

Есть еще одна хитрость. Если под дробную часть отвести количество бит кратное 8, то процессор может просто выбрать байты со смещением и не использовать сдвигов вообще. Это особенно актуально, если числа разрадность процессора меньше разрядности используемого числа (к примеру, 32-битные числа на AVR).

Переполнениия

Как и другие числа, числа с фиксированной запятой можно переполнить. К примеру:

fx16q16_make(300)*fx16q16_make(300) = 0

Для того, чтобы такое не происходило, очень часто используют числа с нулевым количеством целых бит. К примеру, q0.32. Так как при умножении числа меньше единицы на число меньше единицы всегда будет число меньше единицы, переполнение q0.32 при умножениях просто невозможно.

При сложении, числа с фиксированной запятой ведут себя точно так-же, как и обычные целые числа.

Отладка

Отладка фиксированных запятых может быть очень заковыристой, потому, что вместо простого и понятного «5», в отладчике вы увидите «327680». К счастью, многие программы умеют показывать вычисленные результаты в watch-окне. К примеру, в IAR’е можно написать:

После того, как такая возможность появилась, отладка стала значительно легче.

Заключение

Не смотря на то, что уже появились доступные контроллеры с FPU, числа с фиксированной запятой должны быть в арсенале любого эмбеддера. Штука очень полезная, быстрая, изящная и переносимая. Особенно, это актуально для ПЛИС, где сдвиги делаются просто подключениями к соответствующим регистрам, и, поэтому числа с фиксированной запятой там работают просто чрезвычайно быстро.

Числа с фиксированной запятой / Программирование и алгоритмы / Сообщество разработчиков электроники

Расчеты в наших устройствах не всегда (мягко говоря) бывают целочисленными, а использовать числа с плавающей запятой (float или double) — весьма ресурсозатратно и не всегда корректно. Что же делать?

Есть несколько вариантов. К примеру, можно использовать отмасштабированные числа. Если нужно измерять вольты, то можно представить значения в милливольтах. Таким образом, мы получим и целое число и точные расчеты. Если не хватает милливольт, можно использовать микровольты, и так далее.

Такой подход часто используется в разных CADах и финансовой сфере. К примеру, в KiCad, расстояния измеряются в нанометрах и хранятся в int’ах (отсюда, кстати. максимальный размер платы — 4*4 метра).

Часто представить величину в разных масштабах не особо хочется (к примеру, на индикаторе нужно отображать целую часть числа, а дробная часть служит только для повышения точности расчетов), и вот тогда приходится использовать числа с фиксированной запятой. Число с фиксированной запятой — это те-же целые числа, но, условно, под дробную часть выделено некоторое количество бит. Давайте, к примеру, из 32-битного целого числа сделаем несколько чисел с фиксированной запятой:


Как видно, числа с фиксированной запятой обозначают как qm.n, где m — целая часть, а n — дробная. Если число должно быть со знаком, то бит для знака отбирают у целой части.n.

Вот, к примеру, макросы для такого преобразования:

#define fx16q16_make(a)  ((fx16q16_t)((a) * (1LL<<16)))
#define fx5q27_make(a)  ((fx5q27_t)((a) * (1LL<<27)))

Если вы преобразовываете целое число, то можно не умножать, а просто сдвигать, так как умножение на степени двойки — это тот-же сдвиг, но вариант с умножением — более общий:

#define fx16q16_make(a)  ((fx16q16_t)((a)<<16))
#define fx5q27_make(a)  ((fx5q27_t)((a)<<27))

Для обратного преобразования, как не странно, мы сдвигаем наше число обратно.

#define fx16q16_uint16(a)((uint16)((a) >> 16))
#define fx5q27_uint8(a)  ((uint8)((a)>>27))

Можно преобразовать и в число с плавающей запятой:

#define fx16q16_float(a) ((a) / (float)(1LL<<16))

Для преобразование числа из одного положения фиксированной запятой в другое, его нужно сдвинуть на разницу в количестве дробный бит:

#define fx16q16_to_fx5q27(a) ((fx5q27_t)a<<11)
Сложение, вычитание, умножение

Сложение и вычитание числе с фиксированной запятой точно такое-же, как и у целых чисел. Можно даже не определять макросы для этого

fx16q16_make(5)+fx16q16_make(8)==fx16q16_make(13)
fx16q16_make(18)-fx16q16_make(4)==fx16q16_make(14)

А вот для умножения и деления нам понадобится контейнер в два раза большего размера для хранения промежуточного результата, ведь при умножении 32 бит на 32 бита может получиться 64 бита:

#define fx16q16_mul(a,b) ((fx16q16_t)(((int64_t)(a) * (b)) >> 16))
#define fx16q16_div(a,b) ((fx16q16_t)(((int64_t)(a) << 16) / (b)))

Кстати, если вам нужно разделить на 10, или любую другую константу, можно заставить препроцессор посчитать 1/10, а потом — умножать на это число. Такой финт ушами позволяет сильно ускориться на процессорах без аппаратного делителя. К примеру:

fx16q16_t result = fx16q16_mul(number_to_divide_by_10, fx16q16_make(1.0f/10.0f))

Если вам нужно умножить или разделить на целое число, то можно делать эту операцию прямо на месте, без никаких сдвигов и преобразований

fx16q16_t mul_by_5 = fx_number * 5
fx16q16_t div_by_5 = fx_number / 5

Более эффективными способами умножения и деления поделился nevier в комментариях.

Скорость

Естественно, главная причина, по которой мы работаем с этими числами — скорость. Для эффективной работы, нам понадобится очень много сдвигов.

Для того, чтобы сдвиги происходить быстро, в процессоре должен быть так называемый barrel-shifter. barrel-shifter — это кусок АЛУ, которая позволяет сдвигать числа на любое количество бит за один такт.

Часто, barrel-shifter эмулируется умножителем. К примеру, чтобы сдвинуть число влево на 3 бита, его можно просто умножить на 8.

Есть еще одна хитрость. Если под дробную часть отвести количество бит кратное 8, то процессор может просто выбрать байты со смещением и не использовать сдвигов вообще. Это особенно актуально, если числа разрадность процессора меньше разрядности используемого числа (к примеру, 32-битные числа на AVR).

Переполнениия

Как и другие числа, числа с фиксированной запятой можно переполнить. К примеру:

fx16q16_make(300)*fx16q16_make(300) = 0

Для того, чтобы такое не происходило, очень часто используют числа с нулевым количеством целых бит. К примеру, q0.32. Так как при умножении числа меньше единицы на число меньше единицы всегда будет число меньше единицы, переполнение q0.32 при умножениях просто невозможно.

При сложении, числа с фиксированной запятой ведут себя точно так-же, как и обычные целые числа.

Отладка

Отладка фиксированных запятых может быть очень заковыристой, потому, что вместо простого и понятного «5», в отладчике вы увидите «327680». К счастью, многие программы умеют показывать вычисленные результаты в watch-окне. К примеру, в IAR’е можно написать:

После того, как такая возможность появилась, отладка стала значительно легче.

Заключение

Не смотря на то, что уже появились доступные контроллеры с FPU, числа с фиксированной запятой должны быть в арсенале любого эмбеддера. Штука очень полезная, быстрая, изящная и переносимая. Особенно, это актуально для ПЛИС, где сдвиги делаются просто подключениями к соответствующим регистрам, и, поэтому числа с фиксированной запятой там работают просто чрезвычайно быстро.

Фиксированная точка против числа с плавающей запятой

Я просто не могу понять числа с фиксированной и плавающей точками из-за трудночитаемых определений о них во всем Google. Но ни одна из прочитанных мною книг не дает достаточно простого объяснения того, что они собой представляют. Могу ли я получить простое определение с помощью примера?

numbers

computer-science

representation

Поделиться

Источник


user942451

23 сентября 2011 в 05:53

5 ответов



145

Число с фиксированной точкой имеет определенное количество битов (или цифр), зарезервированных для целочисленной части (часть слева от десятичной точки), и определенное количество битов, зарезервированных для дробной части (часть справа от десятичной точки). Независимо от того, насколько велико или мало ваше число, оно всегда будет использовать одно и то же количество битов для каждой части. Например, если ваш формат фиксированной точки был десятичным IIIII.FFFFF , то наибольшее число, которое вы могли бы представить, было бы 99999.99999 , а наименьшее ненулевое число — 00000.00001 . Каждый бит кода, обрабатывающий такие числа, должен иметь встроенное знание о том, где находится десятичная точка.

Число с плавающей запятой не резервирует определенное количество битов для целочисленной или дробной части. Вместо этого он резервирует определенное количество битов для числа (называемого мантиссой или знаменателем) и определенное количество битов, чтобы сказать , где внутри этого числа находится десятичное число (называемое показателем )., поэтому число с плавающей запятой, занимающее 10 цифр с 2 цифрами, зарезервированными для показателя, может представлять наибольшее значение 9.9999999e+50 и наименьшее ненулевое значение 0.0000001e-49 .

Поделиться


Gabe

23 сентября 2011 в 06:06


31

Число с фиксированной точкой просто означает, что после десятичной точки есть фиксированное число цифр. Число с плавающей запятой позволяет использовать различное количество цифр после десятичной точки.

Например, если у вас есть способ хранения чисел, который требует ровно четыре цифры после десятичной точки, то это фиксированная точка. Без этого ограничения это плавающая точка.

Часто, когда используется фиксированная точка, программист фактически использует целое число, а затем делает предположение, что некоторые цифры находятся за десятичной точкой. Например, я мог бы сохранить две цифры точности, поэтому значение 100 означает на самом деле означает 1.00, 101 означает 1.01, 12345 означает 123.45 и т. д.

Числа с плавающей запятой более общего назначения, потому что они могут представлять очень маленькие или очень большие числа одним и тем же способом, но есть небольшой штраф в том, чтобы иметь дополнительное хранилище для того, куда идет десятичный знак.

Поделиться


Vaughn Cato

23 сентября 2011 в 06:04


5

Насколько я понимаю, арифметика с фиксированной точкой выполняется с использованием целых чисел. где десятичная часть хранится в фиксированном количестве битов или число умножается на то, сколько цифр десятичной точности необходимо.

Например, если число 12.34 должно быть сохранено, и нам нужно только две цифры точности после десятичной точки, число умножается на 100 , чтобы получить 1234 . При выполнении математики с этим числом мы использовали бы этот набор правил. Добавление 5620 или 56.20 к этому числу даст 6854 в данных или 68.54 .

Если мы хотим вычислить десятичную часть числа с фиксированной точкой, мы используем операнд по модулю (%).

12.34 (псевдокод):

v1 = 1234 / 100 // get the whole number
v2 = 1234 % 100 // get the decimal number (100ths of a whole).
print v1 + "." + v2 // "12.34"

Числа с плавающей запятой-это совершенно другая история программирования. Текущий стандарт для чисел с плавающей запятой использует что-то вроде 23 бит для данных числа, 8 бит для показателя степени и 1 бит для знака. См. эту ссылку в Википедии для получения дополнительной информации об этом.

Поделиться


Mr. Goober

21 февраля 2017 в 20:13


  • Почему числа с плавающей запятой неточны?

    Почему некоторые числа теряют точность при хранении в виде чисел с плавающей запятой? Например, десятичное число 9.2 может быть выражено точно как отношение двух десятичных целых чисел ( 92/10 ), оба из которых могут быть выражены точно в двоичном формате ( 0b1011100/0b1010 ). однако то же самое…

  • Случаи, когда числа с плавающей запятой сопоставимы с использованием равенства

    Недавно я ввязался в дискуссию о сравнении с плавающей запятой. Моя точка зрения всегда состояла в том, чтобы не сравнивать два числа с плавающей запятой, используя == напрямую. Было указано, что это не так, и есть случаи, когда использование == совершенно нормально. Я могу думать о типичных…


3

Термин «фиксированная точка» относится к соответствующему способу представления чисел с фиксированным числом цифр после, а иногда и до десятичной точки.2-1). Поэтому я хочу зациклиться на окрестности данного числа с плавающей…

Знак числа с плавающей запятой

Есть ли простой способ определить знак числа с плавающей запятой? Я экспериментировал и придумал вот что: #include <iostream> int main(int argc, char** argv) { union { float f; char c[4]; }; f…

Каков двоичный формат числа с плавающей запятой, используемый C++ в системах на базе Intel?

Мне интересно узнать о двоичном формате для одного или двойного типа, используемого C++ в системах на базе Intel. Я избегал использования чисел с плавающей запятой в тех случаях, когда данные…

PI и точность числа с плавающей запятой

Представление числа Пи с плавающей запятой single/double/extended-precision является точным до скольких знаков после запятой?

Считается ли умножение десятичного числа, где все результаты являются полными целыми числами, математикой с плавающей запятой?

Извините за многословное название. Мой код нацелен на microcontroller (msp430) без единицы измерения с плавающей запятой, но это должно относиться к любому подобному MCU. Если я умножаю большую…

Почему числа с плавающей запятой неточны?

Почему некоторые числа теряют точность при хранении в виде чисел с плавающей запятой? Например, десятичное число 9.2 может быть выражено точно как отношение двух десятичных целых чисел ( 92/10 ),…

Случаи, когда числа с плавающей запятой сопоставимы с использованием равенства

Недавно я ввязался в дискуссию о сравнении с плавающей запятой. Моя точка зрения всегда состояла в том, чтобы не сравнивать два числа с плавающей запятой, используя == напрямую. Было указано, что…

Число с плавающей запятой против числа с фиксированной запятой: скорость на Intel I5 CPU

У меня есть программа C/C++, которая включает в себя интенсивные 32-битные матричные математические вычисления с плавающей запятой , такие как сложение, вычитание, умножение, деление и т. д. Могу ли…

Сделать плавающей запятой/знаков после запятой числа с плавающей точкой

Я хотел бы: unknown_function(123.456) -> 456 unknown_function(1234.56) -> 56 Или unknown_function(123.456) -> 456 Есть ли встроенный для этого? Встроенный trunc/1 делает обратное: 2>…

SSE 2 и выше-почему типы данных с плавающей запятой хранят только 2 числа с плавающей запятой

Я пытаюсь оптимизировать свой код, используя SSE встроенных функций. После просмотра документации я вижу, что в SSE есть тип данных __m128 для переменных с плавающей запятой, способный хранить 4…

Числа с фиксированной точкой


Главная /
Ассемблер /
Для чайников /
Введение /
Представление данных /
Вещественные числа /


Числа с фиксированной точкой чаще всего имеют формат байта или слова.
Числа с плавающей точкой обычно «укладывают» в двойное слово или в учетверённое (расширенное)
слово (см. раздел Положительные числа).


Вспомним предыдущий раздел: мы получили двоичное представление целой и дробной частей числа Пи:


3 = 11b
0,14 = 0,00100011b

Итак, если бы у нас было число с фиксированной точкой, и мы бы использовали один
байт для записи целой части, а другой – для записи дробной части, то запись в
памяти компьютера получилась бы такой



ЗнакЦелая частьДробная часть
0000001100100011


Это уже правильная запись числа (в отличие от наших
предыдущих попыток))).


Таким образом, наше число 3,14159265359 после помещения в слово данных будет равно 3,14,
да ещё и приблизительно.


Это очень упрощённый пример представления числа с фиксированной точкой
(в реальных машинах это делается несколько иначе). В реальности для снижения погрешностей
используются специальные алгоритмы (мы же для упрощения просто подобрали дробную часть,
которая поместится в одном байте). Как мы видим, представление числа с фиксированной
запятой имеет недостатки:

  • Высокая погрешность
  • Нерациональное использование памяти

В чём заключается нерациональное использование памяти? Как мы видим, в нашем случае
для представления целой части достаточно всего двух битов, а мы используем семь,
потому что точка у нас фиксированная, то есть находится всегда в одном месте
(между двумя байтами слова). Из-за этого же страдает точность. А вот если бы
мы использовали для целого числа только два бита (в нашем случае), то мы бы могли для
записи дробной части уже использовать не 8 битов, а 8 + (7 – 2) = 13, то есть смогли
бы повысить точность дробной части.


Однако как быть, если целая часть числа будет занимать более 2 битов? Решение
этой проблемы нашли – сделали точку плавающей и несколько изменили принцип записи
числа в память.

Что такое числовые форматы, числа с фиксированной и плавающей запятой?

Программисты, пишущие свои приложения под различные платформы на C или С++, знакомы с целыми числами и числами с плавающей запятой различной длины, но встроенные приложения могут использовать ряд числовых форматов. В данной статье мы постараемся рассмотреть эти форматы более подробно.

Одной из основных причин изучения данных форматов является понимание того, как они работают и как их правильно использовать. Например, числа с фиксированной запятой могут часто используют там, где использования чисел с плавающей запятой невозможно. Использование чисел с плавающей запятой может быть предпочтительней там, где необходимо повышенная точность.

Разработчики могут использовать числа одинарной и двоичной точности стандартных форматов IEEE 754, а как на счет чисел половинной точности (16 бит) или даже 8-битной с плавающей запятой? Последние используются в глубоких нейронных сетях (DNN), где используются малые значения. Также они могут применяться с весами нейронных сетей, в зависимости от оборудования и приложения.

Существует множество способов представления чисел. Однако макеты, как правило, меняются только по количеству задействованных битов. Использование знакового бита в двоично-кодированных значениях различается в зависимости от того, использует ли кодировка поразрядное дополнение до 1 или дополнительный код. Подход поразрядного дополнение к 1 использует ту же кодировку для целочисленной части, что означает, что на самом деле есть положительное и отрицательное нулевое значение. Дополнительный код имеет одно нулевое значение, но есть еще одно отрицательное значение, кроме положительного значения. Например, 8-разрядное целое число со знаком включает значения от -128 до -1, 0 и от 1 до 127.

Определение параметров

Типичные целочисленные форматы для микроконтроллеров и микропроцессоров включают 8-, 16-, 32-, 64- и 128-битные значения в зависимости от платформы. Многие языки программирования поддерживают разные целые числа, которые могут быть упакованы в структуры или массивы. Для периферийных интерфейсов могут также потребоваться разные значения размеров целочисленных значений. Расширение данных знаков до большего количества бит легко, поскольку все новые верхние биты равны нулю. Расширение дополнительного кода просто копирует знаковый бит в новые верхние биты. Обнаружение переполнения аналогично при уменьшении значения до меньшего числа бит.

Как отмечено, форматы с фиксированной запятой предлагают альтернативу значениям с плавающей запятой. Фиксированная запятая состоит из целочисленной и дробной частей. Количество бит, используемых для каждого, относится к определению и реализации. Фиксированная точка напрямую не поддерживается языками программирования, такими как C и C ++, хотя библиотеки для этой поддержки существуют. Программируемая логическая интегральная схема (FPGA) обычно поддерживают операции с фиксированной точкой в ​​дополнение к целым числам и числам с плавающей запятой. Поддержка плавающей запятой в FPGA часто использует в 100 раз больше шлюзов по сравнению с использованием фиксированной точки.

Целая часть значения с фиксированной точкой обычно кодируется так же, как и подписанное или целочисленное. Часть фракции обычно кодируется для представлений дополнительным кодом или кодом с основанием 10. Работа программного и аппаратного обеспечения в этом случае будет несколько разниться. Некоторые языки программирования, такие как Ada, MATLAB и LabView National Instruments, имеют встроенную поддержку значений фиксированной точкой.

Числа с плавающей запятой имеют мантиссы и экспоненты. Большинство разработчиков работают со стандартными форматами с плавающей запятой IEEE 754, которые включают три бинарных и два десятичных формата. Бинарные версии — это 32-битная одноточечная, 64-битная двойная точность и 128-битная точность. Десятичные версии включают 64-битные и 128-битные версии. Показатель представляет собой значение дополнительный код для обоих форматов. Двоичные и десятичные версии варьируются в зависимости от значения мантиссы. Десятичный стандарт поддерживает плотно упакованный десятичный код (DPD), который более эффективен, чем двоично-десятичный (BCD), который использует 4 бита для каждой десятичной цифры. BCD тратит почти 40% возможностей кодирования по сравнению с DPD.

IEEE 754 также определяет положительные и отрицательные значения бесконечности, а также NaN или «not-a-number». Другое дело о стандарте заключается в том, что он определяет не только форматы кодирования. Он также указывает, как выполняются операции, включая крайние случаи.

Биты и длина

Использование чисел с плавающей запятой, использующих менее 32 бит, является обычным явлением в ряде приложений от графики до машинного обучения. Числа с плавающей запятой меньшего формата обеспечивают расширенный диапазон данных с плавающей запятой, будучи более компактным с точки зрения хранения. Зачастую, большие форматы тратят ресурсы впустую, поскольку дополнительный диапазон или точность не будут использоваться в полной мере.

Задача использования чисел с плавающей запятой меньшего формата заключается в определении степени использования экспоненты. 8-битный «minifloat» имеет знаковый бит, четырехбитовый показатель и трехбитную мантиссу. Он поддерживает значения бесконечности и NaN. Наибольшее значение, которое может быть представлено, составляет 1,875 * 217 или 245760. Это «немного» больше, чем 128, поддерживаемое целочисленным знаком.

Данные переменной длины обычно представляют собой целые числа, которые различаются по размеру по сравнению с форматами фиксированной длины, которые уже обсуждались. Обычно размер указывается для указания количества бит, байтов или цифр, используемых полем. Арифметические операции учитывают размер значения. Преимуществом этого формата является возможность поддержки очень больших чисел, что может быть полезно во многих приложениях. Числа с плавающей запятой могут охватывать диапазон этого формата, но не с такой же точностью, поскольку они ограничены количеством бит в мантиссе.

Кодировки переменной длины могут содержать различные цифровые форматы. Наиболее эффективным является двоичный код, но BCD и даже ASCII или EBCDIC также используются, поскольку строки легко поддерживаются на большинстве языков. Плотность кодирования еще ниже, чем BCD. Однако эффективность и производительность хранилища часто компенсируются другими проблемами программирования, такими как простота использования и межплатформенный обмен данными.

Рациональное представление

Рациональные числа могут быть закодированы как отношения целочисленных значений. Целочисленные значения числителя и знаменателя могут иметь фиксированный размер или переменную длину, в зависимости от предоставленной поддержки. Числа переменной длины и рациональные числа, как правило, реализуются библиотеками. Возможно реализовать поддержку аппаратного обеспечения с использованием ПЛИС (FPGA).

Преимущество рациональных чисел над числами с плавающей запятой — способность представлять рациональные числа, такие как 1/3 без ошибок округления. Это может быть полезно во многих приложениях; рациональные числа поддерживаются на нескольких языках программирования, таких как Common Lisp, Haskell, Perl 6 и Ruby. Поддержка на других языках часто доступна с использованием библиотек, таких как стандартный класс отношений (ratio) библиотеки в C ++.

Конечно, есть компромиссы в производительности и диапазоне по сравнению с представлением фиксированной и плавающей точкой. Использование с трансцендентными функциями может создавать проблемы.

2.5.2.    Двоичные числа с фиксированной запятой (целые числа)

Представление чисел с фиксированной запятой используется для хранения положительных и отрицательных целых чисел: -3, -2, -1, 0, 1, 2, 3. Языки высокого уровня, такие как С и BASIC, обычно выделяют 16 бит для хранения каждого целого числа. В простейшем случае 216 = 65536 возможных битовых комбинаций присваиваются числам от 0 до 65535. Этот формат называется целое число без знака (unsigned integer), и его пример приведен в табл. 2.1 (использовались только четыре бита). Преобразование между битовой комбинацией и числом заключается в изменении основания 2 на основание 10. Недостатком целых чисел без знака является то, что в такой форме не могут быть представлены отрицательные числа.

Представление чисел смещенным двоичным кодом (offset binary) похоже на представление целых чисел без знака, за исключением того, что десятичные значения сдвинуты, чтобы разрешить представление отрицательных чисел. Нпример, в табл. 2.1 десятичные значения сдвинуты на семь, что позволяет представить числа от -7 до 8. Похожим способом 16-битное представление будет использовать для смещения  значение 32767, что позволит задать числа от -32767 до 32768. Смещенный двоичный код не является стандартным форматом, в основном он используется в АЦП и ЦАП. Например, диапазон входного напряжения от -5 В до +5 В может быть отображен при преобразовании числами от 0 до 4095.

Представление знаком и значением (sign and magnitude) является другим простым способом задания отрицательных чисел. Крайний левый разряд называется знаковым разрядом (sign bit) и устанавливается в ноль для положительных чисел и в единицу для отрицательных. Другие разряды представляют собой стандартные двоичные представления абсолютного значения числа. В результате такого представления теряется одна битовая комбинация, поскольку для задания нуля используются две комбинации: 0000 и 1000, поэтому результирующий диапазон этого алгоритма от -32767 до +32767.

Эти три метода представления концептуально просты, но сложно реализуются на аппаратном уровне. Когда в компьютерной программе записывается А = В + С, необходимо представлять себе, как выразить битовую комбинацию В и сложить ее с битовой комбинацией С, чтобы получить битовую комбинацию А.

Дополнительный двоичный код (two‘s complement) является форматом, который используют инженеры по аппаратной части, и обычно используется для представления чисел в компьютерах. Для того чтобы понять систему кодирования, посмотрите на представление нуля (табл. 2.1), оно соответствует двоичному нулю – 0000. При счете наверх, десятичные числа являются просто двоичным эквивалентом (0 = 0000, 1=0001,

2 = 0010 3 = 0011 и т.д.). Теперь вспомните, что эти четыре бита хранятся в регистре, состоящим из четырех триггеров. Если мы снова начнем с 0000 и проведем операцию вычитания, цифровая аппаратная часть автоматически будет считать в дополнительном двоичном коде: 0 = 0000; -1 = 1111; -2 = 1110; -3 = 1101 и т.д. Аналогично работает одометр в новых автомобилях. При движении вперед он изменяет свое значение как: 00000, 00001, 00002 и далее. При движении назад, одометр отсчитывает: 00000, 99999, 99998 и т.д.

Таблица 2.1 Основные форматы представления чисел с фиксированной запятой

1.3 Представление чисел с фиксированной и плавающей точкой

     Система машинных чисел

     Система вещественных чисел используется в ручных расчетах, предполагается быть бесконечной и непрерывной, т.е. в ней нет ограничений на диапазон и точность чисел.

     В компьютерной технике разрядная сетка устройств имеет ограничения − диапазон чисел и точность их представления.

     Система машинных чисел является дискретной, образуя подмножество системы вещественных чисел.

Рисунок 1.3. Система машинных чисел.

     − max и min представления числа, между которыми находится конечное множество представимых чисел.

     Если результат больше xmax, то возникает переполнение (overflow).

     Если модуль результата меньше xmin, то фиксируется антипереполнение (underflow).

     Большинство компьютеров при антипереполнении возвращают ноль. Поэтому область от до за вычетом истинного нуля называется областью машинного нуля.

     В зависимости от назначения и конструкции ЭВМ в них применяются две формы представления двоичных чисел: естественная и нормальная.

     Естественной называется такая форма числа, которая в неявном, условном виде реализует формулу, приведенную ниже, т.е. число записывается только с помощью набора значащих цифр xj без явного указания их весов и знаков сложения между ними. Отсчет разрядов (что равносильно указанию их весов) ведется от точки, которая обычно фиксируется между целой и дробной частями числа. Изображение числа имеет следующий вид:

                (1.2)

этой формой мы чаще всего пользуемся в повседневной жизни.

     Нормальной называется такая форма числа, которая в неявном, условном виде реализует формулу:

                               (1.3)

когда число представляется как произведение некоторой целой степени основания системы и цифровой части, являющейся правильной дробью. При этом показатель степени основания называется порядком, а цифровая часть − мантиссой числа. Мантисса может иметь знак. Знак мантиссы − это знак всего числа. При записи и порядок, и мантисса представляются в естественной форме, как показано в таблице:

Таблица 1.5

Система

счисления

Форма записи

естественная

нормальная

Десятичная

118.375

103⋅ 0.118375 = 104⋅ 0.0118375 = 10-3⋅ 118375 =

= 102⋅ 1.18375 = …

Двоичная

1110110.011

10111⋅ 0.1110110011 = 101000⋅ 0.01110110011 = …

     При записи числа в нормальной форме достаточно указать только порядок и мантиссу, не фиксируя в явном виде основание системы 10. Например, можно (в машинах так и делается) записать 103 · 0.118375 = 0.118375e3. Формула, записанная выражением 1.3, описывает нормальную (как уже было сказанно), научную или полулогарифмическую запись числа, т.к. половина числа записано нормально, а половина логарифмически.

     Поскольу в естественной форме положение точки в числе строго зафиксировано между целой и дробной частями, то числа в этой форме называют числами с фиксированной точкой. Соответственно и машины, оперирующие числами в естественной форме, называются машинами с фиксированной точкой.

     В определении нормальной формы не наложено никаких ограничений на величину мантиссы, как праило мантисса должна быть правильной дробью. Поэтому положение точки в мантиссе может изменяться при соответствующем изменении величины порядка. Точка при этом как бы плавает. Поэтому часто числа в нормальной форме называют числами с плавающей точкой, а вычислительные машины, использующие эту форму чисел, − машинами с плавающей точкой.

     Под разрядной сеткой понимается определенное количество разрядов, выделенных для представления числа, а также разбиение их на упорядоченные группы для представления отдельных частей числа (таких как знак мантиссы, порядок и т.д.). Ниже, при рассмотрении вопроса о представлении чисел изображен пример двух разрядных сеток.

     При разработке новой машины инженер-проектировщик должен четко знать, в каких случаях нужно закладывать в проект естественную, а в каких случаях — нормальную форму представления чисел. Поэтому необходимо провести анализ характеристик обеих форм. Рассмотрение приведенной выше таблицы позволяет отметить следующие два недостатка машин, работающих с числами в нормальной форме.

     Первый недостаток заключается в необходимости усложнения арифметического устройства из-за возможной неоднозначности записи числа. Из всего множества изображений числа в нормальной форме то изображение, в котором старший разряд мантиссы (первая цифра после точки) не равен нулю, называется нормализованным числом. Соответственно все остальные изображения этого же числа называются ненормализованными.

     В памяти машины все числа хранятся только в нормализованном виде, так как в противном случае из-за ограниченности разрядной сетки терялись бы младшие разряды мантиссы, т.е. уменьшалась бы точность представления чисел. Но при арифметических действиях результаты могут получиться и ненормализованными (разрядная сетка регистра для результатов вычислений делается несколько длиннее, чем сетка у ячеек памяти).      Поэтому в машинах предусмотрена специальная схема, которая автоматически производит нормализацию тех результатов, которые получились в процессе вычислений ненормализованными. Нормализация заключается в сдвиге мантиссы влево на столько разрядов, сколько у нее было нулей после запятой, и в одновременном уменьшении порядка числа на такое же количество единиц.

     Пример:

     В результате нормализации числа получаем

     В результате нормализации числа получаем

     Второй недостаток заключается в необходимости усложнения структуры АЛУ машины вследствие того, что в нем приходится производить разные действия с разными частями чисел (мантиссами и порядками). Так при умножении двух чисел требуется мантиссы операндов перемножить, а их порядки алгебраически сложить.

     Машина, работающая с числами в естественной форме, не имеет указанных недостатков. Однако это не значит, что машины с фиксированной точкой обладают только положительными характеристиками. Эти машины имеют также довольно крупные недостатки, связанные в основном с малым диапазоном чисел, с которыми они могут оперировать при ограниченной разрядной сетке.

     Рассмотрим этот вопрос более подробно. Допустим, что имеется машина с девятиразрядной сеткой для записи десятичных (для простоты рассмотрения) чисел. Пусть также задано, что машина может работать в двух режимах: с фиксированной и плавающей точкой, причем на дробную часть числа в первом случае и на мантиссу во втором отводится пять разрядов. Тогда разрядная сетка распределится между частями числа следующим образом:

Таблица 1.6

I. В режиме с фиксированной точкой

II. В режиме с плавающей точкой

Знак числа − 1 разряд,

Знак числа (мантиссы) − 1 разряд,

Целая часть − 3 разряда,

Мантисса − 5 разрядов,

Дробная часть − 5 разрядов,

Знак порядка − 1 разряд,

Итого − 9 разрядов.

Порядок числа − 2 разряда,

Итого − 9 разрядов.

     Слева изображена сетка условной машины в режиме с фиксированной точкой, справа − в режиме с плавающей точкой. Заметим, что знак числа имеет двоичную природу, так как может принимать только два значения: плюс или минус. В машинах принято плюс изображать нулем, а минус − единицей, хотя в принципе можно сделать и наоборот. Посмотрим, какие числа можно записать в любую из ячеек нашей машины:

Таблица 1.7

I. В режиме с фиксированной точкой

II. В режиме с плавающей точкой

·······

·······

·······

·······

          000.00000

          0.00000

·······

·······

·······

·······

     Анализ правой части построенной таблицы показывает, что в режиме с плавающей точкой получается очень большой диапазон чисел Xмаш.п.т.: от | ±10+99 | до | ±10-99 | . Конечно, теоретически в результате вычислений может образоваться число, и не входящее в машинный диапазон. Однако практически такое событие маловероятно, а для некоторых инженерных, экономических и других задач вообще невозможно.

     В режиме же с фиксированной точкой опасность того, что текущие машинные числа окажутся вне диапазона, вполне реальна, так как все машинные числа заключены в очень узких пределах: -103 < Xмаш.ф.т.< +103. Поэтому в машинах с фиксированной точкой возможны два нежелательных случая: |Xмаш.ф.т.| < |Xmin|; |Xмаш.ф.т.| < |Xmax|. В первом случае любое число воспринимается машиной как нуль. Во втором случае получаются числа, превышающие по абсолютной величине максимальное машинное число, т. е. происходит переполнение разрядной сетки. При этом теряются старшие разряды числа, а это значит, что происходит его грубое искажение.

Сравнение цифровой обработки сигналов с фиксированной точкой и с плавающей точкой

Инновации начинаются с цифровой обработки сигналов

Цифровые сигнальные процессоры (DSP) необходимы для обработки реальных оцифрованных данных в реальном времени, выполняя высокоскоростные числовые вычисления, необходимые для широкого спектра приложений — от базовой бытовой электроники до сложных промышленных приборов. Программируемое программное обеспечение для максимальной гибкости и поддерживаемое простыми в использовании и недорогими инструментами разработки, DSP позволяет разработчикам создавать инновационные функции и повышать ценность своих продуктов, а также выводить эти продукты на рынок быстро и с минимальными затратами.

Разработчики систем должны учитывать множество факторов при выборе процессоров цифровых сигналов для своих приложений. Среди ключевых факторов, которые следует учитывать, — вычислительные возможности, необходимые для приложения, стоимость процессора и системы, характеристики производительности и простота разработки. Уравновешивая эти факторы вместе, дизайнеры могут определить DSP, который лучше всего подходит для приложения.

Фиксированная точка и плавающая точка

Цифровую обработку сигналов можно разделить на две категории — с фиксированной запятой и с плавающей запятой.Эти обозначения относятся к формату, используемому для хранения числовых представлений данных и управления ими. DSP с фиксированной точкой предназначены для представления целых чисел — положительных и отрицательных целых чисел — и управления ими с помощью минимум 16 битов, что дает до 65 536 возможных битовых комбинаций (2 16 ). DSP с плавающей запятой представляют и манипулируют рациональными числами через минимум 32 бита способом, аналогичным научному представлению, где число представлено мантиссой и показателем степени (например, A x 2 B , где ‘A’ — мантисса, а ‘B’ — показатель степени), что дает до 4 294 967 296 возможных битовых комбинаций (2 32 ).

Термин «фиксированная точка» относится к соответствующему способу представления чисел с фиксированным количеством цифр после, а иногда и до десятичной точки. При представлении с плавающей запятой размещение десятичной запятой может «плавать» относительно значащих цифр числа. Например, представление с фиксированной запятой с единым соглашением о размещении десятичной запятой может представлять числа 123,45, 1234,56, 12345,67 и т. Д., Тогда как представление с плавающей запятой может дополнительно представлять 1.234567, 123456.7, 0.00001234567, 1234567000000000 и т. Д. Таким образом, плавающая точка может поддерживать гораздо более широкий диапазон значений, чем фиксированная точка, с возможностью представления очень малых и очень больших чисел.

В нотации с фиксированной запятой промежутки между соседними числами всегда равны единице, тогда как в нотации с плавающей запятой промежутки между соседними числами не распределены равномерно — промежуток между любыми двумя числами примерно в десять миллионов раз меньше, чем значение номеров (ANSI / IEEE Std.754), с большими промежутками между большими числами и небольшими промежутками между маленькими числами.

Динамический диапазон и точность

Возведение в степень, присущее вычислениям с плавающей запятой, обеспечивает гораздо больший динамический диапазон — наибольшие и наименьшие числа, которые могут быть представлены, — что особенно важно при обработке очень больших наборов данных или наборов данных, где диапазон может быть непредсказуемым. Таким образом, процессоры с плавающей запятой идеально подходят для приложений с интенсивными вычислениями.

Также важно учитывать форматы с фиксированной и плавающей запятой в контексте точности — размера пробелов между числами. Каждый раз, когда DSP генерирует новое число посредством математических вычислений, это число необходимо округлить до ближайшего значения, которое может быть сохранено в используемом формате. Округление и / или усечение чисел во время обработки сигнала, естественно, приводит к ошибке квантования или «шуму» — отклонению между фактическими аналоговыми значениями и квантованными цифровыми значениями. Поскольку промежутки между соседними числами могут быть намного больше при обработке с фиксированной запятой по сравнению с обработкой с плавающей запятой, ошибка округления может быть гораздо более выраженной.Таким образом, обработка с плавающей запятой дает гораздо большую точность, чем обработка с фиксированной запятой, выделяя процессоры с плавающей запятой как идеальный DSP, когда точность вычислений является критическим требованием.

Ключевые соображения — стоимость, простота разработки и производительность

Динамический диапазон и точность обычно определяют критерии, используемые разработчиками для определения того, какие процессоры с фиксированной или плавающей запятой идеально подходят для приложения — там, где вычислительные требования высоки, предпочтение отдается плавающей запятой.Но есть много других важных взаимосвязанных факторов, которые следует учитывать при выборе между двумя форматами.

Стоимость процессора: способность дизайнера снизить затраты на материалы (BOM) для продукта имеет прямое влияние на конкурентоспособные цены, проникновение на рынок и прибыльность. DSP с фиксированной запятой используются в большем количестве приложений большого объема, чем DSP с плавающей запятой, и поэтому обычно дешевле, чем DSP с плавающей запятой, из-за масштабов производства. Переменные системы на кристалле (SOC), включая встроенную память, интегрированные периферийные устройства для конкретных приложений и возможности подключения, также могут влиять на стоимость и функциональность процессоров как с фиксированной, так и с плавающей точкой.

Простота разработки: чем проще дизайнеру разработать продукт, тем больше вероятность того, что продукт будет выведен на рынок раньше конкурентов. Как правило, проще разрабатывать алгоритмы для DSP с плавающей запятой, поскольку алгоритмы с фиксированной запятой требуют больших манипуляций для компенсации шума квантования. Таким образом, разработчики обычно выбирают DSP с плавающей запятой при реализации сложных алгоритмов. Здесь снова переменные SOC могут сократить циклы разработки продукта, как и экосистема связанных инструментов разработки продукта и стороннего программного обеспечения поддержки.

Производительность: скорость, с которой DSP выполняет операции в приложении, является важным фактором. Разработчики должны реализовать формат DSP, который будет обрабатывать алгоритмы с наибольшей эффективностью. Хотя можно запрограммировать код с фиксированной точкой для процессора с плавающей точкой и наоборот, могут возникнуть значительные ограничения производительности. Эффективность работы также может повлиять на энергоэффективность. Например, в случае, когда процессор с плавающей точкой реализован для выполнения задач с фиксированной точкой, потребляемая мощность может быть больше, чем было бы, если бы был реализован процессор с фиксированной точкой, что может повлиять на требования к источнику питания и охлаждению. , а также связанные с этим расходы по спецификации.

Таким образом, DSP с плавающей запятой оптимизированы для специализированных, ресурсоемких приложений, в то время как DSP с фиксированной запятой оптимизированы для приложений общего назначения с большими объемами. Затраты на разработку могут быть выше для фиксированной точки из-за относительной сложности реализации алгоритма, но стоимость конечного продукта часто будет снижена. Затраты на продукты для приложений, использующих DSP с плавающей запятой, могут быть выше из-за стоимости процессора и меньших объемов производства, но разработчики осознают преимущества простоты разработки и большей общей точности системы.В конечном итоге требования к набору данных, связанные с целевым приложением, будут диктовать необходимость обработки с фиксированной или плавающей запятой.

Analog Devices — лидер отрасли в области инноваций DSP

Обеспечивая исключительную производительность и ценность, а также дополняемые богатой экосистемой инструментов разработки, приложений и сторонней поддержкой, цифровые сигнальные процессоры Analog Devices являются предпочтительным выбором для широкого спектра инновационных приложений.

ADI Blackfin

® Цифровые сигнальные процессоры с фиксированной точкой

16/32-битные цифровые сигнальные процессоры Blackfin с фиксированной точкой

компании Analog Devices разработаны специально для удовлетворения вычислительных требований и ограничений мощности современных встроенных аудио-, видео- и коммуникационных приложений.Процессоры Blackfin обеспечивают революционную производительность и энергоэффективность с помощью модели программирования RISC, сочетая расширенные функции обработки сигналов с простыми в использовании атрибутами микроконтроллеров общего назначения. Эта комбинация атрибутов обработки позволяет процессорам Blackfin одинаково хорошо работать как в приложениях обработки сигналов, так и в приложениях обработки управления — во многих случаях устраняя необходимость в отдельных гетерогенных процессорах. Эта возможность значительно упрощает задачи реализации проектирования как аппаратного, так и программного обеспечения.

ADI Sharc

® Цифровые сигнальные процессоры с плавающей запятой

32-разрядные процессоры цифровых сигналов SHARC с плавающей запятой компании

компании Analog Devices основаны на архитектуре Super Harvard, которая сочетает в себе исключительную производительность ядра и памяти с выдающейся пропускной способностью ввода-вывода. Эта архитектура Super Harvard расширяет оригинальные концепции раздельных шин памяти программ и данных, добавляя процессор ввода-вывода с соответствующими выделенными шинами. Помимо удовлетворения требований наиболее ресурсоемких приложений обработки сигналов в реальном времени, процессоры SHARC объединяют большие массивы памяти и периферийные устройства для конкретных приложений, предназначенные для упрощения разработки продукта и сокращения времени выхода на рынок.

Для получения дополнительной информации о полном ассортименте процессоров цифровых сигналов, инструментах разработки программного обеспечения и поддержке ADI посетите сайт www.analog.com/processors.

Общие сведения о представлениях чисел с фиксированной и плавающей запятой

В моем предыдущем посте мы изучили фундаментальные концепции использования двоичного кода для представления действительных чисел (т.е. чисел с дробной составляющей). Когда дело доходит до хранения этих чисел, в современных вычислениях есть два основных подхода.Это нотация с фиксированной точкой и нотация с плавающей точкой.

В сегодняшнем посте мы продолжаем наращивать наши базовые знания в области информатики и подробно изучаем эти форматы хранения. Эти знания будут полезны в следующих статьях, когда мы углубимся в типы данных, фундаментальные строительные блоки приложения iOS.

Как мы узнали в моем последнем посте, дробные двоичные числа состоят из двух частей: битов, представляющих целое число (часть перед точкой счисления) и битов, представляющих дробную часть (часть после точки счисления).

Подумайте об этом! Что, если бы у нас было ограниченное количество двоичных разрядов для хранения дробного двоичного числа? Это распространено во многих современных компьютерных системах. Как мы узнаем, сколько бит использовать для целой части и сколько бит использовать для дробной части?

Это проблема, которую пытаются решить представления как с фиксированной, так и с плавающей точкой.

Для начала давайте взглянем на обозначение с фиксированной точкой. Это более простое из двух представлений.

Представление фиксированной точки

Нотация с фиксированной точкой — это представление дробного числа в том виде, в каком оно хранится в памяти. В нотации с фиксированной точкой число хранится как целое число со знаком в формате дополнения до двух.

Вдобавок к этому мы применяем условное разбиение, помещая точку счисления (разделитель между целой и дробной частями) на фиксированное количество битов слева от его начальной позиции записи справа от наименее значимого бита.Я проиллюстрировал это на диаграмме ниже.

Когда мы интерпретируем биты целого числа со знаком, хранящиеся в памяти, мы перемещаем точку счисления, умножая сохраненное целое число на фиксированный коэффициент масштабирования. Коэффициент масштабирования в двоичном формате всегда равен 2, увеличенному до фиксированной степени. Поскольку коэффициент масштабирования равен степени 2, он перемещает точку счисления на некоторое количество мест влево или вправо от ее начальной позиции.

Во время этого преобразования существует три направления, в которых можно перемещать точку счисления:

  • Точка системы счисления перемещается вправо: она представлена ​​коэффициентом масштабирования, показатель степени которого равен 1 или больше.В этом случае дополнительные нули добавляются справа от наименее значимого бита и означают, что фактически представляемое число больше, чем сохраненное двоичное целое число.

  • Точка системы счисления остается на прежнем месте: она представлена ​​коэффициентом масштабирования, экспонента которого равна 0, и означает, что сохраненное целочисленное значение в точности совпадает с представляемым целочисленным значением.

  • Точка системы счисления перемещается влево: это представлено коэффициентом масштабирования, показатель степени которого отрицателен.Это означает, что представляемое число меньше целого числа, которое было сохранено, и означает, что представляемое число имеет дробную составляющую.

Давайте взглянем на пару примеров.

Примеры чисел с фиксированной точкой

Предположим, у нас есть 8-битное двоичное число со знаком 00011011 2 , которое хранится в памяти с использованием 8-битной памяти (отсюда и ведущие нули).

В нашем первом сценарии предположим, что это число было сохранено как представление с фиксированной точкой со знаком с масштабным коэффициентом 2 2 .

Поскольку наш масштабный коэффициент больше 1, когда мы переводим биты, хранящиеся в памяти, в число, которое мы фактически представляем, мы перемещаем точку счисления на два места вправо. Это дает нам число: 1101100 2 (обратите внимание на дополнительные нули, добавленные справа от младшего бита).

В нашем втором сценарии предположим, что мы начинаем с того же двоичного числа в памяти, но на этот раз мы предположим, что оно хранится как знаковое представление с фиксированной точкой с масштабным коэффициентом 2 -3 .Поскольку показатель степени отрицательный, мы перемещаем точку счисления на три позиции влево. Это дает нам номер 00011.011 2

Преимущества и недостатки представления фиксированной точки

Основным преимуществом использования представления с фиксированной точкой является производительность. Поскольку значение, хранящееся в памяти, является целым числом, ЦП может воспользоваться преимуществами многих оптимизаций, которые современные компьютеры имеют для выполнения целочисленной арифметики, без необходимости полагаться на дополнительное оборудование или программную логику.Это, в свою очередь, может привести к повышению производительности и, следовательно, при написании ваших приложений может улучшить работу ваших пользователей.

Однако есть и обратная сторона! Представления с фиксированной точкой имеют относительно ограниченный диапазон значений, которые они могут представлять.

Итак, как нам определить максимальные и минимальные числа, которые могут быть сохранены в представлении с фиксированной точкой, и определить, подходит ли оно для наших нужд? Все, что мы делаем, это берем наибольшее и наименьшее целочисленные значения, которые могут быть сохранены в данном количестве битов, и умножаем их на масштабный коэффициент, связанный с нашим представлением с фиксированной точкой.Для заданного двоичного числа со знаком, использующего b бит памяти с масштабным коэффициентом f, максимальное и минимальное значения, которые могут быть сохранены, составляют:

Минимум: −2 b − 1 /2 f

Максимум: (2 b − 1 −1) / 2 f

Если число, которое вы хотите представить, попадает в этот диапазон, тогда все в порядке. Если этого не происходит, нужно искать альтернативу! Здесь на помощь приходит нотация с плавающей запятой.

Обозначение с плавающей запятой

Нотация

с плавающей запятой является альтернативой нотации с фиксированной точкой и представляет собой представление, которое большинство современных компьютеров используют при хранении дробных чисел в памяти.Нотация с плавающей запятой — это способ точного представления очень больших или очень маленьких чисел с использованием научной записи в двоичном формате. При этом представление с плавающей запятой обеспечивает различную степень точности в зависимости от масштаба используемых вами чисел.

Например, уровень точности, который нам нужен, когда мы говорим о расстоянии между атомами (10 -10 м), очень отличается от точности, которая нам нужна, когда мы говорим о расстоянии между Землей и Солнцем ( 10 11 м).Это главное преимущество, которое позволяет представлять гораздо более широкий диапазон чисел, чем это возможно в нотации с фиксированной точкой.

Представление с плавающей запятой основано на научной нотации. Возможно, вы использовали научную нотацию в школе.

Когда мы используем десятичную дробь (форма, с которой вы, вероятно, наиболее знакомы), мы записываем числа в следующей форме:

+/- мантисса x 10 показатель степени

В этой форме есть необязательный знак, указывающий, является ли общее число положительным или отрицательным, за которым следует мантисса (также известная как мантисса), которая является действительным (дробным) числом, которое, в свою очередь, умножается на основание числа (или radix), возведенный в степень.Как известно, в десятичной системе счисления это основание 10.

Представление с плавающей запятой — это, по сути, научная нотация, применяемая к двоичным числам. В двоичном формате единственное реальное отличие состоит в том, что основание числа — 2 вместо 10. Поэтому мы бы записали числа с плавающей запятой в следующей форме:

+/- мантисса x 2 экспонента

Возможно, вы этого не осознали, но когда мы записываем числа в экспоненциальном представлении (будь то двоичное или десятичное), мы можем записывать их разными способами.

В десятичной системе мы могли бы записать 1,5 x 10 2 , 15 x 10 1 и 150 x 10 0 , но все эти числа имеют точно такое же значение.

Это обеспечивает гибкость, но с этой гибкостью также возникает путаница. Чтобы попытаться устранить эту путаницу, используется общий набор правил, известный как нормализованная научная запись, для определения того, как обычно записываются числа в научной записи.

Нормализованная научная запись

Нормализованная научная нотация — это номенклатура, которая стандартизирует способ записи чисел в научной записи.В нормализованном виде у нас есть одно ключевое правило:

.

«Мы выбираем показатель степени так, чтобы абсолютное значение мантиссы оставалось больше или равным 1, но меньше основания числа».

Давайте посмотрим на пару примеров!

Если бы у нас было десятичное число 50010 и мы хотели бы записать его в экспоненциальной форме, мы могли бы записать его как 500 x 10 0 или 50 x 10 1 .

Однако в нормализованной форме мы применили бы указанное выше правило и переместили бы точку счисления так, чтобы только одна цифра, больше или равная 1 и меньше (в данном случае) 10, находилась слева от точки счисления.

В данном случае это будет означать перемещение нашей системы счисления на два места влево, чтобы получилось 5,0 x 10 ? .

Затем нам нужно будет вычислить нашу экспоненту. Чтобы вернуться к исходному числу, нам нужно переместить точку счисления на два места вправо. Помните, что мы узнали ранее? Если нам нужно переместить точку счисления вправо, чтобы вернуться к исходному числу, это означает, что показатель степени положительный. Это дает нам: 5,0 x 10 2 .

Давайте посмотрим на более сложный пример, на этот раз в двоичном формате.

Что, если бы у нас было двоичное число 10,1 2 ? Что бы это было в научных обозначениях? Мы снова применяем правила: нам нужно иметь мантиссу, которая больше или равна 1 и меньше нашей числовой базы (которая на этот раз равна 2).

Это значит, что наша мантисса должна быть 1,01 x 2 ? . Чтобы вернуться к исходному числу, нам нужно переместить точку счисления на 1 позицию вправо. Что значит право? Это означает, что показатель положительный.

Последний пример.На этот раз посложнее!

Представьте, что у меня есть число 0,111 2 , и я хочу записать его в нормализованной научной записи? Снова применяем правила. Нам нужна мантисса больше или равная 1 и меньше 2.

Это означает, что мы хотим записать нашу мантиссу как 1.11 x 2 ? .

Теперь, чтобы вернуться к нашему исходному числу, нам нужно переместить нашу точку счисления на 1 позицию в… влево. Что мы узнали о движении влево? Это означает, что наша экспонента отрицательна.Это дает нам: 1,11 x 2 -1 .

Представления IEEE 754

Как вы, наверное, уже догадались, числа с плавающей запятой используются повсюду в современных вычислениях. Будь то процент рынка, который обновился до последней версии iOS, текущее положение и ориентация вашего iPhone в пространстве или сумма денег, поступающих на ваш банковский счет после выпуска вашего последнего приложения-блокбастера!

Из-за его широкого использования формат, используемый для хранения чисел с плавающей запятой в памяти, был стандартизирован Институтом инженеров по электротехнике и электронике в так называемом IEEE 754.Этот стандарт определяет ряд различных двоичных представлений, которые могут использоваться при хранении чисел с плавающей запятой в памяти:

  • Half Precision — используется всего 16 бит памяти.

  • Single Precision — Всего используется 32-битная память.

  • Double Precision — используется всего 64 бита памяти.

  • Четырехкратная точность — всего используется 128-битная память.

В каждом из этих случаев их основная структура следующая:

(-1) знак x мантисса x 2 показатель степени

Когда дело доходит до хранения чисел с плавающей запятой в памяти, сохраняются только три важные части этой базовой структуры:

На схеме ниже показано, что эти части хранятся в памяти:

Знак

Как я намекал выше, все четыре двоичных представления, определенные в стандарте IEEE 754, имеют старший бит как знаковый бит и используют его для хранения знака общего числа.Подобно тому, что мы видели в предыдущих сообщениях, если бит знака очищен (значение 0), общее число положительное. Если бит установлен (значение 1), число отрицательное.

Показатель

Показатель степени представляет собой степень возведения мантиссы. При хранении представления с плавающей запятой в памяти всегда существует фиксированное количество битов экспоненты, а точное количество используемых битов определяется конкретным представлением IEEE 754 (одинарная точность, двойная точность и т. Д.).Мы скоро рассмотрим это.

Во всех случаях показатели степени в каждом из этих представлений должны иметь возможность представлять как положительные показатели (для представления очень больших чисел), так и отрицательные показатели (для представления очень малых чисел). Чтобы избежать сложностей, связанных с необходимостью хранить показатели степени в формате дополнения до двух, используется так называемое смещение экспоненты.

Показатель смещения

Exponent Bias — смещение экспоненты, где значение, хранящееся для экспоненты, смещено от фактического значения экспоненты смещением.Смещение — это просто число, которое добавляется к экспоненте, чтобы гарантировать, что сохраняемое значение всегда положительно. В таблице ниже показано количество битов, используемых для экспоненты в каждом из форматов, допустимый диапазон значений, которые могут иметь разные показатели до применения смещения, а также допустимые значения после применения смещения:

Представление Биты Нормальный
Диапазон
(до смещения)

Смещение

Модифицированный диапазон

(смещение поста)

Банкноты

половинной точности

5

-14 до +15

+15

+1 к +30

Смещенные значения 0 (все биты очищены) и 31 (все биты установлены) имеют особое значение.

одинарной точности

8

-126 до +127

+127

+1 к +254

Смещенные значения 0 (все биты очищены) и 255 (все биты установлены) имеют особое значение.

Двойная точность

11

-1022 до +1023

+1023

+1 к +2046

Смещенные значения 0 (все биты очищены) и 2047 (все биты установлены) имеют особое значение.

Quadrupal Precision

15

-16382 до +16383

+16383

+1 к +32766

Смещенные значения 0 (все биты очищены) и 32767 (все биты установлены) имеют особое значение.

Мантисса (также известная как Signficand) Биты

В представлениях IEEE 754 мантисса выражается в нормализованной форме.Форматы следуют тем же правилам нормализации, что и в случае с научной нотацией, и ставят точку счисления после первой ненулевой цифры.

А вот в двоичном формате мы также получаем приятный небольшой бонус!

Поскольку мы выражаем наши числа в двоичном формате, мы получаем преимущество, зная, что первая ненулевая цифра всегда будет 1 (в конце концов, у нас могут быть только единицы или нули). Учитывая это, мы можем отбросить этот первый бит, просто предполагая, что он есть, и вместо этого получить дополнительный (неявный) бит точности.

Когда числа сохраняются, мы сохраняем только ту часть мантиссы, которая представляет дробную часть числа, то есть часть справа от точки счисления. В таблице ниже показано влияние неявного целочисленного бита и его влияние на общую точность:

Представительство

Прецизионные биты

Эффективная точность

половинной точности

1 бит (неявный) + 10 бит (явный)

11 бит

одинарной точности

1 бит (неявный) + 23 бита (явный)

24 бита

Двойная точность

1 бит (неявный) + 52 бита (явный)

53 бит

Quadrupal Precision

1 бит (неявный) + 112 бит (явный)

112 бит

Сводка представлений IEEE 754

Итак, стандарт IEEE 754 определяет четыре основных формата для представления двоичных чисел с плавающей запятой в памяти:

Представительство

Всего бит

Знаковый бит

Биты мантиссы

Биты экспоненты

половинной точности

16

1

1 неявный + 10

5

одинарной точности

32

1

1 неявный + 23

8

Двойная точность

64

1

1 неявный + 52

11

Quadrupal Precision

128

1

1 неявный + 112

15

В дополнение к этим форматам стандарт IEEE 754 также определяет ряд числовых символов, о которых также стоит знать.Мы кратко рассмотрим их в следующем разделе.

Специальные значения

, представляющий ноль

Как мы видели, при представлении чисел с плавающей запятой и сохранении их в памяти мы записываем наши числа в нормализованной форме перед тем, как отбросить неявный установленный бит перед точкой счисления. Когда числа в памяти интерпретируются, неявный бит восстанавливается. Однако это неявное предположение о том, что бит сразу слева от точки счисления установлен в 1, вызывает проблемы.Что, если бы мы хотели представить ноль?

Чтобы обойти эту проблему, стандарт IEEE 754 определяет ноль как особый случай и представляет его с помощью экспоненты, равной 0, и мантиссы, равной 0. Поскольку знаковый бит все еще доступен, это приводит к значениям -0 и +0. стандарт определяет, что они должны сравниваться как равные.

Денормализованная форма

IEEE 754 также позволяет представлять числа в денормализованной форме. Если все биты в экспоненте равны нулю, но мантисса имеет ненулевое значение, говорят, что число хранится в денормализованной форме.В этом случае при интерпретации числа в памяти предположение о том, что слева от точки счисления установлен бит, снова игнорируется. Это приводит к числам в форме:

Представительство

половинной точности

(-1) с x 0.f x 2 -14

одинарной точности

(-1) с x 0.f x 2 -126

Двойная точность

(-1) с x 0.f x 2 -1022

Quadrupal Precision

(-1) с x 0.f x 2 -16382

Где s — знак, а f — дробная часть мантиссы.

бесконечность

Стандарт IEEE

также определяет механизм представления бесконечности.Бесконечность представлена ​​показателем степени со всеми установленными битами и мантиссой со всеми очищенными битами. Опять же, знаковый бит остается в силе, что приводит к концепции + бесконечности и -infinity.

Не число (NaN)

Последнее, что представляет интерес в стандарте IEEE, — это концепция Not A Number (NaN). Это используется для представления числа, которое не является действительным числом. Это представлено в памяти показателем степени со всеми установленными битами и ненулевой мантиссой. Чаще всего об этом сообщает ваш компилятор, обычно когда вы пытаетесь что-то разделить на ноль.

Сводка специальных значений

Таким образом, в таблице ниже показаны различные значения показателя степени и мантиссы, а также специальные значения, которые представлены в соответствии со стандартом IEEE 754:

Показатель

Мантисса

Представляемый объект

Значение 0 (т.е. сохраненное значение == смещение)

Все биты установлены на 0

Ноль

Значение 0 (т.е. Сохраненное значение == смещение)

ненулевое значение

+/- Денормализованное число

Все биты установлены на 1

Все биты установлены на 0

+/- бесконечность

Все биты установлены на 1

ненулевое значение

NaN (не число)

Сводка

На этом мы подведем итог для чисел с фиксированной и плавающей запятой на сегодняшний день.Прочитав этот пост, я надеюсь, вы получите глубокое понимание различий между представлениями с фиксированной и плавающей запятой. Это позволит вам сделать гораздо более осознанный выбор в отношении того, как хранить информацию в ваших приложениях в будущем. В следующих публикациях вы увидите, что это обеспечивает прочную основу для развития ваших знаний в области разработки под iOS. Ваши знания должны продолжать расти, если вы проработаете мой следующий пост!

А пока спасибо, что присоединились ко мне, и если у вас есть какие-либо вопросы, не стесняйтесь оставлять их в комментариях ниже.

Изображение предоставлено: https://unsplash.com/photos/YhdEgF-qWlI

концепций и терминологии фиксированной точки
— MATLAB и Simulink

Типы данных с фиксированной точкой

В цифровом оборудовании числа хранятся в двоичных словах. Двоичное слово — это
последовательность битов фиксированной длины (единицы и нули). Как аппаратные компоненты или программное обеспечение
функции интерпретируют эту последовательность единиц и нулей, определяемую типом данных.

Двоичные числа представлены как типы данных с плавающей или фиксированной запятой.В
В этом разделе мы обсуждаем многие термины и концепции, относящиеся к числам с фиксированной точкой, данным
типы и математика.

Тип данных с фиксированной точкой характеризуется длиной слова в битах, положением
двоичная точка и знаковая принадлежность числа, которое может быть знаковым или беззнаковым. Подписано
числа и типы данных могут представлять как положительные, так и отрицательные значения, тогда как беззнаковые
числа и типы данных могут представлять только значения, которые больше или равны
нуль.

Положение двоичной точки — это средство масштабирования значений с фиксированной точкой.
и интерпретировал.

Например, двоичное представление обобщенного числа с фиксированной точкой (либо
подписанный или беззнаковый) показан ниже:

, где

  • b i — это
    i th двоичная цифра.

  • wl — количество бит в двоичном слове, также известное как
    длина слова.

  • b wl – 1 — это
    расположение самого старшего или старшего бита (MSB). В подписанном двоичном формате
    чисел, этот бит является битом знака, который указывает, является ли число положительным
    или отрицательный.

  • b 0 — расположение наименьшего
    значащий или младший бит (LSB). Этот бит в двоичном слове может представлять
    наименьшее значение. Вес LSB определяется по формуле:

    weight LSB = 2 — дробная длина

    , где дробная длина — это количество битов справа от
    двоичная точка.

  • Биты слева от двоичной точки являются целыми битами и / или знаковыми битами, и
    биты справа от двоичной точки являются дробными битами. Количество бит в
    слева от двоичной точки называется целочисленной длиной. Двоичная точка в
    в этом примере показаны четыре позиции слева от младшего разряда. Следовательно, число
    Говорят, что он имеет четыре дробных бита или дробную длину, равную четырем.

Типы данных с фиксированной точкой могут быть знаковыми или беззнаковыми.

Знаковые двоичные числа с фиксированной точкой обычно представлены одним из трех
способами:

  • Знак / величина –– Представление подписанной фиксированной или плавающей запятой
    числа. В представлении знака / величины один бит двоичного слова равен
    всегда выделенный бит знака, в то время как оставшиеся биты слова кодируют
    величина числа. Отрицание с использованием представления знак / величина состоит
    переворота знакового бита с 0 (положительный) на 1 (отрицательный) или с 1 на
    0.

  • Дополнение до единицы

  • Дополнение до двух –– Дополнение до двух является наиболее распространенным представлением
    числа с фиксированной точкой со знаком. См. «Дополнение до двух» для получения дополнительной информации.

Числа с фиксированной точкой без знака могут представлять только числа, большие или равные
нуль.

Масштабирование

В представлении [Slope Bias] числа с фиксированной точкой могут быть закодированы в соответствии с
схема

реальное значение = (наклон × целое число) + смещение

, где наклон может быть выражен как

наклон = корректировка наклона × 2 экспонента

Термин корректировка наклона иногда используется как
синоним дробного уклона.

В тривиальном случае наклон = 1 и смещение = 0. Масштабирование всегда тривиально для чистого
целые числа, такие как int8, а также для истинных типов с плавающей запятой single и
двойной.

Целое число иногда называют сохраненным целым числом. Это
необработанное двоичное число, в котором двоичная точка находится в крайнем правом углу слова.
В System Toolboxes отрицательная величина экспоненты часто упоминается как
дробная длина.

Наклон и смещение вместе представляют масштабирование числа с фиксированной точкой. В
число с нулевым смещением, только наклон влияет на масштабирование. Число с фиксированной точкой, которое
только масштабирование положения двоичной точки эквивалентно числу в представлении Fixed-Point Designer ™ [Slope Bias], у которого смещение равно нулю, а наклон
регулировка равна единице. Это называется масштабированием только по двоичной точке или
масштабирование по степени двойки:

реальное значение = 2 экспонента × целое число

или

реальное значение = 2 — дробная длина × целое число

В программном обеспечении System Toolbox вы можете определить тип данных с фиксированной точкой и масштабирование для
вывод или параметры многих блоков, указав длину слова и дробь
длина количества.Длина слова и дробная длина определяют все данные
информация о типе и масштабировании для сигналов только с двоичной точкой.

Все блоки System Toolbox, которые поддерживают типы данных с фиксированной точкой, поддерживают сигналы с
масштабирование только по двоичной точке. Множество блоков с фиксированной точкой, не выполняющих арифметические операции
операции, но просто переупорядочивают данные, такие как Delay и Matrix Transpose, также поддерживают
сигналы с масштабированием [Slope Bias].

Точность и диапазон

Вы должны обратить внимание на точность и диапазон типов данных с фиксированной точкой и
масштабирования, которые вы выбираете для блоков в своих симуляциях, чтобы знать,
будут вызваны методы округления или если произойдет переполнение.

Диапазон

Диапазон — это диапазон чисел, которые могут использоваться с типом данных с фиксированной точкой и масштабированием.
представлять. Диапазон представимых чисел для фиксированной точки с дополнением до двух
число длины слова wl, масштабирование S и смещение
B показан ниже:

Для чисел с фиксированной точкой со знаком и без знака любого типа данных количество
разные битовые комбинации — это 2 wl .

Например, в дополнительном коде до двух должны быть представлены отрицательные числа, а также
ноль, поэтому максимальное значение равно 2 wl – 1 .Потому что
только одно представление для нуля, есть неравное количество положительных и
отрицательные числа. Это означает, что есть представление для
-2 wl – 1 , но не для 2 wl – 1 :

Полный диапазон — это самый широкий диапазон для типа данных. Для типов с плавающей запятой
полный диапазон от –∞ до ∞. Для целочисленных типов полный диапазон — это диапазон от
от наименьшего до наибольшего целочисленного значения (конечного), которое может представлять тип.Например, из
От -128 до 127 для 8-битного целого числа со знаком.

Обработка переполнения. Поскольку тип данных с фиксированной точкой представляет числа в конечном диапазоне,
переполнение может произойти, если результат операции больше или меньше, чем
числа в этом диапазоне.

Программное обеспечение System Toolbox не позволяет добавлять защитные биты к типу данных
на лету во избежание переполнений. Защитные биты — это дополнительные биты в любом
регистр оборудования или моделирование программного обеспечения, которые добавляются к верхнему пределу
двоичное слово, чтобы гарантировать, что информация не будет потеряна в случае переполнения.Любая охрана
биты должны быть выделены при инициализации модели. Однако программное обеспечение
позволяют либо пропитать, либо обернуть
переливается. Насыщенность представляет положительные переполнения как самые большие положительные
число в используемом диапазоне, а отрицательное переполнение как наибольшее отрицательное
число в используемом диапазоне. Обертка использует арифметику по модулю для приведения
переполнение обратно в представимый диапазон типа данных.См. Дополнительную информацию в разделе Арифметика по модулю.

Precision

Точность числа с фиксированной точкой — это разница между последовательными значениями
представлен его типом данных и масштабированием, равным значению его наименьшего
значащий бит. Значение младшего бита и, следовательно, точность
числа, определяется количеством дробных битов. Значение с фиксированной точкой
может быть представлен с точностью до половины точности своего типа данных и масштабирования.В
термин разрешение иногда используется как синоним этого определения.

Например, представление с фиксированной точкой с четырьмя битами справа от
двоичная точка имеет точность 2 -4 или 0,0625, что является
значение его младшего бита. Любое число в пределах диапазона этих данных
тип и масштаб могут быть представлены с точностью до (2 -4 ) / 2 или
0,03125, что вдвое меньше точности.Это пример представления числа
с конечной точностью.

Режимы округления. Когда вы представляете числа с конечной точностью, не каждое число в
имеющийся ассортимент может быть представлен точно. Если число не может быть представлено
точно по указанному типу данных и масштабированию, это
округляется до представимого числа. Хотя точность
всегда теряется при округлении, стоимости операции и
величина вносимого смещения зависит от самого режима округления.К
предоставить вам большую гибкость в выборе компромисса между стоимостью и предвзятостью,
Программное обеспечение DSP System Toolbox ™ в настоящее время поддерживает следующие режимы округления:

  • Ceiling округляет результат вычисления
    к ближайшему представимому числу в направлении положительного
    бесконечность.

  • Конвергент округляет результат
    расчет до ближайшего представимого числа.В случае ничьей,
    Сходимость раундов до ближайшей четной
    количество. Это наименее предвзятый режим округления, обеспечиваемый
    ящик для инструментов.

  • Этаж , что эквивалентно усечению,
    округляет результат вычисления до ближайшего представимого числа
    в направлении отрицательной бесконечности. Результаты операции усечения
    при удалении одного или нескольких младших битов из числа.

  • Ближайшее округляет результат вычисления
    к ближайшему представимому числу. В случае ничьей,
    Ближайшие патронов к ближайшим
    представимое число в направлении положительной бесконечности.

  • Round округляет результат вычисления до
    ближайшее представимое число. В случае ничьей,
    Округление округляет положительные числа до
    ближайшее представимое число в направлении положительной бесконечности, и
    округляет отрицательные числа до ближайшего представимого числа в
    направление отрицательной бесконечности.

  • Самый простой округляет результат вычисления
    используя режим округления ( Этаж или
    Zero ), который добавляет наименьшее количество дополнительных
    код округления до вашего сгенерированного кода. Для получения дополнительной информации см. Режим округления: Простейший (Конструктор с фиксированной точкой).

  • Ноль округляет результат вычисления до
    ближайшее представимое число в направлении нуля.

Дополнительные сведения о каждом из этих режимов округления см. В разделе «Округление (конструктор фиксированной точки)».

Для прямого сравнения режимов округления см. Выбор метода округления (Конструктор фиксированной точки).

Введение в номера с фиксированной точкой — LabVIEW Communications System Design Suite 5.0 Руководство

Фиксированная точка — это рациональный числовой тип данных, диапазон и точность которого вы определяете, настраивая количество хранимых битов и значение, присвоенное этим битам.Числа с фиксированной запятой важны для реализации программ FPGA, потому что многие FPGA не поддерживают эффективно типы данных с плавающей запятой и потому, что числа с фиксированной запятой позволяют вам использовать минимальное количество битов для достижения диапазона и точности, требуемых вашим алгоритмом.

Число с фиксированной точкой состоит из указанного количества битов и двоичной точки. Числа с фиксированной точкой могут быть знаковыми или беззнаковыми. Положение двоичной точки по отношению к общему количеству хранимых битов определяет значение разряда, присвоенное каждому биту.

Понимание значения места в фиксированной точке

Рассмотрим сценарий с произвольным набором из четырех битов. Значение набора битов 1001 изменяется в зависимости от того, где вы устанавливаете двоичную точку. Значение числа 10.01 отличается от значения числа 1.001, поскольку двоичная точка определяет значение разряда каждого бита. Следующее изображение демонстрирует этот принцип для числа без знака с фиксированной запятой, которое имеет положительное количество хранимых битов как для целой, так и для дробной части.

Числа с фиксированной точкой со знаком и без знака

Числа с фиксированной точкой либо беззнаковые, либо подписанные. Беззнаковые числа с фиксированной точкой представляют только положительные значения. Числа с фиксированной точкой со знаком могут представлять как положительные, так и отрицательные значения. Для чисел с фиксированной точкой со знаком самый левый бит сохраненного набора битов определяет, является ли значение битов положительным или отрицательным. Если первый сохраненный бит равен 1, значение битов отрицательное. Если первый сохраненный бит равен 0, значение битов положительное.Знаковые числа с фиксированной точкой интерпретируются с использованием кодировки, называемой дополнением до двух. На следующем изображении показан пример числа с фиксированной точкой с двумя целыми битами и двумя дробными битами. Обратите внимание, что экспоненты всех разрядов остаются одинаковыми между знаковыми и беззнаковыми числами, но в подписанном числе с фиксированной запятой значение крайнего левого разряда отрицательное.

Используя предыдущее изображение, рассмотрим сценарий, в котором как подписанные, так и неподписанные экземпляры числа с фиксированной запятой содержат биты 1011.Результатом умножения каждого бита на его разрядное значение и сложения результирующего значения каждого бита является десятичное значение для любого набора битов в числе с фиксированной запятой. Для беззнакового экземпляра этого числа с фиксированной запятой десятичное значение битов 1011 равно 1 × 2 1
+ 0 × 2 0
+ 1 × 2 -1
+ 1 × 2 -2
или 2,75. Для подписанного экземпляра этого числа с фиксированной запятой десятичное значение битов 1011 равно 1 × (-2 1 ) + 0 × 2 0
+ 1 × 2 -1
+ 1 × 2 -2
или -1.25.

Для любого числа со знаком и без знака с фиксированной точкой с одинаковым целым и дробным числом битов беззнаковый тип может представлять большие положительные значения, а знаковый тип может представлять как положительные, так и отрицательные значения. Например, между экземплярами со знаком и без знака 4-битного числа с фиксированной точкой с двумя целыми и двумя дробными битами экземпляр без знака имеет диапазон от 0 до 3,75, а экземпляр со знаком имеет диапазон от -2 до 1,75.

Понимание диапазона и точности числа с фиксированной точкой

Увеличение общего числа битов, хранимых для любого числа с фиксированной запятой, увеличивает диапазон, который может представлять тип данных.Увеличение числа дробных битов, хранимых для любого числа с фиксированной запятой, увеличивает точность, которую может сохранить число.

классифицировать
числа с фиксированной точкой — это набор значений, которые может представлять конкретный тип данных с фиксированной точкой. Чтобы определить диапазон числа с фиксированной запятой, вам необходимо знать максимальное и минимальное значения, которые может представлять число, и приращение между каждым значением. Приращение между каждым значением также называется точностью или дельтой числа с фиксированной запятой.

Рассмотрим 2-битное число с фиксированной точкой без знака, в котором хранятся два целых бита и нулевые дробные биты. Поскольку каждый сохраненный бит может содержать либо 0, либо 1, 2-битное число может представлять четыре уникальные комбинации: 00, 01, 10 или 11. Разрядное значение левого бита в этом примере равно 2 1
а значение разряда правого бита — 2 0 . В следующей таблице показано десятичное значение каждой возможной комбинации битов для 2-битного числа с фиксированной запятой без знака в этом примере.

Возможная комбинация бит Битовое значение Представимое десятичное значение
00 0 × 2 1
+ 0 × 2 0
0
01 0 × 2 1
+ 1 × 2 0
1
10 1 × 2 1
+ 0 × 2 0
2
11 1 × 2 1
+ 1 × 2 0
3

В этом случае диапазон числа с фиксированной запятой составляет от 0 до 3, а дельта равна 1.Добавление дробного бита увеличивает общий диапазон и увеличивает точность, которую может представлять число с фиксированной запятой. Добавление дробного бита увеличивает диапазон от 0 до 3,5 и уменьшает расстояние между возможными сохраненными значениями с 1 до 0,5. Те же принципы применяются, когда вы складываете или вычитаете биты из больших чисел с фиксированной запятой.

Фиксированная точка и плавающая точка

Различные типы процессоров (DSP, MCU и т. Д.) Могут выполнять математические вычисления, используя числа с плавающей запятой, но что именно это означает? В общем, математика с плавающей запятой предлагает более широкий диапазон чисел и большую точность, чем математика с фиксированной запятой.Зная разницу, и когда использовать какой тип математики может иметь значение с точки зрения более быстрых вычислений или более точных вычислений. В основном цель состоит в том, чтобы использовать столько вычислительной мощности, сколько вам нужно для выполнения работы.

Рисунок 1. Число 0,15625, представленное как число с плавающей запятой одинарной точности согласно стандарту IEEE 754-1985. (Кредит: Codekaizen, wikipedia.org)

Принципиальное различие между ними — расположение десятичной точки: числа с фиксированной запятой имеют десятичную дробь в фиксированной позиции, а числа с плавающей запятой имеют знак.Оба типа чисел представлены в виде разделов, и для каждой части числа есть местозаполнитель. Ссылаясь на рисунок 1, числа с фиксированной запятой имеют определенное количество зарезервированных цифр, которые находятся слева от десятичной дроби для целой части числа. Цифры справа от десятичной точки зарезервированы для дробной части числа. Если ваш MCU использует только фиксированные числа, десятичная дробь остается на том же месте, и если две цифры установлены для дробной части, то это уровень точности, который у вас будет в будущем.

Рисунок 2: В терминологии информатики десятичная дробь называется «основанием системы счисления». Система счисления устанавливается таким образом, чтобы слева и справа от нее было фиксированное количество битов. Число n будет числом битов, которое может обработать процессор, поэтому n может быть 4,8,16, 32 или больше, в зависимости от разрядности пути данных процессора.

Очень большие числа и очень маленькие числа должны уместиться в одном и том же количестве заполнителей, что на самом деле является битами, разделенными десятичной дробью в одном и том же месте, независимо от числа.Например, если формат с фиксированной точкой будет представлять деньги, уровень точности может быть всего через два знака после запятой. Программист, зная, что регистр должен содержать только два бита после десятичной точки, может ввести 9999 и знать, что блок с фиксированной точкой интерпретирует это число как 99,99, что составляет 99,99 доллара. (Здесь в качестве примера используются числа с основанием 10, но помните, что процессоры используют числа с основанием 2 или двоичные числа).

Аналогично, число 001 интерпретируется кодом как 0.01. В самом коде десятичные числа не используются. Снова используя приведенный выше пример денег, число 100 будет рассматриваться математикой с фиксированной запятой как 1,00. Код процессора с фиксированной точкой записывается с учетом десятичной дроби, которая находится в фиксированной позиции. Математика с фиксированной запятой, независимо от скорости процессора, проще и быстрее, чем математика с плавающей запятой. Фиксированная точка подходит, если вы не знаете, что будете иметь дело с более высокими числами, чем может обработать блок с фиксированной точкой. В числах с фиксированной запятой часто используется самый старший бит для представления положительного или отрицательного знака.Это означает, что 4-битное целое число без знака имеет диапазон от 0 до 15 (потому что 2 4 = 16), а 4-битное целое число со знаком имеет диапазон от -8 до 7 (-8, -7, -6 , -5, -4, -3, -2, -1,0,1,2,3,4,5,6,7). Опять же, это потому, что в числе, которое имеет только 4 бита для его представления, есть только 16 возможных чисел, которые могут быть представлены. (То есть 2 4 = 16, где 4 — общее количество бит шириной, которое процессор может обработать в этом примере). Некоторые рекомендуют никогда не хранить деньги в виде значений с плавающей запятой.

Числа с плавающей запятой также вписываются в определенный шаблон. Фактически, Институт инженеров по электротехнике и радиоэлектронике (IEEE) имеет стандарт для представления чисел с плавающей запятой (IEEE 754). Число с плавающей запятой не имеет фиксированного количества бит до и после десятичной дроби. Скорее, число с плавающей запятой определяется общим количеством битов, зарезервированных для выражения числа. Как и числа с фиксированной запятой, числа с плавающей запятой имеют заранее определенное количество битов для хранения числа с плавающей запятой, которое имеет знак (положительное или отрицательное число), а также число (т.е., мантисса) с показателем степени. Все это должно соответствовать пути данных, выделенному для процессора, который может быть 16-битным, 32-битным или 64-битным и т. Д. (См. Рисунок 2, где показано, как можно выразить 32-битное число с плавающей запятой. .) В числах с плавающей запятой хранится столько битов точности, сколько уместится в пути данных, а показатель степени определяет расположение десятичной точки по отношению к битам точности. Длина показателя степени и мантиссы будет отражать наибольшее и наименьшее числа, ожидаемые приложением.

Рисунок 3: 32-разрядные числа с плавающей запятой IEEE 754 (также известные как одинарная точность) состоят из трех частей: знака, степени и дроби. Дробь также известна как мантисса. В этом стандарте бит со знаком равен 0 для положительного числа и 1 для отрицательного числа с 8-битной экспонентой. «Двойная точность» имеет ширину 64 бита.

Числа с плавающей запятой теряют точность, поскольку они имеют только фиксированное количество битов, с помощью которых можно выразить действительное число (например, 16-, 32- или 64-битное).Действительные числа могут доходить до положительной или отрицательной бесконечности, а также существует бесконечное количество действительных чисел от 0 до 1. 16-битный процессор имеет только 16 бит для представления чисел и поэтому ограничен 2 16 . Например, 4-битный процессор имеет только 4 бита для представления чисел и ограничен 9999 как его наибольшее число (если он не использует один бит для знака). 16-битный процессор может представлять только 2 16 различных чисел.

Числа с плавающей запятой могут показаться запутанными и сложными, но это также отнимает много времени для процессора.Выполнение математических расчетов с использованием чисел с плавающей запятой может включать несколько шагов для учета различий в экспоненциальных значениях. Стандарт IEEE 754, впервые опубликованный в 1985 году, решил проблемы, связанные с созданием переносимого кода в соответствии с соглашениями с плавающей запятой. До этого стандарта компании обрабатывали математику с плавающей запятой по своему усмотрению, что затрудняло перенос кода с одного типа архитектуры процессора на другой. Последнее обновление стандарта было сделано в 2008 году. Доступно несколько онлайн-инструментов на основе java-скриптов, помогающих понять числа с плавающей запятой IEEE-754 с использованием base-2.(Найдите «конвертер IEEE-754».) Было написано множество статей и официальных документов о том, как наилучшим образом использовать числа с плавающей запятой, поскольку процессоры могут быть весьма буквальными при сравнении чисел, а переполнение максимально возможного числа приведет к переводу числа на нуль. Проще говоря, числа с плавающей запятой могут быть намного сложнее, чем фиксированные числа, в том, как их обрабатывают процессоры.

В чем разница между форматами с фиксированной запятой, с плавающей запятой и числовыми форматами?

Загрузите эту статью в формате PDF.

Программисты встроенных C и C ++ знакомы со знаковыми и беззнаковыми целыми числами и значениями с плавающей запятой различных размеров, но во встроенных приложениях можно использовать ряд числовых форматов. Здесь мы рассмотрим все эти форматы и их местонахождение.

Одна из причин изучения различных форматов — понять, как они работают и где их можно применять. Например, значения с фиксированной запятой часто можно использовать, когда поддержка с плавающей запятой недоступна. Фиксированная точка может быть предпочтительнее в некоторых случаях, в то время как поддержка с плавающей точкой доступна по другим причинам, таким как точность или представление.

Разработчики могут использовать стандартные форматы IEEE 754 с одинарной и двойной точностью, но как насчет 16-битной половинной точности или даже 8-битной плавающей запятой? Последний используется в глубоких нейронных сетях (DNN), где полезны небольшие значения. Маленькие целые числа и фиксированная точка также могут использоваться с весами DNN, в зависимости от приложения и оборудования.

Существует множество способов представления чисел. Однако схемы обычно различаются только количеством задействованных битов (см. Рисунок).Использование знакового бита в двоично-кодированных значениях различается в зависимости от того, используется ли кодирование с дополнением до единиц или до двух. Подход с дополнением до 1 использует одну и ту же кодировку для целой части, что означает, что на самом деле существует положительное и отрицательное нулевое значение. Дополнительное число до 2 имеет одно нулевое значение, но отрицательного значения на одно больше, чем положительного. Например, 8-битовое целое число со знаком включает в себя значения от −128 до −1, от 0 и от 1 до 127.

Значения со знаком имеют одинарный бит знака, но другие поля могут различаться по размеру в зависимости от реализации.

Определение параметров

Типичные целочисленные форматы для микроконтроллеров и микропроцессоров включают 8-, 16-, 32-, 64- и 128-битные значения, в зависимости от платформы. Многие языки программирования поддерживают целые числа разного размера, которые можно упаковать в структуры или массивы. Для периферийных интерфейсов также могут потребоваться целые числа разного размера. Расширить беззнаковые значения до большего количества битов легко, поскольку все новые старшие биты равны нулю. Дополнение до 2 просто копирует знаковый бит в новые старшие биты.Обнаружение переполнения аналогично при уменьшении значения до меньшего количества битов.

Как уже отмечалось, форматы с фиксированной точкой предлагают альтернативу значениям с плавающей точкой. Фиксированная точка состоит из целой и дробной части. Количество бит, используемых для каждого, относится к определению и реализации. Фиксированная точка не поддерживается напрямую такими языками программирования, как C и C ++, хотя доступны библиотеки, обеспечивающие эту поддержку. FPGA обычно поддерживают операции с фиксированной точкой в ​​дополнение к операциям с целыми и плавающими точками.Поддержка чисел с плавающей запятой в FPGA часто использует более чем в 100 раз больше вентилей по сравнению с поддержкой с фиксированной запятой.

Целая часть значения с фиксированной точкой обычно кодируется таким же образом, как целое число со знаком или без знака. Дробная часть обычно кодируется для представлений с основанием 2 или 10. То, как с этим справятся оборудование и программное обеспечение, будет отличаться. Некоторые языки программирования, такие как Ada, MATLAB от MathWorks и LabView от National Instruments, имеют встроенную поддержку фиксированной точки.

У чисел с плавающей запятой есть мантисса и показатель степени.Большинство разработчиков работают со стандартными форматами с плавающей запятой IEEE 754, которые включают три двоичных и два десятичных формата. Двоичные версии — это 32-битная одинарная точность, 64-битная двойная точность и 128-битная четверная точность. Десятичные версии включают 64-битные и 128-битные версии. Показатель степени представляет собой значение дополнения до 2 для обоих форматов. Двоичная и десятичная версии различаются в зависимости от значения мантиссы. Десятичный стандарт поддерживает плотно упакованный десятичный формат (DPD), который более эффективен, чем двоично-кодированный десятичный формат (BCD), который использует 4 бита для каждой десятичной цифры.BCD тратит почти 40% возможностей кодирования по сравнению с DPD.

IEEE 754 также определяет значения положительной и отрицательной бесконечности, а также NaN или «не-число». Еще одна особенность стандарта в том, что он определяет не только форматы кодирования. Он также определяет, как выполняются операции, включая угловые случаи.

Биты и длины

Использование чисел с плавающей запятой, которые используют менее 32 бит, широко распространено в ряде приложений, от графики до машинного обучения.Эти числа с плавающей запятой меньшего формата обеспечивают расширенный диапазон чисел с плавающей запятой, будучи более компактными с точки зрения хранения. Часто большие форматы тратят впустую пространство, поскольку дополнительный диапазон или точность не будут полезны.

Проблема использования чисел с плавающей запятой меньшего формата состоит в том, чтобы решить, насколько велика экспонента. 8-битный «минифлот» имеет знаковый бит, четырехбитный показатель степени и трехбитовую мантиссу. Он поддерживает значения бесконечности и NaN. Наибольшее значение, которое можно представить, — 1.875 * 2 17 или 245760. Это несколько больше, чем 128, поддерживаемое целым числом со знаком.

Числа переменной длины обычно представляют собой целые числа, размер которых различается по сравнению с уже обсужденными форматами фиксированной длины. Обычно размер включается, чтобы указать количество битов, байтов или цифр, используемых в поле цифр. При арифметических операциях учитывается размер значения. Преимущество этого формата — возможность поддерживать очень большие числа, что может быть полезно во многих приложениях.Числа с плавающей запятой могут охватывать диапазон этого формата, но не с такой же точностью, поскольку они ограничены количеством бит в мантиссе.

Кодировки переменной длины могут включать в себя различные форматы цифр. Самый эффективный — двоичный, но использовались BCD и даже ASCII или EBCDIC, потому что строки легко поддерживаются на большинстве языков. Плотность кодирования даже ниже, чем BCD. Однако эффективность и производительность хранилища часто нивелируются другими проблемами программирования, такими как простота использования и межплатформенный обмен данными.

Рациональное объяснение

Рациональные числа можно закодировать как отношения целых значений. Целочисленные значения числителя и знаменателя могут быть фиксированного размера или переменной длины, в зависимости от предоставляемой поддержки. Числа переменной длины и рациональные числа обычно реализуются библиотеками. Возможно реализовать аппаратную поддержку с использованием ПЛИС.

Преимущество рациональных чисел перед числами с плавающей запятой заключается в возможности представлять рациональные числа, такие как 1/3, без ошибок округления.Это может быть полезно во многих приложениях; рациональные числа поддерживаются в ряде языков программирования, таких как Common Lisp, Haskell, Perl 6 и Ruby. Поддержка других языков часто доступна с использованием библиотек, таких как стандартный класс библиотечных соотношений в C ++.

Конечно, есть компромиссы в производительности и диапазоне по сравнению с представлениями с фиксированной и плавающей запятой. Использование с трансцендентными функциями может быть проблемой.

Примеры умножения с использованием представления с фиксированной точкой

В этой статье мы обсудим несколько примеров умножения с использованием представления с фиксированной точкой.

Представление с фиксированной точкой позволяет нам использовать дробные числа на недорогом целочисленном оборудовании. В этой статье мы обсудим несколько примеров умножения с использованием представления с фиксированной точкой. Чтобы прочитать о примерах сложения с фиксированной точкой, обратитесь к этой статье.

Чтобы выполнить умножение с фиксированной точкой, мы можем сначала игнорировать двоичную точку множителя и множимого, выполнить умножение, рассматривая операнды как два дополнительных числа, а затем определить положение двоичной точки для результата.

Карандашно-бумажный метод двоичного умножения похож на карандашный и бумажный метод десятичного умножения. Есть два этапа: сначала создаются частичные продукты, а затем эти частичные продукты складываются для получения окончательного результата. Фактически это основано на идее, что умножение — это последовательное прибавление одного числа к самому себе. Пример 1 ниже подробно описывает эту процедуру. Затем мы обсудим случаи, когда нам нужно иметь дело с числами со знаком.{-6} \ big) _ {10} $$

Это означает, что мы можем игнорировать двоичную точку в $$ a $$ и $$ b $$, выполнить умножение, а затем поместить двоичную точку слева от шестого бита произведения, чтобы получить правильное умножение. результат.

Следовательно, здесь мы сначала пренебрегаем двоичными точками $$ a $$ и $$ b $$. Теперь, чтобы выполнить умножение, мы должны последовательно выбрать одну цифру множителя справа налево, найти произведение этой цифры на множимое, чтобы получить соответствующий частичный продукт.Затем, аналогично десятичному умножению, мы должны соответствующим образом сдвинуть частичные произведения влево и сложить их вместе.

Десятичные эквивалентные значения множимого, множителя и результата даются для проверки двоичного умножения. Цифры оранжевого цвета показывают номер строки для использования в будущем. Теперь мы должны поставить двоичную точку слева от шестого бита произведения, что дает $$ a \ times b = 10101.110010_2 = 21.78125_ {10} $$.

Произведение может быть намного больше множителя и множимого. Следовательно, нам нужна достаточно длинная длина слова, чтобы продукт правильно представлял результат. Сколько бит нам нужно для продукта, чтобы предотвратить возможное переполнение? Рассмотрим сумму первых двух частичных продуктов выше (сумма строк 3 и 4). В этом случае мы добавляем шестибитное число $$ p_1 = 000000_2 $$ к семибитному числу $$ p_2 = 1010010_2 $$ (обратите внимание, что второе частичное произведение сдвинуто влево на один бит).Сумма этих двух чисел, $$ p_1 + p_2 $$, обычно может быть восьмибитным числом (на один бит длиннее, чем $$ p_2 $$). Обозначим третий частичный продукт, сдвинутый влево на два бита, как $$ p_3 $$, то есть $$ p_3 = 00000000 $$. Добавляя $$ p_3 $$ к $$ p_1 + p_2 $$, мы складываем два восьмибитных числа, и, как правило, результатом может быть девятибитное число (на один бит больше, чем $$ p_3 $$). Продолжая эту процедуру, мы замечаем, что продукт может быть на один бит длиннее, чем соответствующая сдвинутая версия последнего частичного продукта.Например, последний частичный продукт для указанного выше умножения сдвигается на пять битов. Следовательно, у нас есть $$ p_6 = 10100100000_2 $$, которое является 11-битным числом, в результате произведение $$ a \ times b $$ может занимать не более $$ 12 $$ битов. Рассматривая общий вид этого примера, вы можете легко вычислить требуемую длину слова для произведения двух чисел. В общем, если $$ a $$ и $$ b $$ — два числа с длиной $$ L_a $$ и $$ L_b $$ битов, соответственно, нам придется использовать $$ L_a + L_b $$ биты, чтобы избежать переполнение при представлении $$ a \ times b $$.

Результаты примера 1 можно резюмировать следующим образом:

Предположим, что $$ a $$ и $$ b $$ — два числа в форматах $$ Qn1.m1 $$ и $$ Qn2.m2 $$ соответственно. Произведение $$ a \ times b $$ будет в формате $$ Qn.m $$, где $$ n = n1 + n2 $$ и $$ m = m1 + m2 $$. Длина слова продукта, то есть $$ n + m $$, является достаточно длинной, чтобы избежать возможного переполнения. Чтобы найти $$ a \ times b $$, мы можем игнорировать двоичную точку $$ a $$ и $$ b $$, выполнить умножение и затем поместить двоичную точку слева от $$ m. $$ -й бит произведения, чтобы получить правильный результат умножения.

Знаковое умножение без знака

Пример 2: Предположим, что $$ a = 101.001_2 $$ и $$ b = 100.010_2 $$ — два числа в формате Q3.3. Предположим, что $$ a $$ — это число со знаком, а $$ b $$ — беззнаковое. Найдите произведение $$ a \ times b $$.

Здесь числа такие же, как в первом примере; однако в этом примере $$ a $$ считается числом со знаком. Какая разница? Частичные продукты предыдущего примера не подписаны. Например, второй частичный продукт (строка 4) был получен путем умножения $$ 1_2 $$ на положительное число, т.е.е. $$ 101001_2 $$. Однако в этом примере множимое $$ a $$ подписано, и, следовательно, все частичные продукты будут числами со знаком. В предыдущей статье мы обсуждали, что при добавлении двух подписанных чисел разной длины нам необходимо выполнить расширение знака, иначе результат может быть недействительным. Следовательно, чтобы выполнить знаковое умножение без знака, мы должны расширить знак частичных произведений. Сначала игнорируем двоичные точки и получаем:

Сравнивая этот пример с предыдущим, вы можете видеть, что единственная разница заключается в расширении знака частичных продуктов (биты из расширения знака показаны красным).{12} $$ для этого конкретного примера (см. Эту статью). Следовательно, мы должны отбросить 13-й бит приведенных выше вычислений. Учитывая положение двоичной точки, получаем

$$ a \ times b = 110011.110010_2 = — (001100.001110_2) = -12.21875_ {10} $$. Это согласуется с результатом, полученным для эквивалентных десятичных значений выше, то есть $$ — 12.21875 = — \ tfrac {782} {64} $$.

Пример 3: Предположим, что $$ a = 100.000_2 $$ и $$ b = 111.111_2 $$ — два числа в формате Q3.3. Предположим, что $$ a $$ — это число со знаком, а $$ b $$ — беззнаковое.Найдите произведение $$ a \ times b $$.

Это похоже на предыдущий пример. Умножение может быть выполнено, как показано ниже:

Чтобы упростить вычисления, можно складывать частичные продукты по два. После каждого добавления вы можете отбросить бит слева от знакового бита. Учитывая положение двоичной точки, получаем $$ a \ times b = 100000.100000_2 $$.

Перед тем, как продолжить обсуждение, нам нужно рассмотреть важную особенность представления двух дополнительных элементов.{0} = -3 $$

Уравнение 2

Мы можем получить тот же результат с помощью более обычного способа нахождения эквивалентного десятичного значения отрицательного дополнительного числа до двух, т. Е. Поскольку $$ x $$ отрицателен, мы имеем $$ x = — (011_2) = — 3_ {10} $$.

Доказательство уравнения 1 просто. Если знаковый бит равен нулю, очевидно, что уравнение 1 действительно. Mx) $$ (см. эта статья).{i} \ end {align} $$

Уравнение 3

Теперь мы можем продолжить обсуждение умножения в представлении с фиксированной точкой.

Беззнаковое умножение со знаком

Пример 4: Предположим, что $$ a = 01.001_2 $$ и $$ b = 10.010_2 $$ — два числа в формате Q2.3. Предположим, что $$ a $$ — беззнаковое число, но $$ b $$ подписано. Найдите произведение $$ a \ times b $$.

Обратите внимание на последний частичный продукт (строка 7).Поскольку множитель $$ b $$ является числом со знаком, его самый старший бит (MSB) является битом знака. Как доказано уравнением 3, эквивалентное десятичное значение числа с дополнением до двух можно найти, рассматривая это число как беззнаковое число, за исключением того, что мы должны интерпретировать знаковый бит с отрицательным весом. Благодаря этому свойству дополнительных чисел до двух, мы можем выполнять вышеупомянутое умножение, рассматривая множитель как беззнаковое число; однако нам придется учитывать отрицательный вес для MSB.Следовательно, как показано в вычислениях этого примера, последний частичный продукт получается путем вычисления двух дополнений к $$ a $$. Учитывая положение двоичной точки, получаем $$ a \ times b = 1110.000010_2 $$. Результатом будет номер со знаком, потому что последний частичный продукт был подписан. Чтобы найти эквивалентное десятичное значение этого отрицательного числа, мы можем написать $$ a \ times b = — (0001.111110_2) = — 1.96875_10 $$. Это согласуется с десятичными вычислениями, то есть $$ — 1.96875 = — \ tfrac {126} {64} $$.

Здесь мы должны подчеркнуть два момента: во-первых, поскольку все частичные продукты, кроме последнего, беззнаковые, нам нужно только подписать-расширить последний частичный продукт. Во-вторых, при вычислении дополнения до двух, соответствующего последнему частичному произведению, мы должны представить множимое на один бит длиннее. Например, в приведенных выше расчетах мы рассматриваем $$ a $$ как $$ 001001 $$, а затем находим его дополнение до двух. Это дает нам последний частичный продукт как $$ 110111 $$.Неправильная альтернатива — сначала найти два дополнения пятибитового $$ a $$, что дает $$ 10111 $$, а затем расширить результат по знаку, что приведет к $$ 110111 $$. Хотя в данном конкретном примере эти два вычисления дают один и тот же результат, в общем случае это не так. Следующий пример дополнительно поясняет этот момент.

Пример 5: Предположим, что $$ a = 11.001_2 $$ и $$ b = 10.010_2 $$ — два числа в формате Q2.3. Предположим, что $$ a $$ — беззнаковое число, но $$ b $$ подписано. Найдите произведение $$ a \ times b $$.

Учитывая положение двоичной точки, получаем $$ a \ times b = 1010.100010_2 $$. Результатом будет номер со знаком, потому что последний частичный продукт был подписан. Следовательно, мы имеем $$ a \ times b = — (0101.011110_2) = — 5.46875_ {10} $$. Это согласуется с десятичными вычислениями, то есть $$ — 5.46875 = — \ tfrac {350} {64} $$.

При вычислении дополнения до двух, соответствующего последнему частичному произведению, мы должны представить множимое на один бит длиннее.Например, в приведенных выше расчетах мы рассматриваем $$ a $$ как $$ 011001 $$, а затем находим его дополнение до двух. Это дает нам последний частичный продукт как $$ 100111 $$. Этот подписанный частичный продукт отрицательный. Мы ожидали, что это число будет отрицательным, потому что $$ a $$ беззнаковый, но MSB $$ b $$ имеет отрицательный вес. А теперь давайте рассмотрим неправильную альтернативу. На этот раз мы сначала находим два дополнения к пятибитовому a, что дает $$ 00111 $$, а затем расширяем результат по знаку, что приводит к $$ 000111 $$.Эти расчеты дают нам положительное число, что неверно. Подводя итог, когда мы вычисляем дополнение до двух, соответствующее последнему частичному произведению, мы должны представить множимое на один бит длиннее, а затем найти его дополнение до двух.

Знаковое умножение со знаком

Пример 6. Предположим, что $$ a = 11.001_2 $$ и $$ b = 10.010_2 $$ — два числа со знаком в формате Q2.3. Найдите произведение $$ a \ times b $$.

Подобно умножению со знаком на без знака, частичные произведения подписываются, и для правильного выполнения сложения нам нужно подписать и расширить частичные произведения (за исключением последнего частичного произведения, которое будет обсуждаться через минуту).Поскольку мы умножаем два пятибитных числа, в общем случае результат будет иметь длину $$ 10 $$. Следовательно, частичные произведения расширяются по знаку на $ 10 $$ бит.

Подобно умножению без знака на знак, мы должны учитывать отрицательный вес для MSB, равного $$ b $$. Следовательно, как показано в приведенных выше расчетах, последний частичный продукт получается путем вычисления двух дополнений к $$ a $$. При вычислении этого дополнения до двух мы должны представить множимое $$ a $$ на один бит длиннее, а затем найти его дополнение до двух.Поскольку здесь $$ a $$ — это число со знаком, представление его на один бит длиннее равнозначно расширению знака на один бит. Следующий пример поясняет, как можно ошибиться при вычислении этого последнего частичного продукта.

Пример 7: Предположим, что $$ a = 10.000_2 $$ и $$ b = 10.010_2 $$ — два числа со знаком в формате Q2.3. Найдите произведение $$ a \ times b $$.

На основе приведенного выше примера имеем

Рассматривая десятичные эквиваленты, мы замечаем, что вычисления верны.Теперь давайте рассмотрим потенциальную ошибку при вычислении указанного выше умножения. В этом случае при вычислении последнего частичного произведения мы сначала находим два дополнения к $$ a $$, а затем расширяем его знаком. Следовательно, имеем

Мы видим, что результатом является отрицательное число, в то время как десятичные вычисления приводят к положительному значению. Следовательно, в общем, мы должны сначала расширить знак $$ a $$, а затем найти его два дополнения.