exponenta event banner

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

Диаграммы Stateflow ® в моделях Simulink ® имеют свойство языка действий, которое определяет синтаксис, используемый для вычисления данных с фиксированной точкой:

  • MATLAB ® в качестве языка действий.

  • C как язык действий.

Дополнительные сведения см. в разделе Различия между MATLAB и C как синтаксисом языка действий.

Двоичные операции

Эта таблица суммирует интерпретацию всех двоичных операций над операндами с фиксированной точкой в соответствии с их порядком приоритета (0 = самый высокий, 9 = самый низкий). Бинарные операции остаются ассоциативными, так что в любом выражении операторы с одинаковым приоритетом вычисляются слева направо.

Операция

Предшествование

MATLAB как язык действий

C как язык действий

a ^ b

0

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

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

a * b

1

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

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

a / b

1

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

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

a + b

2

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

Дополнение. См. раздел Сложение и вычитание.

a - b

2

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

Вычитание. См. раздел Сложение и вычитание.

a > b

3

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

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

a < b

3

Сравнение, меньше. См. раздел Реляционные операции для данных с фиксированной точкой.

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

a >= b

3

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

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

a <= b

3

Сравнение, меньше или равно. См. раздел Реляционные операции для данных с фиксированной точкой.

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

a == b

4

Сравнение, равно. См. раздел Реляционные операции для данных с фиксированной точкой.

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

a ~= b

4

Сравнение, не равное. См. раздел Реляционные операции для данных с фиксированной точкой.

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

a != b

4

Не поддерживается. Использовать операцию a ~= b. См. раздел Реляционные операции для данных с фиксированной точкой.

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

a <> b

4

Не поддерживается. Использовать операцию a ~= b. См. раздел Реляционные операции для данных с фиксированной точкой.

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

a && b

8

Логический И. См. раздел Логические операции для данных с фиксированной точкой.

Логический И. См. раздел Логические операции для данных с фиксированной точкой.

a || b

9

Логическое ИЛИ. См. раздел Логические операции для данных с фиксированной точкой.

Логическое ИЛИ. См. раздел Логические операции для данных с фиксированной точкой.

Унарные операции и действия

В этой таблице представлена интерпретация всех унарных операций и действий над операндами с фиксированной точкой. Унарные операции:

  • Имеют более высокий приоритет, чем двоичные операторы.

  • Являются правыми ассоциативными, так что в любом выражении они вычисляются справа налево.

Операция

MATLAB как язык действий

C как язык действий

~a

Не поддерживается. Использовать выражение a == cast(0,'like',a). См. раздел Логические операции для данных с фиксированной точкой.

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

!a

Не поддерживается. Использовать выражение a == cast(0,'like',a). См. раздел Логические операции для данных с фиксированной точкой.

Логический NOT. См. раздел Логические операции для данных с фиксированной точкой.

-a

Отрицательный. См. Унарный минус.

Отрицательный. См. Унарный минус.

a++

Не поддерживается. Использовать выражение a = a+1.

Приращение. Эквивалентно a = a+1.

a--

Не поддерживается. Использовать выражение a = a-1.

Уменьшение. Эквивалентно a = a-1.

Операции назначения

В этой таблице представлена интерпретация операций назначения для операндов с фиксированной точкой.

Операция

MATLAB как язык действий

C как язык действий

a = b

Простое назначение.

Простое назначение.

a := b

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

Специальное назначение, которое переопределяет правила продвижения с фиксированной точкой. См. раздел Переопределение продвижения с фиксированной точкой в диаграммах C.

a += b

Не поддерживается. Использовать выражение a = a+b.

Эквивалентно a = a+b.

a -= b

Не поддерживается. Использовать выражение a = a-b.

Эквивалентно a = a-b.

a *= b

Не поддерживается. Использовать выражение a = a*b.

Эквивалентно a = a*b.

a /= b

Не поддерживается. Использовать выражение a = a/b.

Эквивалентно a = a/b.

Переопределить продвижение с фиксированной точкой в диаграммах C

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

Напротив, специальное назначение формы a := b переопределяет это поведение, первоначально используя тип a как тип результата для значения b.

  • Константы в b преобразуются в тип a путем использования автономных преобразований.

  • Выражение b может содержать не более одного арифметического оператора (+, -, *, или /). Результат определяется с помощью преобразования в режиме онлайн.

  • Если b содержит что-либо, кроме арифметической операции или константы, то операция специального назначения ведет себя как операция простого назначения (=).

Использовать операцию специального присвоения := когда вы хотите:

Примечание

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

Избежать переполнения при добавлении фиксированной точки

Можно использовать операцию специального присвоения. := во избежание переполнения при выполнении арифметической операции над двумя числами с фиксированной точкой. Например, рассмотрим диаграмму, которая вычисляет сумму a+b где a = 212-1 = 4095 и b = 1.

Предположим, что:

  • Оба входа подписаны 16-разрядными числами фиксированной точки с тремя битами дроби (тип fixdt(1,16,3)).

  • Продукция c - подписанное 32-разрядное число с фиксированной точкой с тремя битами дроби (тип fixdt(1,32,3)).

  • Целочисленный размер слова для производственных целей равен 16 битам.

Поскольку целевой размер целого числа составляет 16 бит, простое назначение c = a+b суммирует входные данные в 16 битах перед отбрасыванием суммы на 32 бита. Промежуточный результат - 4096, что, как тип fixdt(1,16,3) , приводит к переполнению.

