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