Примечание
Эти разделы помогут вам понять, какой тип данных и варианты масштабирования приводят к переполнению или потере точности.
Двоичная математика основана на арифметике по модулю. Модульная арифметика использует только конечное значение чисел, заворачивая результаты любых вычислений, которые попадают вне заданного множества назад во множество.
Для примера обычные повседневные часы используют арифметику по модулю 12. Номера в этой системе могут быть только от 1 до 12. Поэтому в «тактовой» системе 9 плюс 9 равен 6. Это может быть легче визуализировать как числовой круг:
Точно так же двоичная математика может использовать только числа 0 и 1, и любые арифметические результаты, которые попадают за пределы этой области значений, оборачиваются «по кругу» в 0 или 1.
Дополнение двух является общим представлением подписанных чисел с фиксированной точкой. В дополнении двух положительные числа всегда начинаются с 0, а отрицательные - с 1. Если начальный бит числа дополнения двойки равен 0, значение получается путем вычисления стандартного двоичного значения числа. Если начальный бит числа дополнения двойки равен 1, значение получается путем принятия, что самый левый бит отрицателен, и затем вычисления двоичного значения числа. Для примера,
Чтобы вычислить отрицательное значение двоичного числа с помощью дополнения двух,
Возьми свое дополнение. То есть все 0 переворачиваются на 1, а все 1 - на 0.
Добавьте 1 с помощью двоичной математики.
Отменить любые биты, перенесенные за пределы исходного размера слова.
Например, рассмотрите принятие противоположного значения 11010 (-6). Во-первых, возьмите свой дополнение числа или переверните биты:
Затем добавьте 1, обернув все числа в 0 или 1:
Сложение чисел с фиксированной точкой требует, чтобы двоичные точки дополнений были выровнены. Сложение затем выполняется с использованием двоичной арифметики, так что не используется никакое число, кроме 0 или 1.
Например, рассмотрите сложение 010010.1 (18.5) с 0110.110 (6.75):
Вычитание с фиксированной точкой эквивалентно сложению при использовании значения дополнения двух для любых отрицательных значений. При вычитании дополнения должны быть расширены, чтобы соответствовать длине друг друга. Например, рассмотрите вычитание 0110.110 (6.75) из 010010.1 (18.5):
Большинство блоков DSP System с фиксированной точкой Toolbox™, которые выполняют сложение, приводят входы сумматора к типу данных аккумулятора перед выполнением сложения. Поэтому никакая дальнейшая перемена не требуется во время сложения, чтобы выровнять двоичные точки. Смотрите Casts для получения дополнительной информации.
Умножение чисел с фиксированной точкой двух комплементов прямо аналогично регулярному десятичному умножению, за исключением того, что промежуточные результаты должны быть расширены знаком так, чтобы их левые стороны выровнялись, прежде чем вы сложите их вместе.
Для примера рассмотрим умножение 10,11 (-1,25) на 011 (3):
Следующие схемы показывают типы данных, используемые для умножения с фиксированной точкой в программном обеспечении System Toolbox. Схемы иллюстрируют различия между типами данных, используемыми для реального, комплексно-реального и комплексно-комплексного умножения. Смотрите отдельные страницы с описанием, чтобы определить, принимает ли конкретный блок сложные входы с фиксированной точкой.
В большинстве случаев можно задать типы данных, используемые во время умножения, в маске блока. Для получения дополнительной информации смотрите Casts.
Примечание
Следующие схемы показывают использование типов данных с фиксированной точкой при умножении в программном обеспечении System Toolbox. Они не представляют фактические подсистемы, используемые программным обеспечением для выполнения умножения.
Реальное-реальное умножение. Следующая схема показывает типы данных, используемые при умножении двух вещественных чисел в программном обеспечении System Toolbox. Программа возвращает выход этой операции в типе выходных данных продукта, как показано на следующем рисунке.
Умножение реального комплекса. Следующая схема показывает типы данных, используемые в умножении действительного и комплексного номера с фиксированной точкой в программном обеспечении System Toolbox. Действительное-комплексное и комплексно-действительное умножение эквивалентны. Программа возвращает выход этой операции в типе выходных данных продукта, как показано на следующем рисунке.
Комплексно-Комплексное Умножение. Следующая схема показывает умножение двух сложных чисел с фиксированной точкой в программном обеспечении System Toolbox. Обратите внимание, что программное обеспечение возвращает выход этой операции в типе выходных данных аккумулятора, как показано на следующем рисунке.
System Toolbox блокирует приведение к типу данных аккумулятора перед выполнением операций сложения или вычитания. В предыдущей схеме это эквивалентно коду С
acc=ac; acc-=bd;
для вычитателя, и
acc=ad; acc+=bc;
для сумматора, где acc является аккумулятором.
Многие блоки System Toolbox с фиксированной точкой, которые выполняют арифметические операции, позволяют вам задавать типы выходных данных аккумулятора, промежуточного продукта и продукта, как применимо, а также тип выходных данных блока. В этом разделе дается обзор приведений к этим типам данных, так что можно узнать, будут ли выбранные вами типы данных вызывать расширение знака, заполнение нулями, округление и/или переполнение. Расширение знака - это сложение бит, которые имеют значение самого значительного бита до верхнего конца числа дополнения двух. Расширение знака не изменяет значение двоичного числа. Заполнение расширяет наименее значимый бит двоичного слова с одним или несколькими нулями.
Для большинства блоков System Toolbox с фиксированной точкой, которые выполняют сложение или вычитание, операнды сначала приводятся к типу данных аккумулятора. Большую часть времени можно задать тип данных аккумулятора на маске блока. Для получения дополнительной информации см. описание типа Accumulator данных в разделе «Задайте атрибуты фиксированной точки для Блоков» (DSP System Toolbox). Поскольку оба дополнения приводятся к одному и тому же типу данных аккумулятора, прежде чем они будут добавлены вместе, нет необходимости в дополнительном сдвиге, чтобы гарантировать, что их двоичные точки выровнены. Результат сложения остается в типе данных аккумулятора с возможностью переполнения.
Для блоков System Toolbox, которые выполняют умножение, выход умножителя помещается в тип выходных данных продукта. Блоки, которые затем подают выход продукта обратно в умножитель, могут сначала привести его к промежуточному типу данных продукта. В большинстве случаев можно задать эти типы данных на маске блока. Для получения дополнительной информации смотрите описание параметров Intermediate Product и Product Output типа данных в Specify Fixed-Point Attributes for Blocks (DSP System Toolbox).
Многие блоки System Toolbox с фиксированной точкой позволяют вам задавать тип данных и масштабирование выхода блоков в маске. Помните, что программное обеспечение не разрешает использование смешанных типов на вход и выход портах своих блоков. Поэтому, если вы хотите задать тип выходных данных с фиксированной точкой и масштабирование для блока System Toolbox, который поддерживает типы данных с фиксированной точкой, вы должны передать входной порт этого блока с сигналом с фиксированной точкой. Окончательное приведение, сделанное блоком System Toolbox с фиксированной точкой, относится к типу выходных данных блока.
Обратите внимание, что хотя вы не можете смешивать сигналы с фиксированной точкой и с плавающей точкой на входных и выходных портах блоков, вы можете иметь сигналы с фиксированной точкой с различными длинами слов и дробей на портах блоков, которые поддерживают сигналы с фиксированной точкой.
Важно иметь в виду последствия каждого приведения при выборе этих промежуточных типов данных, а также любых других промежуточных типов данных с фиксированной точкой, которые разрешены конкретным блоком. В зависимости от выбранных типов данных может возникнуть переполнение и/или округление. Следующие два примера демонстрируют случаи, когда могут происходить переполнение и округление.
Переход от более короткого типа данных к более длинному типу данных. Рассмотрим приведение ненулевого числа, представленного четырехбитовым типом данных с двумя дробными битами, к восьмибитному типу данных с семью дробными битами:
Как показывает схема, исходные биты смещены вверх, так что двоичная точка соответствует двоичному положению точки назначения. Самый высокий бит источника не подходит, поэтому может произойти переполнение, и результат может насытиться или обернуться. Пустые биты в нижнем конце целевого типа данных заполнены либо 0, либо 1-ми:
Если переполнение не происходит, пустые биты заполняются значением 0.
Если происходит перенос, пустые биты заполняются 0.
Если происходит насыщение,
Пустые биты положительного числа заполнены 1.
Пустые биты отрицательного числа заполнены 0.
Можно видеть, что даже при приведении от более короткого типа данных к более длинному типу данных переполнение может все еще происходить. Это может произойти, когда целочисленная длина исходного типа данных (в этом случае два) больше, чем целочисленная длина целого типа данных (в этом случае один). Точно так же округление может быть необходимым даже при приведении от более короткого типа данных к более длинному типу данных, если тип данных назначения и масштабирование имеют меньше дробных бит, чем источник.
Переход от более длинного типа данных к более короткому типу данных. Рассмотрим приведение ненулевого числа, представленного восьмибитным типом данных с семью дробными битами, к четырехбитному типу данных с двумя дробными битами:
Как показывает схема, исходные биты смещены вниз, так что двоичная точка совпадает с двоичным положением точки назначения. Нет значения для самого высокого бита от источника, поэтому результатом является расширение знака для заполнения целочисленного фрагмента целевого типа данных. Нижние пять биты источника не помещаются в длину части места назначения. Поэтому точность может быть потеряна, когда результат округлен.
В этом случае, даже если приведение от более длинного типа данных до более короткого типа данных, все целочисленные биты поддерживаются. И наоборот, полная точность может быть сохранена, даже если вы приводите к более короткому типу данных, пока длина дроби целевого типа данных является такой же длиной или больше, чем длина дроби исходного типа данных. В этом случае, однако, биты теряются от верхнего конца результата и может произойти переполнение.
Худший случай происходит, когда и целочисленная длина, и длина дроби целевого типа данных короче, чем у исходного типа данных и масштабирования. В этом случае может произойти как переполнение, так и потеря точности.