Напротив, специальное назначение c := a+b приводит входные данные к 32 битам перед вычислением суммы. Результат 4096 безопасно вычисляется как тип fixdt(1,32,3) значение без переполнения.

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

Можно использовать операцию специального присвоения. := для получения более точного результата при умножении или делении двух чисел с фиксированной точкой. Например, рассмотрим диаграмму, которая вычисляет отношение a/b где a = 2 и b = 3.

Предположим, что:

  • Вход a - число с фиксированной точкой и четырьмя битами дроби (тип fixdt(1,16,4)).

  • Вход b - число с фиксированной точкой с тремя битами дроби (тип fixdt(1,16,3)).

  • Продукция c - подписанное 16-разрядное число с фиксированной точкой с шестью битами дроби (тип fixdt(1,16,6)).

Входные данные соответствуют этим наклонам и квантованным целым числам:

Sa = 2-4, Qa = 32

Sb = 2-3, Qb = 24.

Простое назначение c = a/b сначала вычисляет промежуточное значение для a/b в соответствии с правилами продвижения по фиксированным баллам. Квантованное целое число округляется до нижнего предела:

Синт = Sa/ Sb = 2-4/2-3 = 2-1

Qint = Qa/ Qb = 32/24 ≈ 1.

Промежуточный результат затем приводится в виде знакового 16-значного числа с фиксированной точкой с шестью битами дроби:

Sc = 2-6 = 1/64

Qc = SintQint/Sc = 2-1/2-6 = 25 = 32.

Следовательно, приблизительное реальное значение для c является VcСcQc = 32/64 = 0.5. Этот результат не является хорошей аппроксимацией фактического значения 2/3.

Напротив, специальное назначение c := a/b вычисляет a/b непосредственно в виде подписанного 16-значного числа с фиксированной точкой с шестью битами дроби. Снова квантованное целое число округляется до нижнего предела:

Sc = 2-6 = 1/64

Qc = (SaQa)/( ScSbQb) = 128/3 ≈ 42.

Следовательно, приблизительное реальное значение для c является VcСcQc = 42/64 = 0.6563. Этот результат является лучшим приближением к фактическому значению 2/3.

Сравнение результатов арифметики с фиксированной точкой

В этом примере показано различие между различными реализациями арифметики с фиксированной точкой в диаграммах Stateflow. Модель содержит три диаграммы, которые вычисляют отношение a/b где a = 19 и b = 24. Оба входа подписаны 16-значными числами фиксированной точки с одним битом дроби (тип fixdt(1,16,1)). Они соответствуют этим наклонам и квантованным целым числам:

$$ S_\texttt{a} = 2^{-1}, Q_\texttt{a} = 38 $$

$$ S_\texttt{b} = 2^{-1}, Q_\texttt{b} = 48 $$

Модель вычисляет значение a/b как число с плавающей запятой типа fixdt(1,16,1) тремя различными способами:

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

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

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

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

Диаграмма в верхней части модели вычисляет промежуточное значение для a/b. Квантованное целое число для промежуточного значения округляется до ближайшего целого числа:

$$ S_\texttt{int} = S_\texttt{a}/S_\texttt{b} = 1 $$

$$ Q_\texttt{int} = Q_\texttt{a}/Q_\texttt{b} = 38/48 \approx 1 .$$

Промежуточное значение затем приводится в виде знакового 16-значного числа с фиксированной точкой c с одним битом дроби:

$$ S_\texttt{c} = 2^{-1} $$

$$ Q_\texttt{c} = S_\texttt{int} \cdot Q_\texttt{int} /S_\texttt{c} = 2&#xA;.$$

Выходное значение этой диаграммы:

$$ \tilde{V}_\texttt{c} = S_\texttt{c} \cdot Q_\texttt{c} = 1 .$$

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

Средняя диаграмма также вычисляет промежуточное значение для a/b. В этом случае квантованное целое число для промежуточного значения округляется до нижнего предела:

$$ S_\texttt{int} = S_\texttt{a}/S_\texttt{b} = 1 $$

$$ Q_\texttt{int} = Q_\texttt{a}/Q_\texttt{b} = 38/48 \approx 0 .$$

Промежуточное значение затем приводится в виде знакового 16-значного числа с фиксированной точкой c с одним битом дроби:

$$ S_\texttt{c} = 2^{-1} $$

$$ Q_\texttt{c} = S_\texttt{int} \cdot Q_\texttt{int} /S_\texttt{c} = 0&#xA;.$$

Выходное значение этой диаграммы:

$$ \tilde{V}_\texttt{c} = S_\texttt{c} \cdot Q_\texttt{c} = 0 .$$

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

Диаграмма в нижней части модели использует специальное назначение формы c := a/b. Значение деления вычисляется непосредственно как знаковое 16-значное число фиксированной точки с одним битом дроби. Квантованное целое число округляется до нижнего предела:

$$ S_\texttt{c} = 2^{-1} $$

$$ Q_\texttt{c} = (S_\texttt{a} \cdot Q_\texttt{a}) / (S_\texttt{c} \cdot&#xA;S_\texttt{b} \cdot Q_\texttt{b}) = 19/12 \approx 1 .$$

Поэтому выходное значение этой диаграммы равно

$$\tilde{V}_\texttt{c} = S_\texttt{c} \cdot Q_\texttt{c} = 0.5 .$$

Три результата показывают потерю точности по сравнению с ответом с плавающей запятой 19/24 = 0,7917. Чтобы минимизировать потерю точности до приемлемого уровня в приложении, настройте схему кодирования в данных с фиксированной точкой.

Связанные темы