Main Content

このページの内容は最新ではありません。最新版の英語を参照するには、ここをクリックします。

Stateflow での固定小数点データの演算

Simulink® モデルの Stateflow® チャートには、固定小数点データでの計算に使用する構文を定義するアクション言語プロパティがあります。

  • アクション言語は MATLAB®

  • アクション言語は C。

詳細については、アクション言語構文としての MATLAB と C の相違点を参照してください。

二項演算

次の表は、固定小数点オペランドに対するすべての二項演算の解釈を優先順位 (0 = 最高、9 = 最低) に従ってまとめています。二項演算は左結合であるため、どの式でも、優先度が同じ演算子は左から右の順序で評価されます。

演算

優先順位

アクション言語が MATLAB

アクション言語が C の場合

a ^ b

0

べき乗。2 の整数乗でない勾配または非ゼロのバイアスを使用して定義された固定小数点オペランドではサポートされていません。指数オペランドは、値が非負の整数である定数でなければなりません。

べき乗。この演算を有効にするには、[C 言語のビット演算が可能] チャート プロパティをオフにします。C 言語のビット演算が可能を参照してください。

a * b

1

乗算。2 の整数乗でない勾配または非ゼロのバイアスを使用して定義された固定小数点オペランドの場合は、ProductModeSpecifyPrecision に設定してチャートの fimath オブジェクトを指定します。乗算を参照してください。

乗算。非ゼロのバイアスを使用して定義された固定小数点オペランドではサポートされていません。乗算を参照してください。

a / b

1

除算。2 の整数乗でない勾配または非ゼロのバイアスを使用して定義された固定小数点オペランドではサポートされていません。除算を参照してください。

除算。非ゼロのバイアスを使用して定義された固定小数点オペランドではサポートされていません。除算を参照してください。

a + b

2

加算。2 の整数乗でない勾配または非ゼロのバイアスを使用して定義された固定小数点オペランドの場合は、SumModeSpecifyPrecision に設定してチャートの fimath オブジェクトを指定します。加算と減算を参照してください。

加算。加算と減算を参照してください。

a - b

2

減算。2 の整数乗でない勾配または非ゼロのバイアスを使用して定義された固定小数点オペランドの場合は、SumModeSpecifyPrecision に設定してチャートの fimath オブジェクトを指定します。加算と減算を参照してください。

減算。加算と減算を参照してください。

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) を使用します。固定小数点データの論理演算を参照してください。

論理 NOT。この演算を有効にするには、[C 言語のビット演算が可能] チャート プロパティをオフにします。固定小数点データの論理演算C 言語のビット演算が可能を参照してください。

!a

サポートなし。式 a == cast(0,"like",a) を使用します。固定小数点データの論理演算を参照してください。

論理 NOT。固定小数点データの論理演算を参照してください。

-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 の型にキャストされます。固定小数点演算の上位変換規則変換演算を参照してください。両方の型のバイアスが等しく、かつ勾配は等しいかいずれも 2 のべき乗である場合、シンプルな代入が最も効率的です。

一方で、a := b という形式の特殊な代入は、最初に a の型を b の値の結果タイプとして使用することにより、この動作をオーバーライドします。

  • b 内の定数は、オフライン変換を使用して a の型に変換されます。

  • b には、最大で 1 つの算術演算子 (+-* または /) を含めることができます。結果はオンライン変換を使用して特定されます。

  • b に算術演算や定数以外が含まれている場合、特殊な代入演算は、シンプルな代入演算 (=) と同様に動作します。

特殊な代入演算 := は、以下の場合に使用します。

メモ

特殊な代入演算 := を使用すると、生成されるコードの効率が、通常の固定小数点上位変換規則を使用して生成したコードより低くなる場合があります。

固定小数点の加算でのオーバーフローの回避

特殊な代入演算 := を使用すると、2 つの固定小数点数に対して算術演算を実行するときにオーバーフローを回避できます。たとえば、a = 212-1 = 4095 および b = 1 である場合に、和 a+b を計算するチャートについて考えます。

以下を仮定します。

  • 入力はいずれも、符号付き 16 ビットで小数部ビットが 3 の固定小数点数 (fixdt(1,16,3) 型)

  • 出力 c は、符号付き 32 ビットで小数部ビットが 3 の固定小数点数 (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) 型の値として、オーバーフローなしで安全に計算されます。

固定小数点除算での精度の向上

特殊な代入演算 := を使用すると、2 つの固定小数点数を乗算または除算するときに、より精度の高い結果が得られます。たとえば、a = 2 および b = 3 である場合に、比率 a/b を計算するチャートについて考えます。

以下を仮定します。

  • 入力 a は、小数部ビットが 4 の固定小数点数 (fixdt(1,16,4) 型)

  • 入力 b は、小数部ビットが 3 の固定小数点数 (fixdt(1,16,3) 型)

  • 出力 c は、符号付き 16 ビットで小数部ビットが 6 の固定小数点数 (fixdt(1,16,6) 型)

入力は、以下の勾配および量子化整数に対応します。

Sa = 2–4, Qa = 32

Sb = 2–3, Qb = 24.

シンプルな代入 c = a/b はまず、固定小数点上位変換規則に従って a/b の中間値を計算します。量子化整数は負方向に丸められます。

Sint = Sa/Sb = 2-4/2-3 = 2-1

Qint = Qa/Qb = 32/24 ≈ 1.

次に、符号付き 16 桁で小数部ビットが 6 の固定小数点数として、中間結果がキャストされます。

Sc = 2-6 = 1/64

Qc = SintQint/Sc = 2-1/2-6 = 25 = 32.

よって、c の近似実際値は Vc ≈ ScQc = 32/64 = 0.5 となります。この結果は、実際の値である 2/3 を十分に近似していません。

これに対して、特殊な代入 c := a/b は、a/b を直接、符号付き 16 桁で小数部ビットが 6 の固定小数点数として計算します。ここでも、量子化整数は負方向に丸められます。

Sc = 2-6 = 1/64

Qc = (SaQa)/(ScSbQb) = 128/3 ≈ 42.

よって、c の近似実際値は Vc ≈ ScQc = 42/64 = 0.6563 となります。この結果のほうが、実際の値である 2/3 を良く近似しています。

固定小数点演算の結果の比較

この例では、Stateflow チャートにおける固定小数点演算のさまざまな実装の相違点を説明します。モデルには、a = 19、b = 24 の場合の比率 a/b を計算する 3 つのチャートが含まれています。入力はいずれも符号付き 16 桁で小数部ビットが 1 の固定小数点数 (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) 型の固定小数点数として、次の 3 つの異なる方法で計算します。

  • 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 桁で小数部ビットが 1 の固定小数点数 c としてキャストされます。

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

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

このチャートからの出力値は次のようになります。

$$ \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 桁で小数部ビットが 1 の固定小数点数 c としてキャストされます。

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

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

このチャートからの出力値は次のようになります。

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

C をアクション言語として使用するチャート内での特殊な代入

モデル下部のチャートは、c := a/b という形式の特殊な代入を使用します。除算の値は、符号付き 16 桁で小数部ビットが 1 の固定小数点数として直接計算されます。量子化整数は負方向に丸められます。

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

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

よって、このチャートからの出力値は次のようになります。

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

この 3 つの結果では、浮動小数点の解である 19/24 = 0.7917 と比較して、精度が低下しています。アプリケーションで許容できるレベルになるように精度の低下を最小化するには、固定小数点データのエンコード スキームを調整します。

関連するトピック