Поддерживаемые операции для данных фиксированной точки

Stateflow® графики в Simulink® модели имеют свойство языка действия, которое задает синтаксис, которого вы используетесь для расчета с данными фиксированной точки:

  • MATLAB® как язык действия.

  • C как язык действия.

Для получения дополнительной информации смотрите Различия Между MATLAB и C как Синтаксис языка Действия.

Бинарные операции

Эта таблица суммирует интерпретацию всех бинарных операций на операндах фиксированной точки согласно их порядку очередности (0 = самый высокий, 9 = самый низкий). Бинарные операции левоассоциативны так, чтобы в любом выражении операторы с тем же приоритетом были оценены слева направо.

Операция

Приоритет

MATLAB как язык действия

C как язык действия

a ^ b

0

Степень. Не поддерживаемый для операндов фиксированной точки, заданных или при помощи наклона, который не является целочисленной степенью двойки или ненулевым смещением. Операнд экспоненты должен быть константой, значение которой является неотрицательным целым числом.

Степень. Включите эту операцию путем очистки Разрешения свойства диаграммы операций C-bit. Смотрите Включают операции C-bit.

a * b

1

Умножение. Для операндов фиксированной точки, заданных или при помощи наклона, который не является целочисленной степенью двойки или при помощи ненулевым смещением, задайте график fimath объект с ProductMode установите на SpecifyPrecision. Смотрите умножение.

Умножение. Не поддерживаемый для операндов фиксированной точки задан при помощи ненулевого смещения. Смотрите Умножение.

a / b

1

Деление. Не поддерживаемый для операндов фиксированной точки, заданных или при помощи наклона, который не является целочисленной степенью двойки или ненулевым смещением. Смотрите Деление.

Деление. Не поддерживаемый для операндов фиксированной точки задан при помощи ненулевого смещения. Смотрите Деление.

a + b

2

Сложение. Для операндов фиксированной точки, заданных или при помощи наклона, который не является целочисленной степенью двойки или при помощи ненулевым смещением, задайте график fimath объект с SumMode установите на SpecifyPrecision. Смотрите сложение и вычитание.

Сложение. Смотрите сложение и вычитание.

a - b

2

Вычитание. Для операндов фиксированной точки, заданных или при помощи наклона, который не является целочисленной степенью двойки или при помощи ненулевым смещением, задайте график fimath объект с SumMode установите на SpecifyPrecision. Смотрите сложение и вычитание.

Вычитание. Смотрите сложение и вычитание.

a > b

3

Сравнение, больше, чем. Смотрите Реляционные операции для Данных Фиксированной точки.

Сравнение, больше, чем. Не поддерживаемый для операндов фиксированной точки с несовпадающими смещениями. Смотрите Реляционные операции для Данных Фиксированной точки.

a < b

3

Сравнение, меньше, чем. Смотрите Реляционные операции для Данных Фиксированной точки.

Сравнение, меньше, чем. Не поддерживаемый для операндов фиксированной точки с несовпадающими смещениями. Смотрите Реляционные операции для Данных Фиксированной точки.

a >= b

3

Сравнение, больше, чем или равный. Смотрите Реляционные операции для Данных Фиксированной точки.

Сравнение, больше, чем или равный. Не поддерживаемый для операндов фиксированной точки с несовпадающими смещениями. Смотрите Реляционные операции для Данных Фиксированной точки.

a <= b

3

Сравнение, меньше чем или равное. Смотрите Реляционные операции для Данных Фиксированной точки.

Сравнение, меньше чем или равное. Не поддерживаемый для операндов фиксированной точки с несовпадающими смещениями. Смотрите Реляционные операции для Данных Фиксированной точки.

a == b

4

Сравнение, равное. Смотрите Реляционные операции для Данных Фиксированной точки.

Сравнение, равное. Не поддерживаемый для операндов фиксированной точки с несовпадающими смещениями. Смотрите Реляционные операции для Данных Фиксированной точки.

a ~= b

4

Сравнение, не равное. Смотрите Реляционные операции для Данных Фиксированной точки.

Сравнение, не равное. Не поддерживаемый для операндов фиксированной точки с несовпадающими смещениями. Смотрите Реляционные операции для Данных Фиксированной точки.

a != b

4

Не поддерживаемый. Используйте операцию a ~= b. Смотрите реляционные операции для данных фиксированной точки.

Сравнение, не равное. Не поддерживаемый для операндов фиксированной точки с несовпадающими смещениями. Смотрите Реляционные операции для Данных Фиксированной точки.

a <> b

4

Не поддерживаемый. Используйте операцию a ~= b. Смотрите реляционные операции для данных фиксированной точки.

Сравнение, не равное. Не поддерживаемый для операндов фиксированной точки с несовпадающими смещениями. Смотрите Реляционные операции для Данных Фиксированной точки.

a && b

8

Логический AND. Смотрите логические операции для данных фиксированной точки.

Логический AND. Смотрите логические операции для данных фиксированной точки.

a || b

9

Логический OR. Смотрите логические операции для данных фиксированной точки.

Логический OR. Смотрите логические операции для данных фиксированной точки.

Унарные операции и действия

Эта таблица суммирует интерпретацию всех унарных операций и действий с операндами фиксированной точки. Унарные операции:

  • Имейте более высокий приоритет, чем бинарные операторы.

  • Правоассоциативны так, чтобы в любом выражении они были оценены справа налево.

Операция

MATLAB как язык действия

C как язык действия

~a

Не поддерживаемый. Используйте выражение a == cast(0,'like',a). Смотрите логические операции для данных фиксированной точки.

