Диаграммы Stateflow ® в моделях Simulink ® имеют свойство языка действий, которое определяет синтаксис, используемый для вычисления данных с фиксированной точкой:
MATLAB ® в качестве языка действий.
C как язык действий.
Дополнительные сведения см. в разделе Различия между MATLAB и C как синтаксисом языка действий.
Эта таблица суммирует интерпретацию всех двоичных операций над операндами с фиксированной точкой в соответствии с их порядком приоритета (0 = самый высокий, 9 = самый низкий). Бинарные операции остаются ассоциативными, так что в любом выражении операторы с одинаковым приоритетом вычисляются слева направо.
| Операция | Предшествование | MATLAB как язык действий | C как язык действий |
|---|---|---|---|
0 | Власть. Не поддерживается для операндов с фиксированной точкой, определяемых с помощью либо наклона, который не является целочисленной степенью двух, либо ненулевого смещения. Операнд экспоненты должен быть константой, значение которой является неотрицательным целым числом. | Власть. Включите эту операцию, очистив свойство Включить диаграмму C-разрядных операций. См. раздел Включение C-разрядных операций. | |
| 1 | Умножение. Для операндов с фиксированной точкой, определяемых с помощью уклона, который не является целочисленной степенью двух, или ненулевого смещения, укажите диаграмму | Умножение. Не поддерживается для операндов с фиксированной точкой, определенных с помощью ненулевого смещения. См. Умножение. |
| 1 | Дивизия. Не поддерживается для операндов с фиксированной точкой, определяемых с помощью либо наклона, который не является целочисленной степенью двух, либо ненулевого смещения. См. Раздел. | Дивизия. Не поддерживается для операндов с фиксированной точкой, определенных с помощью ненулевого смещения. См. Раздел. |
| 2 | Дополнение. Для операндов с фиксированной точкой, определяемых с помощью уклона, который не является целочисленной степенью двух, или ненулевого смещения, укажите диаграмму | Дополнение. См. раздел Сложение и вычитание. |
| 2 | Вычитание. Для операндов с фиксированной точкой, определяемых с помощью уклона, который не является целочисленной степенью двух, или ненулевого смещения, укажите диаграмму | Вычитание. См. раздел Сложение и вычитание. |
| 3 | Сравнение, больше. См. раздел Реляционные операции для данных с фиксированной точкой. | Сравнение, больше. Не поддерживается для операндов с фиксированной точкой с несоответствующими смещениями. См. раздел Реляционные операции для данных с фиксированной точкой. |
| 3 | Сравнение, меньше. См. раздел Реляционные операции для данных с фиксированной точкой. | Сравнение, меньше. Не поддерживается для операндов с фиксированной точкой с несоответствующими смещениями. См. раздел Реляционные операции для данных с фиксированной точкой. |
| 3 | Сравнение, больше или равно. См. раздел Реляционные операции для данных с фиксированной точкой. | Сравнение, больше или равно. Не поддерживается для операндов с фиксированной точкой с несоответствующими смещениями. См. раздел Реляционные операции для данных с фиксированной точкой. |
| 3 | Сравнение, меньше или равно. См. раздел Реляционные операции для данных с фиксированной точкой. | Сравнение, меньше или равно. Не поддерживается для операндов с фиксированной точкой с несоответствующими смещениями. См. раздел Реляционные операции для данных с фиксированной точкой. |
| 4 | Сравнение, равно. См. раздел Реляционные операции для данных с фиксированной точкой. | Сравнение, равно. Не поддерживается для операндов с фиксированной точкой с несоответствующими смещениями. См. раздел Реляционные операции для данных с фиксированной точкой. |
| 4 | Сравнение, не равное. См. раздел Реляционные операции для данных с фиксированной точкой. | Сравнение, не равное. Не поддерживается для операндов с фиксированной точкой с несоответствующими смещениями. См. раздел Реляционные операции для данных с фиксированной точкой. |
| 4 | Не поддерживается. Использовать операцию | Сравнение, не равное. Не поддерживается для операндов с фиксированной точкой с несоответствующими смещениями. См. раздел Реляционные операции для данных с фиксированной точкой. |
| 4 | Не поддерживается. Использовать операцию | Сравнение, не равное. Не поддерживается для операндов с фиксированной точкой с несоответствующими смещениями. См. раздел Реляционные операции для данных с фиксированной точкой. |
| 8 | Логический И. См. раздел Логические операции для данных с фиксированной точкой. | Логический И. См. раздел Логические операции для данных с фиксированной точкой. |
| 9 | Логическое ИЛИ. См. раздел Логические операции для данных с фиксированной точкой. | Логическое ИЛИ. См. раздел Логические операции для данных с фиксированной точкой. |
В этой таблице представлена интерпретация всех унарных операций и действий над операндами с фиксированной точкой. Унарные операции:
Имеют более высокий приоритет, чем двоичные операторы.
Являются правыми ассоциативными, так что в любом выражении они вычисляются справа налево.
Операция | MATLAB как язык действий | C как язык действий |
|---|---|---|
| Не поддерживается. Использовать выражение | Логический NOT. Включите эту операцию, очистив свойство Включить диаграмму C-разрядных операций. См. разделы Логические операции для данных с фиксированной точкой и Включение операций С-разрядами. |
| Не поддерживается. Использовать выражение | Логический NOT. См. раздел Логические операции для данных с фиксированной точкой. |
| Отрицательный. См. Унарный минус. | Отрицательный. См. Унарный минус. |
| Не поддерживается. Использовать выражение | Приращение. Эквивалентно |
| Не поддерживается. Использовать выражение | Уменьшение. Эквивалентно |
В этой таблице представлена интерпретация операций назначения для операндов с фиксированной точкой.
Операция | MATLAB как язык действий | C как язык действий |
|---|---|---|
| Простое назначение. | Простое назначение. |
| Не поддерживается. Чтобы переопределить правила продвижения с фиксированной точкой, используйте явные операции приведения типа. См. раздел Операции литейной формы. | Специальное назначение, которое переопределяет правила продвижения с фиксированной точкой. См. раздел Переопределение продвижения с фиксированной точкой в диаграммах 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)). Они соответствуют этим наклонам и квантованным целым числам:


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