Stateflow チャートでの固定小数点演算
固定小数点では、整数と整数演算を使用して実数の近似値を求めます。基本システム ハードウェアで浮動小数点がサポートされていない場合でも、実数を含む計算の実行が可能になります。詳細については、Stateflow チャートの固定小数点データを参照してください。
固定小数点データの算術演算
固定小数点オペランド間の二項算術演算の一般方程式は次のとおりです。
c = a <op> b
a と b は固定小数点数であり、<op> は、加算、減算、乗算、除算のいずれかを示します。演算の結果は、次の形式の固定小数点数 c です。
Vc ≈ ScQc + Bc.
c の固定小数点型は、傾き Sc、バイアス Bc、および量子化整数 Qc を格納するために使用されるビット数を決定します。各算術演算に関して、次の表に、量子化整数 Qc の値を、オペランド (a および b) の値と c の固定小数点型の観点から示します。
| 演算 | 傾きとバイアスのスケーリング | 2 進小数点スケーリング | |
|---|---|---|---|
加算 | c = a+b | Qc = round((Sa/Sc)Qa + (Sb/Sc)Qb + (Ba + Bb – Bc)/Sc) | Qc = round((Sa/Sc)Qa + (Sb/Sc)Qb) |
減算 | c = a-b | Qc = round((Sa/Sc)Qa – (Sb/Sc)Qb – (Ba – Bb – Bc)/Sc) | Qc = round((Sa/Sc)Qa – (Sb/Sc)Qb) |
乗算 | c = a*b | Qc = round((SaSb/Sc)QaQb + (BaSb/Sc)Qa + (BbSa/Sc)Qb + (BaBb – Bc)/Sc) | Qc = round((SaSb/Sc)QaQb) |
除算 | c = a/b | Qc = round((SaQa + Ba)/(Sc(SbQb + Bb)) – (Bc/Sc)) | Qc = round((Sa/(SbSc))Qa/Qb) |
これらの式を簡略化して計算量の多い演算を回避するには、2 進小数点スケーリングを使用してすべての固定小数点データをエンコードします。この設定では、傾きは 2 の整数乗で、バイアスはゼロです。この場合、すべての固定小数点演算が、整数演算および量子化整数に対するビット シフトで構成されます。
メモ
算術演算の結果は、量子化整数 Qc の値を計算する丸め方法によって異なります。詳細については、変換演算を参照してください。
固定小数点データの関係演算
関係演算を使用して固定小数点データを比較することができます。型が異なる固定小数点値を比較すると、予期しない結果が返される可能性があります。これは、比較用に各オペランドが共通の型に変換されるためです。変換時の丸め誤差やオーバーフロー エラーが原因で、等しいと想定される値が固定小数点数としては等しくなくなる場合があります。
たとえば、a と b が、次の 2 つの異なる固定小数点エンコード スキームで実際値 V = 2.2 を表すと仮定します。
aは、傾きが Sa= 0.3 で、バイアスが Ba= 0.1 の固定小数点数であり、aの量子化整数は次のとおりです。Q
a= (V – Ba)/Sa= (2.2 – 0.1)/0.3 = 7.bは、傾きが Sb= 0.7 で、バイアスが Bb= 0.1 の固定小数点数であり、bの量子化整数は次のとおりです。Q
b= (V – Bb)/Sb= (2.2 – 0.1)/0.7 = 3.
これらの値を比較するために、チャートはまずこれらを傾きが Scomp = 1.06811 · 10–5 ≈ Sa/28087 ≈ Sb · 2–16 でバイアスが Bcomp = 0.1 の一般的な固定小数点数型に変換します (この場合、傾き Scomp は、Sa/Sb = 0.3/0.7 ≈ 28087 · 2–16 の近似値から得られます)。この一般的なエンコード スキームでは、a と b は次の量子化整数に対応します。
Qa' = SaQa/Scomp = Qa(Sa/Scomp) ≈ 7 ⨉ 28087 = 196609
Qb' = SbQb/Scomp = Qb(Sb/Scomp) ≈ 3 ⨉ 216 = 196608.
変換後の量子化整数は異なります。a と b は同じ実際値を表しますが、固定小数点数としては等しくありません。
メモ
C をアクション言語として使用するチャートでは、バイアスが一致していない固定小数点オペランドの比較はサポートされていません。
固定小数点データの論理演算
論理演算では、固定小数点オペランド a は、a の固定小数点型におけるゼロの実際値に対応する場合は false として解釈されます。それ以外の場合、a は true として解釈されます。
MATLAB® をアクション言語として使用するチャートでは、論理演算で
aを使用することは、式a ~= cast(0,"like",a)と等価です。C をアクション言語として使用するチャートでは、論理演算で
aを使用することは、式a != 0cと等価です (0cは固定小数点のコンテキスト依存定数)。固定小数点のコンテキスト依存定数を参照してください。
たとえば、a は傾きが Sa = 0.25 でバイアスが Ba = 5.1 の固定小数点数であると仮定します。論理演算で a を使用することは、量子化整数 Qa が次の条件を満たすかどうかのテストと等価です。
Qa = round((0 – Ba)/Sa) = round(–5.1 / 0.25) = round(–20.4) = –20.
したがって、実際の近似が次のとおりである場合、a は false と等価です。
Va ≈ SaQa + Ba = 0.25 ⨉ ( –20) + 5.1 = 0.1.
固定小数点演算の上位変換規則
固定小数点数の演算の結果に使用される数値型を選択するための規則を、"固定小数点上位変換規則" と呼びます。この規則は、計算の効率性と有用性を維持する上で役立ちます。
固定小数点上位変換規則は、傾き Sc、バイアス Bc、および量子化整数 Qc の格納に使用するビット数 wc を選択することにより、演算 c = a の結果の型を決定します。これらのパラメーターは、固定小数点型のオペランド <op> b a および b、実行する演算 <op>、およびチャートのアクション言語プロパティに依存します。
MATLAB をアクション言語として使用するチャートでは、チャートの固定小数点プロパティを使用して固定小数点上位変換規則を制御します。
[MATLAB チャート] の
fimathプロパティを[MATLAB と同じ]に設定した場合、算術演算は、MATLAB の既定の固定小数点上位変換規則に従います。固定小数点演算の実行 (Fixed-Point Designer)を参照してください。SumModeとProductModeをSpecifyPrecisionに設定してチャートのfimathオブジェクトを指定する場合は、すべての和と積の語長、傾き、バイアスを明示的に定義できます。fimath オブジェクト プロパティ (Fixed-Point Designer)を参照してください。
C をアクション言語として使用するチャートでは、固定小数点上位変換規則が結果の中間値の型を決定します。その後、この中間値は
cに指定する型にキャストされます。すべての算術演算で、量子化整数の格納に使用する既定のビット数
wcは、次の間で大きいほうの値となります。オペランドの型の最大のビット数 (
waおよびwb)ターゲット マシンの整数ワード サイズのビット数 (
wint)
wintの値を指定するには、[コンフィギュレーション パラメーター] ダイアログ ボックスを開き、[ハードウェア実行] ペインで [デバイス ベンダー] パラメーターを[Custom Processor]、[int] パラメーターをターゲットの整数ワード サイズに設定します。詳細については、[ハードウェア実行] ペイン (Simulink)を参照してください。c := aという形式の特殊な代入演算を使用することにより、オーバーフローを回避して浮動小数点演算の精度を上げることができます。特殊な代入演算は、固定小数点上位変換規則には従いません。代わりに、チャートは<op>bcに指定した型を使用して演算の結果を判定します。C チャートでの固定小数点上位変換のオーバーライドを参照してください。
加算と減算
既定では、MATLAB をアクション言語として使用するチャートでは、2 進小数点スケーリングを使用して定義された固定小数点データでのみ加算と減算をサポートします。どちらかのオペランドが符号付き固定小数点数である場合は、結果も符号付きとなります。語長の選択は、各オペランドの整数部および小数部と、起こりうるキャリー ビットに対応します。結果の小数部の長さは、最も精度の高いオペランドの小数部の長さと等しくなります。2 の整数乗でない傾きまたは非ゼロのバイアスを使用して定義された固定小数点データで加算と減算を実行するには、SumMode を SpecifyPrecision に設定してチャートの fimath オブジェクトを指定します。
C をアクション言語として使用するチャートは、すべての固定小数点データ型のオペランドの加算と減算をサポートします。両方のオペランドが符号付きの場合のみ、結果は符号付きの固定小数点数となります。符号付きオペランドと符号なしオペランドが混在すると、予期しない結果が返される可能性があるため、推奨されません。結果の傾きは、最も精度の低いオペランドの傾きと等しくなります。計算を簡素化して、効率的なコードを生成するために、2 つの入力のバイアスが加算演算では加算され、減算演算では減算されます。
a | b | アクション言語が MATLAB | アクション言語が C の場合 | |
|---|---|---|---|---|
| 符号 | sa | sb | sc = sa||sb | sc = sa && sb |
| 語長 | wa | wb | wc = max(wa – fa, wb – fb) + max(fa, fb) + 1 | wc = max(wa, wb, wint) |
| 小数部の長さ | fa | fb | fc = max(fa, fb) | fc = min(fa, fb) |
| 傾き | Sa (2 進小数点スケーリングを使用する場合は 2-fa) | Sb (2 進小数点スケーリングを使用する場合は 2-fb) | Sc = min(Sa, Sb) | Sc = max(Sa, Sb) |
| バイアス | Ba (2 進小数点スケーリングを使用する場合は 0) | Bb (2 進小数点スケーリングを使用する場合は 0) | Bc = 0 | 加算の場合は Bc = Ba + Bb、減算の場合は Bc = Ba – Bb |
乗算
既定では、MATLAB をアクション言語として使用するチャートは、2 進小数点スケーリングを使用して定義された固定小数点データでのみ乗算をサポートします。どちらかのオペランドが符号付き固定小数点数である場合は、結果も符号付きとなります。完全精度の積には、オペランドの語長の合計と同じ語長が必要です。積の小数部の長さは、オペランドの小数部の長さの合計です。2 の整数乗でない傾きまたは非ゼロのバイアスを使用して定義された固定小数点データで乗算を実行するには、ProductMode を SpecifyPrecision に設定してチャートの fimath オブジェクトを指定します。
C をアクション言語として使用するチャートは、非ゼロのバイアスによって定義された固定小数点データのオペランドでのみ乗算をサポートします。両方のオペランドが符号付きの場合のみ、結果は符号付きの固定小数点数となります。符号付きオペランドと符号なしオペランドが混在すると、予期しない結果が返される可能性があるため、推奨されません。積の傾きは、オペランドの傾きの積です。
a | b | アクション言語が MATLAB | アクション言語が C の場合 | |
|---|---|---|---|---|
| 符号 | sa | sb | sc = sa||sb | sc = sa && sb |
| 語長 | wa | wb | wc = wa + wb | wc = max(wa, wb, wint) |
| 小数部の長さ | fa | fb | fc = fa + fb | fc = fa + fb |
| 傾き | Sa (2 進小数点スケーリングを使用する場合は 2-fa) | Sb (2 進小数点スケーリングを使用する場合は 2-fb) | Sc = SaSb | Sc = SaSb |
| バイアス | Ba = 0 | Bb = 0 | Bc = 0 | Bc = 0 |
除算
MATLAB をアクション言語として使用するチャートは、2 進小数点スケーリングを使用して定義された固定小数点データでのみ除算をサポートします。どちらかのオペランドが符号付き固定小数点数である場合は、結果も符号付きとなります。完全精度の商には、オペランドの最大ビット数と同じ語長が必要です。商の小数部の長さは、オペランドの小数部の長さの差です。
C をアクション言語として使用するチャートは、非ゼロのバイアスによって定義された固定小数点データ オペランドの除算をサポートします。両方のオペランドが符号付きの場合のみ、結果は符号付きの固定小数点数となります。符号付きオペランドと符号なしオペランドが混在すると、予期しない結果が返される可能性があるため、推奨されません。商の傾きは、オペランドの傾きの商です。
a | b | アクション言語が MATLAB | アクション言語が C の場合 | |
|---|---|---|---|---|
| 符号 | sa | sb | sc = sa||sb | sc = sa && sb |
| 語長 | wa | wb | wc = max(wa, wb) | wc = max(wa, wb, wint) |
| 小数部の長さ | fa | fb | fc = fa – fb | fc = fa – fb |
| 傾き | Sa (2 進小数点スケーリングを使用する場合は 2-fa) | Sb (2 進小数点スケーリングを使用する場合は 2-fb) | Sc = Sa/Sb | Sc = Sa/Sb |
| バイアス | Ba = 0 | Bb = 0 | Bc = 0 | Bc = 0 |
単項マイナス
結果の型の上位変換が必要な単項演算は、単項マイナス演算 c = -a のみです。符号なし固定小数点数の負を取ると、予期しない結果が返される可能性があるため、推奨されません。結果のワード サイズは、チャートのアクション言語プロパティによって異なります。結果の傾きは、オペランドの傾きと等しくなります。結果の型のバイアスは、オペランドのバイアスの負です。
a | アクション言語が MATLAB | アクション言語が C の場合 | |
|---|---|---|---|
| 符号 | sa | sc = sa | sc = sa |
| 語長 | wa | wc = wa | wc = max(wa, wint) |
| 小数部の長さ | fa | fc = fa | fc = fa |
| 傾き | Sa (2 進小数点スケーリングを使用する場合は 2-fa) | Sc = Sa | Sc = Sa |
| バイアス | Ba (2 進小数点スケーリングを使用する場合は 0) | Bc = –Ba | Bc = –Ba |
混在する数値型を使った算術
次の表は、固定小数点数と別の数値型のオペランドとの間の二項演算の固定小数点上位変換規則をまとめたものです。
| 2 番目のオペランドの数値型 | アクション言語が MATLAB | アクション言語が C の場合 |
|---|---|---|
浮動小数点数:
| 演算を実行する前に、チャートは浮動小数点オペランドを固定小数点数にキャストします。キャストに使用する型は、演算によって異なります。
演算の結果は固定小数点数となります。 | 演算を実行する前に、チャートは固定小数点オペランドを浮動小数点数にキャストします。キャスト演算では、浮動小数点オペランドと同じ型 ( |
整数:
| 整数オペランドは、傾きが S = 1 でバイアスが B = 0 の、語長と符号属性が同じ固定小数点数として扱われます。演算の結果は固定小数点数となります。 | 整数オペランドは、傾きが S = 1 でバイアスが B = 0 の、語長と符号属性が同じ固定小数点数として扱われます。演算の結果は固定小数点数となります。 |