Stateflow® графики в Simulink® модели имеют свойство языка действий, которое задает синтаксис, который вы используете для вычисления с данными с фиксированной точкой:
MATLAB® как язык действий.
C как язык действия.
Для получения дополнительной информации смотрите Различия между MATLAB и C как синтаксис языка действий.
Эта таблица суммирует интерпретацию всех двоичных операций на операндах с фиксированной точкой в соответствии с их порядком приоритета (0 = самый высокий, 9 = самый низкий). Двоичные операции являются ассоциативными слева, так что в любом выражении операторы с таким же приоритетом оцениваются слева направо.
Операция | Приоритет | MATLAB как язык действий | C как язык действий |
---|---|---|---|
0 | Степень. Не поддерживается для операндов с фиксированной точкой, заданных использованием наклона, который не является целочисленной степенью двойки или ненулевым смещением. Экспонентный операнд должен быть константой, значение которой является неотрицательным целым числом. | Степень. Включите эту операцию, очистив свойство Enable C-bit operations chart. См. «Включить операции». | |
| 1 | Умножение. Для операндов с фиксированной точкой, заданных при помощи либо наклона, который не является целочисленной степенью двойки, либо ненулевого смещения, задайте график | Умножение. Не поддерживается для операндов с фиксированной точкой, заданных использованием ненулевого смещения. См. Умножение. |
| 1 | Деление. Не поддерживается для операндов с фиксированной точкой, заданных использованием наклона, который не является целочисленной степенью двойки или ненулевым смещением. См. Деление. | Деление. Не поддерживается для операндов с фиксированной точкой, заданных использованием ненулевого смещения. См. Деление. |
| 2 | Сложение. Для операндов с фиксированной точкой, заданных при помощи либо наклона, который не является целочисленной степенью двойки, либо ненулевого смещения, задайте график | Сложение. См. Сложение и вычитание. |
| 2 | Вычитание. Для операндов с фиксированной точкой, заданных при помощи либо наклона, который не является целочисленной степенью двойки, либо ненулевого смещения, задайте график | Вычитание. См. Сложение и вычитание. |
| 3 | Сравнение, больше чем. Смотрите Реляционные операции для данных с фиксированной точкой. | Сравнение, больше чем. Не поддерживается для операндов с фиксированной точкой с несоответствующими смещениями. Смотрите Реляционные операции для данных с фиксированной точкой. |
| 3 | Сравнение, меньше чем. Смотрите Реляционные операции для данных с фиксированной точкой. | Сравнение, меньше чем. Не поддерживается для операндов с фиксированной точкой с несоответствующими смещениями. Смотрите Реляционные операции для данных с фиксированной точкой. |
| 3 | Сравнение, больше или равно. Смотрите Реляционные операции для данных с фиксированной точкой. | Сравнение, больше или равно. Не поддерживается для операндов с фиксированной точкой с несоответствующими смещениями. Смотрите Реляционные операции для данных с фиксированной точкой. |
| 3 | Сравнение, меньше или равно. Смотрите Реляционные операции для данных с фиксированной точкой. | Сравнение, меньше или равно. Не поддерживается для операндов с фиксированной точкой с несоответствующими смещениями. Смотрите Реляционные операции для данных с фиксированной точкой. |
| 4 | Сравнение, равное. Смотрите Реляционные операции для данных с фиксированной точкой. | Сравнение, равное. Не поддерживается для операндов с фиксированной точкой с несоответствующими смещениями. Смотрите Реляционные операции для данных с фиксированной точкой. |
| 4 | Сравнение, не равное. Смотрите Реляционные операции для данных с фиксированной точкой. | Сравнение, не равное. Не поддерживается для операндов с фиксированной точкой с несоответствующими смещениями. Смотрите Реляционные операции для данных с фиксированной точкой. |
| 4 | Не поддерживается. Используйте операционную | Сравнение, не равное. Не поддерживается для операндов с фиксированной точкой с несоответствующими смещениями. Смотрите Реляционные операции для данных с фиксированной точкой. |
| 4 | Не поддерживается. Используйте операционную | Сравнение, не равное. Не поддерживается для операндов с фиксированной точкой с несоответствующими смещениями. Смотрите Реляционные операции для данных с фиксированной точкой. |
| 8 | Логический И. Смотрите Логические операции для данных с фиксированной точкой. | Логический И. Смотрите Логические операции для данных с фиксированной точкой. |
| 9 | Логический OR. Смотрите Логические операции для данных с фиксированной точкой. | Логический OR. Смотрите Логические операции для данных с фиксированной точкой. |
В этой таблице обобщена интерпретация всех унарных операций и действий на операндах с фиксированной точкой. Унарные операции:
Имеют более высокий приоритет, чем бинарные операторы.
Правые ассоциативные так, что в любом выражении они вычисляются справа налево.
Операция | MATLAB как язык действий | C как язык действий |
---|---|---|
| Не поддерживается. Используйте выражение | Логический NOT. Включите эту операцию, очистив свойство Enable C-bit operations chart. Смотрите Логические операции для данных с фиксированной точкой и Включить операции С-битов. |
| Не поддерживается. Используйте выражение | Логический NOT. Смотрите Логические операции для данных с фиксированной точкой. |
| Отрицательный. См. Унарный минус. | Отрицательный. См. Унарный минус. |
| Не поддерживается. Используйте выражение | Шаг. Эквивалентно |
| Не поддерживается. Используйте выражение | Уменьшение. Эквивалентно |
В этой таблице обобщена интерпретация операций назначения для операндов с фиксированной точкой.
Операция | MATLAB как язык действий | 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)
).
Входы соответствуют этим наклонам и квантованным целым числам:
<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)
). Они соответствуют этим наклонам и квантованным целым числам:
Модель вычисляет значение a/b
как число с плавающей запятой типа fixdt(1,16,1)
тремя различными способами:
Операция приведения типов в графике, которая использует MATLAB в качестве языка действий.
Простая операция назначения в графике, которая использует C в качестве языка действий.
Операция специального назначения на графике, которая использует C в качестве языка действий.
Приведение типов в графике, которая использует MATLAB в качестве языка действий
График в верхней части модели вычисляет промежуточное значение для a/b
. Квантованное целое число для промежуточного значения округлится до ближайшее целого числа:
Промежуточное значение затем приведено как знаковое 16-значное число с фиксированной точкой c
с одним битом дроби:
Значение выхода из этого графика является
Простое назначение на графике, которое использует C в качестве языка действий
Средний график также вычисляет промежуточное значение для a/b
. В этом случае квантованное целое число для промежуточного значения округлится до этажа:
Промежуточное значение затем приведено как знаковое 16-значное число с фиксированной точкой c
с одним битом дроби:
Значение выхода из этого графика является
Специальное назначение в графике, которое использует C в качестве языка действий
На графике в нижней части модели используется специальное присвоение формы c := a/b
. Значение деления вычисляется непосредственно как знаковое 16-значное число с фиксированной точкой с одной дробью бита. Квантованное целое число округлено до пола:
Поэтому значение выхода с этой диаграммы
Три результата показывают потерю точности по сравнению с ответом с плавающей точкой 19/24 = 0,7917. Чтобы минимизировать потерю точности до приемлемого уровня в вашем приложении, настройте схему кодирования в данных с фиксированной точкой.