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