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 c
Q c
= 32/64 = 0.5. Этим результатом не является хорошее приближение фактического значения 2/3.
В отличие от этого специальное присвоение c := a/b
вычисляет a/b
непосредственно как 16-разрядный номер фиксированной точки со знаком с шестью дробными битами. Снова, квантованное целое число округлено на пол:
S c
= 2-6 = 1/64
Q c
= (S a
Q a
) / (S c
S b
Q b
) = 128/3 ≈ 42.
Поэтому аппроксимированное реальное значение для c
V c
≈ S c
Q 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. Чтобы минимизировать потерю точности к допустимому уровню в вашем приложении, настройте схему кодирования в своих данных фиксированной точки.