Stateflow® графики в Simulink® модели имеют свойство языка действия, которое задает синтаксис, которого вы используетесь для расчета с данными фиксированной точки:
MATLAB® как язык действия.
C как язык действия.
Для получения дополнительной информации смотрите Различия Между MATLAB и C как Синтаксис языка Действия.
Эта таблица суммирует интерпретацию всех бинарных операций на операндах фиксированной точки согласно их порядку очередности (0 = самый высокий, 9 = самый низкий). Бинарные операции левоассоциативны так, чтобы в любом выражении операторы с тем же приоритетом были оценены слева направо.
| Операция | Приоритет | MATLAB как язык действия | C как язык действия |
|---|---|---|---|
0 | Степень. Не поддерживаемый для операндов фиксированной точки, заданных или при помощи наклона, который не является целочисленной степенью двойки или ненулевым смещением. Операнд экспоненты должен быть константой, значение которой является неотрицательным целым числом. | Степень. Включите эту операцию путем очистки Разрешения свойства диаграммы операций C-bit. Смотрите Включают операции C-bit. | |
| 1 | Умножение. Для операндов фиксированной точки, заданных или при помощи наклона, который не является целочисленной степенью двойки или при помощи ненулевым смещением, задайте график | Умножение. Не поддерживаемый для операндов фиксированной точки задан при помощи ненулевого смещения. Смотрите Умножение. |
| 1 | Деление. Не поддерживаемый для операндов фиксированной точки, заданных или при помощи наклона, который не является целочисленной степенью двойки или ненулевым смещением. Смотрите Деление. | Деление. Не поддерживаемый для операндов фиксированной точки задан при помощи ненулевого смещения. Смотрите Деление. |
| 2 | Сложение. Для операндов фиксированной точки, заданных или при помощи наклона, который не является целочисленной степенью двойки или при помощи ненулевым смещением, задайте график | Сложение. Смотрите сложение и вычитание. |
| 2 | Вычитание. Для операндов фиксированной точки, заданных или при помощи наклона, который не является целочисленной степенью двойки или при помощи ненулевым смещением, задайте график | Вычитание. Смотрите сложение и вычитание. |
| 3 | Сравнение, больше, чем. Смотрите Реляционные операции для Данных Фиксированной точки. | Сравнение, больше, чем. Не поддерживаемый для операндов фиксированной точки с несовпадающими смещениями. Смотрите Реляционные операции для Данных Фиксированной точки. |
| 3 | Сравнение, меньше, чем. Смотрите Реляционные операции для Данных Фиксированной точки. | Сравнение, меньше, чем. Не поддерживаемый для операндов фиксированной точки с несовпадающими смещениями. Смотрите Реляционные операции для Данных Фиксированной точки. |
| 3 | Сравнение, больше, чем или равный. Смотрите Реляционные операции для Данных Фиксированной точки. | Сравнение, больше, чем или равный. Не поддерживаемый для операндов фиксированной точки с несовпадающими смещениями. Смотрите Реляционные операции для Данных Фиксированной точки. |
| 3 | Сравнение, меньше чем или равное. Смотрите Реляционные операции для Данных Фиксированной точки. | Сравнение, меньше чем или равное. Не поддерживаемый для операндов фиксированной точки с несовпадающими смещениями. Смотрите Реляционные операции для Данных Фиксированной точки. |
| 4 | Сравнение, равное. Смотрите Реляционные операции для Данных Фиксированной точки. | Сравнение, равное. Не поддерживаемый для операндов фиксированной точки с несовпадающими смещениями. Смотрите Реляционные операции для Данных Фиксированной точки. |
| 4 | Сравнение, не равное. Смотрите Реляционные операции для Данных Фиксированной точки. | Сравнение, не равное. Не поддерживаемый для операндов фиксированной точки с несовпадающими смещениями. Смотрите Реляционные операции для Данных Фиксированной точки. |
| 4 | Не поддерживаемый. Используйте операцию | Сравнение, не равное. Не поддерживаемый для операндов фиксированной точки с несовпадающими смещениями. Смотрите Реляционные операции для Данных Фиксированной точки. |
| 4 | Не поддерживаемый. Используйте операцию | Сравнение, не равное. Не поддерживаемый для операндов фиксированной точки с несовпадающими смещениями. Смотрите Реляционные операции для Данных Фиксированной точки. |
| 8 | Логический AND. Смотрите логические операции для данных фиксированной точки. | Логический AND. Смотрите логические операции для данных фиксированной точки. |
| 9 | Логический OR. Смотрите логические операции для данных фиксированной точки. | Логический OR. Смотрите логические операции для данных фиксированной точки. |
Эта таблица суммирует интерпретацию всех унарных операций и действий с операндами фиксированной точки. Унарные операции:
Имейте более высокий приоритет, чем бинарные операторы.
Правоассоциативны так, чтобы в любом выражении они были оценены справа налево.
Операция | MATLAB как язык действия | C как язык действия |
|---|---|---|
| Не поддерживаемый. Используйте выражение | Логический НЕТ. Включите эту операцию путем очистки Разрешения свойства диаграммы операций C-bit. Смотрите Логические операции для Данных Фиксированной точки и Включите операции C-bit. |
| Не поддерживаемый. Используйте выражение | Логический НЕТ. Смотрите логические операции для данных фиксированной точки. |
| Отрицательный. Смотрите унарный минус. | Отрицательный. Смотрите унарный минус. |
| Не поддерживаемый. Используйте выражение | Шаг. Эквивалентный |
| Не поддерживаемый. Используйте выражение | Декремент. Эквивалентный |
Эта таблица суммирует интерпретацию операций присвоения на операндах фиксированной точки.
Операция | 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 битам прежде, чем вычислить сумму. Результат 4 096 безопасно вычисляется как тип 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)).
Входные параметры соответствуют этим наклонам и квантованным целым числам:
S a = 2–4, Q a = 32
S b = 2–3, Q b = 24.
Простое присвоение c = a/b сначала вычисляет промежуточное значение для a/b согласно правилам продвижения фиксированной точки. Квантованное целое число округлено на пол:
Int S = S a/Sb = 2-4/2-3 = 2-1
Int Q = Q a/Qb = 32/24 ≈ 1.
Промежуточный результат затем снят как 16-разрядный номер фиксированной точки со знаком с шестью дробными битами:
S c = 2-6 = 1/64
Q c = S intQint/Sc = 2-1/2-6 = 25 = 32.
Поэтому аппроксимированное реальное значение для c V c ≈ S cQ c = 32/64 = 0.5. Этим результатом не является хорошее приближение фактического значения 2/3.
В отличие от этого специальное присвоение c := a/b вычисляет a/b непосредственно как 16-разрядный номер фиксированной точки со знаком с шестью дробными битами. Снова, квантованное целое число округлено на пол:
S c = 2-6 = 1/64
Q c = (S aQ a) / (S cS bQ b) = 128/3 ≈ 42.
Поэтому аппроксимированное реальное значение для c V c ≈ S cQ c = 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. Чтобы минимизировать потерю точности к допустимому уровню в вашем приложении, настройте схему кодирования в своих данных фиксированной точки.