このページの内容は最新ではありません。最新版の英語を参照するには、ここをクリックします。
Stateflow チャートの固定小数点データ
固定小数点では、整数と整数演算を使用して実数の近似値を求めます。実数を含む計算を実行する場合に効率的な手段であり、基本システム ハードウェアで浮動小数点のサポートを必要としません。
固定小数点数
固定小数点数は、次のエンコード スキームを使用して実数を表します。
V ≈ Vapprox = SQ + B.
V は、固定小数点で近似する正確な実際値です。
Vapprox は、固定小数点表現から求められる近似実際値です。
Q は、固定小数点数をエンコードする整数です。この値は "量子化整数" と呼ばれます。
S は、固定小数点表現の精度を決定する係数です。この値は "勾配" と呼ばれます。
B は、"バイアス" と呼ばれる追加的な補正です。
量子化整数 Q は、固定小数点表現の中で値が変化する唯一の部分です。生成されたコードの中で、数量 S と B は定数であり、数値リテラルまたは式としてのみ出現します。固定小数点数が変化する場合、その量子化整数である Q は変化しますが、S および B は変わりません。
実際値 V に対応する量子化整数 Q を特定するには、数量 (V – B)/S を整数に丸めます。たとえば、勾配が S = 0.5 でバイアスが B = 0.1 の固定小数点型で数値 V = 15.345 を表現するには、次の量子化整数を使用します。
Q = round((V – B)/S) = round((15.345 – 0.1)/0.5) = round(30.49) = 30.
ここでは Q が整数に丸められたため、数値 15.345 を表現する際の精度がある程度低下します。Q が実際に表現する数値は次のとおりです。
Vapprox = SQ + B = 0.5 ⨉ 30 + 0.1 = 15.1.
固定小数点を使用して整数を含む実数を表すと、ある程度の精度の低下が伴います。ただし、S と B を適切に選択することにより、この低下を許容できるレベルに最小化できます。たとえば、S = 0.25 と B = 0.1 を使用するようにコーディング スキームを変更することにより、数値 V = 15.345 をより高い精度で次のように表現できます。
Q = round((V – B)/S) = round((15.345 – 0.1)/0.25) = round(60.98) = 61
Vapprox = SQ + B = 0.25 ⨉ 61 + 0.1 = 15.35.
Vapprox と V の差は、勾配 S より常に小さくなります。
固定小数点データの指定
モデル エクスプローラーでは、データ型アシスタントを使用することにより、データ オブジェクトの固定小数点エンコードを指定できます。固定小数点データのプロパティを参照してください。[モード] フィールドを [固定小数点]
に設定して、以下のプロパティを指定します。
符号属性:
[符号付き]
または[符号なし]
を選択します。語長: 量子化された整数 Q をもつ語のビット サイズを指定します。
スケーリング:
[2 進小数点]
または[勾配とバイアス]
を選択します。[2 進小数点]
を選択した場合は、データ型アシスタントに、2 進小数点の位置を指定する [小数部の長さ] フィールドが表示されます。[小数部の長さ] として n を選択すると、勾配が S = 2-n でバイアスが B = 0 の固定小数点エンコードが定義されます。[勾配とバイアス]
を選択した場合は、データ型アシスタントに、固定小数点エンコード スキームの [勾配] S と [バイアス] B の入力フィールドが表示されます。
あるいは、関数 fixdt
(Simulink) を使用して、固定小数点データ オブジェクトのエンコードを直接指定することもできます。[プロパティ インスペクター] またはモデル エクスプローラーの [型] フィールドに、次のいずれかの形式で式を入力します。
fixdt(Signed, WordLength, FractionLength)
fixdt(Signed, WordLength, Slope, Bias)
ヒント:
エンコード スキームによっては、特に乗算演算と除算演算で計算量が多くなることがあります。2 の整数乗である勾配とゼロ バイアスを選択すると、こうした計算量の多い命令は回避されます。2 進小数点スケーリングを使用することを推奨します。
変換演算
Stateflow® チャートでは、データ初期化時やアプリケーションのキャスト演算の一環として、実数が固定小数点数に変換されます。これらの変換では、実数入力から量子化整数 Q が計算されます。変換の種類は、チャートのアクション言語によって異なります。
MATLAB をアクション言語として使用するチャート内の変換
MATLAB® をアクション言語として使用するチャートでは、チャートの固定小数点プロパティを使用して、すべての変換の方法を定義します。固定小数点プロパティを参照してください。
たとえば、[MATLAB チャート ] の fimath
プロパティを [MATLAB と同じ]
に設定すると、チャートでは、結果の量子化整数が、最も近い整数値に丸められます。
C をアクション言語として使用するチャート内の変換
C をアクション言語として使用するチャートでは、固定小数点データを変換する方法として次の 2 つを採用しています。
オフライン変換では、コード生成中にデータを初期化します。オフライン変換は、精度を最大化するように設計されています。この変換は、結果の量子化整数を最も近い整数の値に丸めます。オフライン変換は、Stateflow 階層内および MATLAB ワークスペースから、データ (変数および定数) を初期化するために実行されます。
オンライン変換では、実行時にキャスト演算を実行します。オンライン変換は、計算の効率を最大化するように設計されています。オフライン変換と比較して、速度と効率は勝りますが、精度は劣ります。Q を最も近い整数に丸める代わりに、オンライン変換は負方向に丸めます (C コンパイラによっては 0 に丸められる可能性があるので、除算は例外)。
例として、以下の表では、勾配を S = 2-4、バイアスを B = 0 として定義された実数と固定小数点数のオフライン変換とオンライン変換の違いを説明しています。各実際値 V に関して、チャートでは、(V-B)/S を最も近い整数 (オフライン変換の場合) または負方向 (オンライン変換の場合) に丸めることにより、量子化整数 Q を計算します。各変換に関して、Vapprox = QS + B は、Q から求められる近似実際値です。
実際値 | オフライン変換 | オンライン変換 | |||
---|---|---|---|---|---|
V | (V-B)/S | Q | Vapprox | Q | Vapprox |
15.345 | 245.52 | 246 | 15.375 | 245 | 15.3125 |
3.45 | 55.2 | 55 | 3.4375 | 55 | 3.4375 |
1.0375 | 16.6 | 17 | 1.0625 | 16 | 1 |
2.06 | 32.96 | 33 | 2.0625 | 32 | 2 |
固定小数点のコンテキスト依存定数
C をアクション言語として使用するチャートでは、固定小数点のコンテキスト依存定数を使用することにより、明示的な型キャストを回避できます。これらの定数は、その発生時のコンテキストに基づいて自身の型を推測します。通常の数値のように記述され、C
または c
の接尾辞が付けられます。たとえば、4.3C
と 123.4c
は有効な固定小数点コンテキスト依存定数であり、アクション ステートメントで使用できます。
固定小数点のコンテキスト依存定数は、どのようなデータ型 (整数や浮動小数点データなど) を含む式にも使用できますが、主な用途は固定小数点数での使用です。コンテキスト依存定数を解釈するアルゴリズムは、オーバーフローを伴わずに最大の精度を実現する型を計算します。このアルゴリズムは以下に依存します。
式内の演算
コンテキスト内の他のデータ型
定数値
固定小数点のコンテキスト依存定数は、以下のルールに従って自身の型を推定します。
キャスト演算では、定数はキャスト先の型をもちます。
a = b
という形式のシンプルな代入演算では、次のようになります。b
は、コンテキスト依存定数である場合、a
と同じ型をもちます。b
が加算演算または減算演算である場合、定数は他のオペランドと同じ型をもちます。b
が固定小数点オペランドをもつ乗算演算または除算演算である場合、定数は、関数fixptbestexp
(Simulink) によって判別される、固定小数点の結果の精度が最大となる型をもちます。b
がdouble
型またはsingle
型の固定小数点オペランドをもつ乗算演算または除算演算である場合、定数は浮動小数点オペランドと同じ型をもちます。
a := b
という形式の特殊な代入演算では、次のようになります。b
は、コンテキスト依存定数である場合、a
と同じ型をもちます。b
がdouble
型またはsingle
型の浮動小数点オペランドをもつ算術演算である場合、またはa
が浮動小数点データ オブジェクトである場合、定数は浮動小数点数と同じ型をもちます。b
が固定小数点オペランドをもつ加算演算または減算演算であり、a
が固定小数点データ オブジェクトである場合、定数はa
と同じ型をもちます。b
が固定小数点オペランドをもつ乗算演算または除算演算であり、a
が固定小数点データ オブジェクトである場合、定数は、固定小数点の結果の精度が最大となる型をもちます。
関数呼び出しの引数としては、定数は仮引数と同じ型をもちます。
二項演算の両方のオペランドとして、または代入演算の左端のオペランドとしては、コンテキスト依存定数を使用できません。
固定小数点データを使用する場合のヒント
アプリケーションの開発およびテストでは、倍精度または単精度の浮動小数点数を使用します。倍精度または単精度の浮動小数点数を使用しても、計算の範囲や精度は制限されません。アプリケーションが設計どおりに動作した時点で、倍精度データの代わりに固定小数点データの使用を開始できます。
[コンフィギュレーション パラメーター] ダイアログ ボックスを開き、[ハードウェア実行] ペインで、シミュレーション環境の整数ワード サイズを目的のターゲット環境の整数サイズに設定します。Stateflow で生成されたコードは、この整数サイズを使用して、固定小数点演算の結果の型を選択します。[ハードウェア実行] ペイン (Simulink)を参照してください。
モデルをシミュレートするときは、オーバーフロー検出を使用して、固定小数点演算の結果が固定小数点型の数値容量を超えたときに警告が出るようにします。[コンフィギュレーション パラメーター] ダイアログ ボックスを開き、[診断] 、 [データ有効性] ペインで、[オーバーフロー時にラップ] パラメーターと [オーバーフローで飽和] パラメーターを
[エラー]
または[警告]
に設定します。固定小数点データでオーバーフロー エラーが発生した場合は、次の方法でデータの範囲を拡大します。オーバーフローしている固定小数点データの [語長] の値を大きくする。たとえば、固定小数点データのエンコードに使用するビット数を 16 から 32 に変更します。この操作により、Q の基本整数型が
int16
からint32
に変わります。[小数部の長さ] の値を小さくする (
[2 進小数点]
スケーリングを使用している場合) か、[勾配] の値を大きくする ([勾配とバイアス]
スケーリングを使用している場合)。たとえば、[小数部の長さ] の値を 4 から 1 に減らします (または、等価の操作として、[勾配] の値を S = 2-4 = 0.0625 から S = 2-1 = 0.5 に増やします)。この操作により、固定小数点データの範囲は拡大しますが、精度は低下します。
詳細については、データ範囲違反の検出を参照してください。
固定小数点データの精度不足が原因でモデルの動作に問題が発生した場合は、[小数部の長さ] の値を大きくする (
[2 進小数点]
スケーリングを使用している場合) か、[勾配] の値を小さくする ([勾配とバイアス]
スケーリングを使用している場合) ことにより、データの精度を上げます。たとえば、[小数部の長さ] の値を 2 から 3 に増やします (または、等価の操作として、[勾配] の値を S = 2-2 = 0.25 から S = 2-3 = 0.125 に減らします)。この操作により、固定小数点データの精度は上がりますが、使用可能な範囲は縮小します。C をアクション言語として使用するチャートでは、特殊な代入演算
:=
とコンテキスト依存定数を使用すると、可能な限り高い精度を維持できます。C チャートでの固定小数点上位変換のオーバーライドと固定小数点のコンテキスト依存定数を参照してください。メモ
固定小数点型でコンテキスト依存定数を使用しない場合は、非整数数値定数 (小数点を含む定数) によって固定小数点演算が実行され、演算結果は浮動小数点になります。
固定小数点データの自動スケーリング
自動スケーリング ツールは、Stateflow 固定小数点データの自動スケーリングを実行します。自動スケーリングを回避するには、固定小数点データ オブジェクトの [固定小数点ツールによる変更に対してデータ型の設定をロックする] オプションを選択します。データ型を固定小数点ツールに対しロックするを参照してください。固定小数点データをオートスケーリングする方法については、範囲の収集手法の選択 (Fixed-Point Designer)を参照してください。
Simulink モデルとの固定小数点データの共有
固定小数点データを Simulink® モデルと共有するには、次を行います。
同じプロパティ値を使用して、Stateflow チャート内と Simulink モデル内のデータを指定します。Simulink モデルからの入力データを共有する方法の例は、バンバン温度制御システムのモデル化を参照してください。
一部の Simulink ブロックでは、入出力データの型を直接指定できます。たとえば、Constant ブロックの固定小数点データ型は、関数
fixdt
(Simulink) を使用することによって [出力データ型] フィールドで直接指定できます。Stateflow チャートで、データを [入力] または [出力] として定義し、Simulink モデルの送信ブロックまたは受信ブロックを指定すると、チャート データから型が継承されます。多くのブロックでは、起動ブロックからの継承、または次のブロックからの逆伝播によって、データ型を設定できます。Simulink ブロックのデータ型は、接続先の Stateflow 端子のデータ型と一致するように設定できます。
たとえば、Constant ブロックを、Stateflow [Simulink へ入力] 端子から型を継承するように設定することができます。[出力データ型] ブロック パラメーターを
[逆伝播による継承]
に設定します。
Stateflow での固定小数点データの実装
Stateflow チャートは、S、B に指定する値、および Q の基本整数型から、固定小数点データ型を定義します。
固定小数点データごとに、チャートは生成されたコード内で Q の整数変数を定義します。固定小数点数では、この整数部分でのみ値が変化します。Q に使用可能な基本データ型は、符号なしの整数型の
uint8
、uint16
、およびuint32
と、符号付き整数型のint8
、int16
、およびint32
です。固定小数点数に勾配 S = 1 とバイアス B = 0 が含まれる場合、固定小数点数は量子化整数 Q と等価であり、基本整数型と同じ動作を示します。勾配 S は、係数 F with 1 ≤ F < 2 と、2 の整数乗 (指数 E) に因数分解されます。
S = F ⨉ 2E.
小数部の勾配 F が 1 より大きい場合は、固定小数点数に変換されます。F > 1 のエンコード スキームは、特に乗算演算と除算演算で計算量が多くなる可能性があります。F = 1 と設定すると、このような計算量の多い命令は回避されます。この設定では、2 のべき乗によるスケーリングはビット シフトとして実装され、乗算命令より効率が高くなります。このため、F = 1 および B = 0 という設定の 2 進小数点のみのスケーリングを使用することが推奨されます。
固定小数点型の演算は、固定小数点データの算術演算 の説明に従って、量子化整数の解で実装されます。効率的なコードを生成するために、固定小数点の上位変換規則では、勾配とバイアスの値を選択することで、解に含まれる複雑な項を無効にします。固定小数点演算の上位変換規則を参照してください。
参考
fixdt
(Simulink) | fixptbestexp
(Simulink)