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

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

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

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

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

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

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

Операция

Приоритет

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

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

a ^ b

0

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

Степень. Включите эту операцию, очистив свойство Enable C-bit operations chart. См. «Включить операции».

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

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

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

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

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

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

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

Операция

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

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

~a

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

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

!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

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

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

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 в качестве языка действий, простое назначение формы 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)).

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

<reservedrangesplaceholder1> <reservedrangesplaceholder0> = 2–4, <reservedrangesplaceholder1> <reservedrangesplaceholder0> = 32

<reservedrangesplaceholder1> <reservedrangesplaceholder0> = 2–3, <reservedrangesplaceholder1> <reservedrangesplaceholder0> = 24.

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

S int = S a/ <reservedrangesplaceholder1> <reservedrangesplaceholder0> = 2-4/2-3 = 2-1

Q int = Q a/ <reservedrangesplaceholder1> <reservedrangesplaceholder0> = 32/24 ≈ 1.

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

<reservedrangesplaceholder1> <reservedrangesplaceholder0> = 2-6 = 1/64

<reservedrangesplaceholder1> <reservedrangesplaceholder0> = S int Q int/ S c = 2-1/2-6 = 25 = 32.

Поэтому приблизительное значение реального мира для c является V c<reservedrangesplaceholder1> <reservedrangesplaceholder0><reservedrangesplaceholder1> <reservedrangesplaceholder0> = 32/64 = 0.5. Этот результат не является хорошим приближением фактического значения 2/3.

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

<reservedrangesplaceholder1> <reservedrangesplaceholder0> = 2-6 = 1/64

<reservedrangesplaceholder1> <reservedrangesplaceholder0> = (S a<reservedrangesplaceholder1> <reservedrangesplaceholder0>) / (S c<reservedrangesplaceholder1> <reservedrangesplaceholder0><reservedrangesplaceholder1> <reservedrangesplaceholder0>) = 128/3 ≈ 42.

Поэтому приблизительное значение реального мира для c является V c<reservedrangesplaceholder1> <reservedrangesplaceholder0><reservedrangesplaceholder1> <reservedrangesplaceholder0> = 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. Чтобы минимизировать потерю точности до приемлемого уровня в вашем приложении, настройте схему кодирования в данных с фиксированной точкой.

Похожие темы