Логический НЕТ. Включите эту операцию путем очистки Разрешения свойства диаграммы операций C-bit. Смотрите Логические операции для Данных Фиксированной точки и Включите операции C-bit.

!a

Не поддерживаемый. Используйте выражение a == cast(0,'like',a). Смотрите логические операции для данных фиксированной точки.

Логический НЕТ. Смотрите логические операции для данных фиксированной точки.

-a

Отрицательный. Смотрите унарный минус.

Отрицательный. Смотрите унарный минус.

a++

Не поддерживаемый. Используйте выражение a = a+1.

Шаг. Эквивалентный a = a+1.

a--

Не поддерживаемый. Используйте выражение a = a-1.

Декремент. Эквивалентный a = a-1.

Операции присвоения

Эта таблица суммирует интерпретацию операций присвоения на операндах фиксированной точки.

Операция

MATLAB как язык действия

C как язык действия

a = b

Простое присвоение.

Простое присвоение.

a := b

Не поддерживаемый. Чтобы заменить правила продвижения фиксированной точки, используйте явные операции броска типа. Смотрите Операции Броска Типа.

Специальное присвоение, которое заменяет правила продвижения фиксированной точки. Смотрите Продвижение Фиксированной точки Переопределения в Графиках C.

a += b

Не поддерживаемый. Используйте выражение a = a+b.

Эквивалентный a = a+b.

a -= b

Не поддерживаемый. Используйте выражение a = a-b.

Эквивалентный a = a-b.

a *= b

Не поддерживаемый. Используйте выражение a = a*b.

Эквивалентный a = a*b.

a /= b

Не поддерживаемый. Используйте выражение a = a/b.

Эквивалентный a = a/b.

Замените продвижение фиксированной точки в графиках 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 cS 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 cS cQ c = 42/64 = 0.6563. Этим результатом является лучшее приближение к фактическому значению 2/3.

Сравните результаты вычислений с фиксированной точкой

Этот пример показывает различие между различными реализациями вычислений с фиксированной точкой в диаграммах Stateflow. Модель содержит три графика, которые вычисляют отношение a/b где a = 19 и b = 24. Оба входных параметров подписываются 16-разрядные числа фиксированной точки с одним дробным битом (введите fixdt(1,16,1)). Они соответствуют этим наклонам и квантованным целым числам:

$$ S_\texttt{a} = 2^{-1}, Q_\texttt{a} = 38 $$

$$ S_\texttt{b} = 2^{-1}, Q_\texttt{b} = 48 $$

Модель вычисляет значение a/b как число с плавающей запятой типа fixdt(1,16,1) тремя различными способами:

  • Операция преобразования типа в графике, который использует MATLAB в качестве языка действия.

  • Простая операция присвоения в графике, который использует C в качестве языка действия.

  • Специальная операция присвоения в графике, который использует C в качестве языка действия.

Преобразование типа в графике, который использует MATLAB в качестве языка действия

График наверху модели вычисляет промежуточное значение для a/b. Квантованное целое число для промежуточного значения округлено до ближайшего целого числа:

$$ S_\texttt{int} = S_\texttt{a}/S_\texttt{b} = 1 $$

$$ Q_\texttt{int} = Q_\texttt{a}/Q_\texttt{b} = 38/48 \approx 1 .$$

Промежуточное значение затем снято как 16-разрядный номер фиксированной точки со знаком c с одним дробным битом:

$$ S_\texttt{c} = 2^{-1} $$

$$ Q_\texttt{c} = S_\texttt{int} \cdot Q_\texttt{int} /S_\texttt{c} = 2&#xA;.$$

Выходное значение из этого графика

$$ \tilde{V}_\texttt{c} = S_\texttt{c} \cdot Q_\texttt{c} = 1 .$$

Простое присвоение в графике, который использует C в качестве языка действия

Средний график также вычисляет промежуточное значение для a/b. В этом случае квантованное целое число для промежуточного значения округлено на пол:

$$ S_\texttt{int} = S_\texttt{a}/S_\texttt{b} = 1 $$

$$ Q_\texttt{int} = Q_\texttt{a}/Q_\texttt{b} = 38/48 \approx 0 .$$

Промежуточное значение затем снято как 16-разрядный номер фиксированной точки со знаком c с одним дробным битом:

$$ S_\texttt{c} = 2^{-1} $$

$$ Q_\texttt{c} = S_\texttt{int} \cdot Q_\texttt{int} /S_\texttt{c} = 0&#xA;.$$

Выходное значение из этого графика

$$ \tilde{V}_\texttt{c} = S_\texttt{c} \cdot Q_\texttt{c} = 0 .$$

Специальное присвоение в графике, который использует C в качестве языка действия

График в нижней части модели использует специальное присвоение формы c := a/b. Значение деления вычисляется непосредственно как 16-разрядный номер фиксированной точки со знаком с одним дробным битом. Квантованное целое число округлено на пол:

$$ S_\texttt{c} = 2^{-1} $$

$$ Q_\texttt{c} = (S_\texttt{a} \cdot Q_\texttt{a}) / (S_\texttt{c} \cdot&#xA;S_\texttt{b} \cdot Q_\texttt{b}) = 19/12 \approx 1 .$$

Поэтому выходное значение из этого графика

$$\tilde{V}_\texttt{c} = S_\texttt{c} \cdot Q_\texttt{c} = 0.5 .$$

Три результата показывают потерю точности по сравнению с ответом с плавающей точкой 19/24 = 0.7917. Чтобы минимизировать потерю точности к допустимому уровню в вашем приложении, настройте схему кодирования в своих данных фиксированной точки.

Похожие темы