Эти разделы помогут вам понять, какой тип данных и масштабирующийся выбор приводят к переполнению или потере точности.
Бинарная математика основана на арифметике по модулю. Арифметика по модулю использует только конечное множество чисел, перенося результаты любых вычислений, которые выходят за пределы данного, задержанного в набор.
Например, общие повседневные часы используют по модулю 12 арифметик. Числа в этой системе могут только быть 1 - 12. Поэтому в системе “часов”, 9 плюс 9 равняется 6. Это может более легко визуализироваться как круг номера:
Точно так же бинарная математика может только использовать числа 0 и 1, и любые арифметические результаты, которые выходят за пределы этой области значений, перенесены “вокруг круга” или к 0 или к 1.
Дополнение Туо является способом интерпретировать двоичное число. В дополнении two положительные числа всегда запускаются с 0, и отрицательные числа всегда запускаются с 1. Если ведущий бит дополнительного номера two 0, значение получено путем вычисления стандартного двоичного значения номера. Если ведущий бит дополнительного номера two равняется 1, значение получено путем предположения, что крайний левый бит отрицателен, и затем вычисление двоичного значения номера. Например,
Вычислить отрицание двоичного числа с помощью дополнения two,
Например, рассмотрите взятие отрицания 11 010 (-6). Во-первых, возьмите поразрядное дополнение до единицы номера или инвертируйте биты:
Затем, добавьте 1, перенеся все числа к 0 или 1:
Сложение чисел фиксированной точки требует, чтобы двоичные точки слагаемых были выровнены. Сложение затем выполняется с помощью двоичной арифметики так, чтобы никакой номер кроме 0 или 1 не использовался.
Например, рассмотрите сложение 010010,1 (18.5) с 0110,110 (6.75):
Вычитание фиксированной точки эквивалентно добавлению при использовании дополнительного значения two для любых отрицательных величин. В вычитании слагаемые должны быть расширены знаком, чтобы совпадать с длиной друг друга. Например, рассмотрите вычитание 0110.110 (6.75) от 010010,1 (18.5):
Значение по умолчанию fimath имеет значение 1
, (TRUE) для свойства CastBeforeSum
. Это бросает слагаемых к типу данных суммы перед сложением. Поэтому никакая дальнейшая перемена не необходима во время сложения, чтобы выстроить в линию двоичные точки.
Если CastBeforeSum
имеет значение (FALSE) 0
, слагаемые добавляются с сохраняемой полной точностью. После сложения затем квантуется сумма.
Умножение дополнительных чисел фиксированной точки two походит на непосредственно регулярное десятичное умножение, за исключением того, что промежуточные результаты должны быть расширены знаком так, чтобы их левые стороны выровнялись, прежде чем вы добавите их вместе.
Например, рассмотрите умножение 10,11 (-1.25) с 011 (3):
Следующие схемы показывают типы данных, используемые для умножения фиксированной точки с помощью программного обеспечения Fixed-Point Designer™. Схемы иллюстрируют различия между типами данных, используемыми для действительно-действительного, комплексно-действительного, и комплексно-комплексного умножения.
Действительно-действительное Умножение. Следующая схема показывает типы данных, используемые тулбоксом в умножении двух вещественных чисел. Программное обеспечение возвращает выходной параметр этой операции в типе данных продукта, которым управляет свойство ProductMode
объекта fimath
.
Действительно-комплексное Умножение. Следующая схема показывает типы данных, используемые тулбоксом в умножении действительного и комплексного номера фиксированной точки. Действительно-комплексное и комплексно-действительное умножение эквивалентно. Программное обеспечение возвращает выходной параметр этой операции в типе данных продукта, которым управляет свойство ProductMode
объекта fimath
:
Комплексно-комплексное Умножение. Следующая схема показывает умножение двух комплексных чисел фиксированной точки. Программное обеспечение возвращает выходной параметр этой операции в типе данных суммы, которым управляет свойство SumMode
объекта fimath
. Промежуточный тип данных продукта определяется свойством ProductMode
объекта fimath
.
Когда свойством CastBeforeSum
объекта fimath
является true
, броски к типу данных суммы присутствуют после множителей в предыдущей схеме. В коде С это эквивалентно
acc=ac; acc-=bd;
для вычитающего устройства, и
acc=ad; acc+=bc;
для сумматора, где acc является аккумулятором. Когда свойством CastBeforeSum
является false
, броски не присутствуют, и данные остаются в типе данных продукта перед операциями вычитания и операциями сложения.
В следующих примерах позволить
F = fimath('ProductMode','FullPrecision',... 'SumMode','FullPrecision'); T1 = numerictype('WordLength',24,'FractionLength',20); T2 = numerictype('WordLength',16,'FractionLength',10);
Real*Real. Заметьте, что размер слова и дробная длина результата z
равны сумме размеров слова и дробных длин, соответственно, множимых. Это вызвано тем, что свойства fimath
SumMode
и ProductMode
установлены в FullPrecision
:
P = fipref;
P.FimathDisplay = 'none';
x = fi(5, T1, F)
x =
5
DataTypeMode: Fixed-point: binary point scaling
Signedness: Signed
WordLength: 24
FractionLength: 20
y = fi(10, T2, F)
y =
10
DataTypeMode: Fixed-point: binary point scaling
Signedness: Signed
WordLength: 16
FractionLength: 10
z = x*y
z =
50
DataTypeMode: Fixed-point: binary point scaling
Signedness: Signed
WordLength: 40
FractionLength: 30
Real*Complex. Заметьте, что размер слова и дробная длина результата z
равны сумме размеров слова и дробных длин, соответственно, множимых. Это вызвано тем, что свойства fimath
SumMode
и ProductMode
установлены в FullPrecision
:
x = fi(5,T1,F) x = 5 DataTypeMode: Fixed-point: binary point scaling Signedness: Signed WordLength: 24 FractionLength: 20 y = fi(10+2i,T2,F) y = 10.0000 + 2.0000i DataTypeMode: Fixed-point: binary point scaling Signedness: Signed WordLength: 16 FractionLength: 10 z = x*y z = 50.0000 +10.0000i DataTypeMode: Fixed-point: binary point scaling Signedness: Signed WordLength: 40 FractionLength: 30
Complex*Complex. Комплексно-комплексное умножение включает сложение, а также умножение. В результате размер слова результата полной точности имеет еще один бит, чем сумма размеров слова множимых:
x = fi(5+6i,T1,F) x = 5.0000 + 6.0000i DataTypeMode: Fixed-point: binary point scaling Signedness: Signed WordLength: 24 FractionLength: 20 y = fi(10+2i,T2,F) y = 10.0000 + 2.0000i DataTypeMode: Fixed-point: binary point scaling Signedness: Signed WordLength: 16 FractionLength: 10 z = x*y z = 38.0000 +70.0000i DataTypeMode: Fixed-point: binary point scaling Signedness: Signed WordLength: 41 FractionLength: 30
Объект fimath
позволяет вам задавать тип данных и масштабирование промежуточных сумм и продуктов со свойствами SumMode
и ProductMode
. Важно иметь в виду разветвления каждого броска, когда вы устанавливаете свойства SumMode
и ProductMode
. В зависимости от типов данных вы выбираете, переполняетесь, и/или округление может произойти. Следующий двум примерам демонстрирует случаи, где переполнение и округление могут произойти.
Для большего количества примеров кастинга смотрите Бросок fi Объекты.
Рассмотрите бросок ненулевого номера, представленного 4-битным типом данных с двумя дробными битами, к 8-битному типу данных с семью дробными битами:
Когда схема показывает, исходные биты переключены так, чтобы двоичная точка совпадала с целевым положением двоичной точки. Самый высокий исходный бит не соответствует, таким образом, переполнение может произойти, и результат может насыщать или перенестись. Пустые биты на нижнем уровне целевого типа данных дополнены или 0 или 1's:
Если переполнение не происходит, пустые биты дополнены 0.
Если перенос происходит, пустые биты дополнены 0.
Если насыщение происходит,
Пустые биты положительного числа дополнены 1's.
Пустые биты отрицательного числа дополнены 0.
Вы видите, что даже с броском от более короткого типа данных до более длительного типа данных, переполнение может все еще произойти. Это может произойти, когда целочисленная длина типа исходных данных (в этом случае два) более длинна, чем целочисленная длина целевого типа данных (в этом случае один). Точно так же округление может быть необходимым, бросив от более короткого типа данных до более длительного типа данных, если целевой тип данных и масштабирование имеют меньше дробных битов, чем источник.
Рассмотрите бросок ненулевого номера, представленного 8-битным типом данных с семью дробными битами, к 4-битному типу данных с двумя дробными битами:
Когда схема показывает, исходные биты переключены вниз так, чтобы двоичная точка совпадала с целевым положением двоичной точки. Нет никакого значения для самого высокого бита из источника, таким образом, расширение знака используется, чтобы заполнить целочисленный фрагмент целевого типа данных. Нижняя часть пять битов источника не помещается в дробную длину места назначения. Поэтому точность может быть потеряна, когда результат округлен.
В этом случае, даже при том, что бросок от более длительного типа данных до более короткого типа данных, все целочисленные биты сохраняются. С другой стороны полная точность может сохраняться, даже если вы бросаете к более короткому типу данных, пока дробная длина целевого типа данных является той же длиной или дольше, чем дробная длина типа исходных данных. В этом случае, однако, биты потеряны от верхнего уровня результата, и переполнение может произойти.
Худший случай происходит, когда и целочисленная длина и дробная длина целевого типа данных короче, чем те из типа исходных данных и масштабирования. В этом случае оба переполнения и потеря точности могут произойти.