Main Content

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

Stateflow チャートでの固定小数点演算

固定小数点では、整数と整数演算を使用して実数の近似値を求めます。基本システム ハードウェアで浮動小数点がサポートされていない場合でも、実数を含む計算の実行が可能になります。詳細については、Stateflow チャートの固定小数点データを参照してください。

固定小数点データの算術演算

固定小数点オペランド間の二項算術演算の一般方程式は次のとおりです。

c = a <op> b
ab は固定小数点数であり、<op> は、加算、減算、乗算、除算のいずれかを示します。演算の結果は、次の形式の固定小数点数 c です。

Vc ≈ ScQc + Bc.

c の固定小数点型は、勾配 Sc、バイアス Bc、および量子化整数 Qc を格納するために使用されるビット数を決定します。各算術演算に関して、次の表に、量子化整数 Qc の値を、オペランド (a および b) の値と c の固定小数点型の観点から示します。

演算勾配とバイアスのスケーリング2 進小数点スケーリング

加算

c = a+bQc = round((Sa/Sc)Qa + (Sb/Sc)Qb + (Ba + Bb – Bc)/Sc)Qc = round((Sa/Sc)Qa + (Sb/Sc)Qb)

減算

c = a-bQc = round((Sa/Sc)Qa – (Sb/Sc)Qb – (Ba – Bb – Bc)/Sc)Qc = round((Sa/Sc)Qa – (Sb/Sc)Qb)

乗算

c = a*bQc = round((SaSb/Sc)QaQb + (BaSb/Sc)Qa + (BbSa/Sc)Qb + (BaBb – Bc)/Sc)Qc = round((SaSb/Sc)QaQb)

除算

c = a/bQc = round((SaQa + Ba)/(Sc(SbQb + Bb)) – (Bc/Sc))Qc = round((Sa/(SbSc))Qa/Qb)

これらの式を簡略化して計算量の多い演算を回避するには、2 進小数点スケーリングを使用してすべての固定小数点データをエンコードします。この設定では、勾配は 2 の整数乗で、バイアスはゼロです。この場合、すべての固定小数点演算が、整数演算および量子化整数に対するビット シフトで構成されます。

メモ

算術演算の結果は、量子化整数 Qc の値を計算する丸め方法によって異なります。詳細については、変換演算を参照してください。

固定小数点データの関係演算

関係演算を使用して固定小数点データを比較することができます。型が異なる固定小数点値を比較すると、予期しない結果が返される可能性があります。これは、比較用に各オペランドが共通の型に変換されるためです。変換時の丸め誤差やオーバーフロー エラーが原因で、等しいと想定される値が固定小数点数としては等しくなくなる場合があります。

たとえば、ab が、次の 2 つの異なる固定小数点エンコード スキームで実際値 V = 2.2 を表すと仮定します。

  • a は、勾配が Sa = 0.3 で、バイアスが Ba = 0.1 の固定小数点数であり、a の量子化整数は次のとおりです。

    Qa = (V – Ba)/Sa = (2.2 – 0.1)/0.3 = 7.

  • b は、勾配が Sb = 0.7 で、バイアスが Bb = 0.1 の固定小数点数であり、b の量子化整数は次のとおりです。

    Qb = (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 の近似値から得られます)。この一般的なエンコード スキームでは、ab は次の量子化整数に対応します。

Qa' = SaQa/Scomp = Qa(Sa/Scomp) ≈ 7 ⨉ 28087 = 196609

Qb' = SbQb/Scomp = Qb(Sb/Scomp) ≈ 3 ⨉ 216 = 196608.

変換後の量子化整数は異なります。ab は同じ実際値を表しますが、固定小数点数としては等しくありません。

メモ

C をアクション言語として使用するチャートでは、バイアスが一致していない固定小数点オペランドの比較はサポートされていません。

固定小数点データの論理演算

論理演算では、固定小数点オペランド a は、a の固定小数点型におけるゼロの実際値に対応する場合は false として解釈されます。それ以外の場合、atrue として解釈されます。

  • 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.

したがって、実際の近似が次のとおりである場合、afalse と等価です。

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)を参照してください。

    • SumModeProductModeSpecifyPrecision に設定してチャートの fimath オブジェクトを指定する場合は、すべての和と積の語長、勾配、バイアスを明示的に定義できます。fimath オブジェクト プロパティ (Fixed-Point Designer)を参照してください。

  • C をアクション言語として使用するチャートでは、固定小数点上位変換規則が結果の中間値の型を決定します。その後、この中間値は c に指定する型にキャストされます。

    すべての算術演算で、量子化整数の格納に使用する既定のビット数 wc は、次の間で大きいほうの値となります。

    • オペランドの型の最大のビット数 (wa および wb)

    • ターゲット マシンの整数ワード サイズのビット数 (wint)

    wint の値を指定するには、[コンフィギュレーション パラメーター] ダイアログ ボックスを開き、[ハードウェア実行] ペインで [デバイス ベンダー] パラメーターを [Custom Processor][int] パラメーターをターゲットの整数ワード サイズに設定します。詳細については、[ハードウェア実行] ペイン (Simulink)を参照してください。

    c := a <op> b という形式の特殊な代入演算を使用することにより、オーバーフローを回避して浮動小数点演算の精度を上げることができます。特殊な代入演算は、固定小数点上位変換規則には従いません。代わりに、チャートは c に指定した型を使用して演算の結果を判定します。C チャートでの固定小数点上位変換のオーバーライドを参照してください。

加算と減算

既定では、MATLAB をアクション言語として使用するチャートでは、2 進小数点スケーリングを使用して定義された固定小数点データでのみ加算と減算をサポートします。どちらかのオペランドが符号付き固定小数点数である場合は、結果も符号付きとなります。語長の選択は、各オペランドの整数部および小数部と、起こりうるキャリー ビットに対応します。結果の小数部の長さは、最も精度の高いオペランドの小数部の長さと等しくなります。2 の整数乗でない勾配または非ゼロのバイアスを使用して定義された固定小数点データで加算と減算を実行するには、SumModeSpecifyPrecision に設定してチャートの fimath オブジェクトを指定します。

C をアクション言語として使用するチャートは、すべての固定小数点データ型のオペランドの加算と減算をサポートします。両方のオペランドが符号付きの場合のみ、結果は符号付きの固定小数点数となります。符号付きオペランドと符号なしオペランドが混在すると、予期しない結果が返される可能性があるため、推奨されません。結果の勾配は、最も精度の低いオペランドの勾配と等しくなります。計算を簡素化して、効率的なコードを生成するために、2 つの入力のバイアスが加算演算では加算され、減算演算では減算されます。

 abアクション言語が MATLABアクション言語が C の場合
符号sasbsc = sa||sbsc = sa && sb
語長wawbwc = max(wa – fa, wb – fb) + max(fa, fb) + 1wc = max(wa, wb, wint)
小数部の長さfafbfc = 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 の整数乗でない勾配または非ゼロのバイアスを使用して定義された固定小数点データで乗算を実行するには、ProductModeSpecifyPrecision に設定してチャートの fimath オブジェクトを指定します。

C をアクション言語として使用するチャートは、非ゼロのバイアスによって定義された固定小数点データのオペランドでのみ乗算をサポートします。両方のオペランドが符号付きの場合のみ、結果は符号付きの固定小数点数となります。符号付きオペランドと符号なしオペランドが混在すると、予期しない結果が返される可能性があるため、推奨されません。積の勾配は、オペランドの勾配の積です。

 abアクション言語が MATLABアクション言語が C の場合
符号sasbsc = sa||sbsc = sa && sb
語長wawbwc = wa + wbwc = max(wa, wb, wint)
小数部の長さfafbfc = fa + fbfc = fa + fb
勾配Sa (2 進小数点スケーリングを使用する場合は 2-fa)Sb (2 進小数点スケーリングを使用する場合は 2-fb)Sc = SaSbSc = SaSb
バイアスBa = 0Bb = 0Bc = 0Bc = 0

除算

MATLAB をアクション言語として使用するチャートは、2 進小数点スケーリングを使用して定義された固定小数点データでのみ除算をサポートします。どちらかのオペランドが符号付き固定小数点数である場合は、結果も符号付きとなります。完全精度の商には、オペランドの最大ビット数と同じ語長が必要です。商の小数部の長さは、オペランドの小数部の長さの差です。

C をアクション言語として使用するチャートは、非ゼロのバイアスによって定義された固定小数点データ オペランドの除算をサポートします。両方のオペランドが符号付きの場合のみ、結果は符号付きの固定小数点数となります。符号付きオペランドと符号なしオペランドが混在すると、予期しない結果が返される可能性があるため、推奨されません。商の勾配は、オペランドの勾配の商です。

 abアクション言語が MATLABアクション言語が C の場合
符号sasbsc = sa||sbsc = sa && sb
語長wawbwc = max(wa, wb)wc = max(wa, wb, wint)
小数部の長さfafbfc = fa – fbfc = fa – fb
勾配Sa (2 進小数点スケーリングを使用する場合は 2-fa)Sb (2 進小数点スケーリングを使用する場合は 2-fb)Sc = Sa/SbSc = Sa/Sb
バイアスBa = 0Bb = 0Bc = 0Bc = 0

単項マイナス

結果の型の上位変換が必要な単項演算は、単項マイナス演算 c = -a のみです。符号なし固定小数点数の負を取ると、予期しない結果が返される可能性があるため、推奨されません。結果のワード サイズは、チャートのアクション言語プロパティによって異なります。結果の勾配は、オペランドの勾配と等しくなります。結果の型のバイアスは、オペランドのバイアスの負です。

 aアクション言語が MATLABアクション言語が C の場合
符号sasc = sasc = sa
語長wawc = wawc = max(wa, wint)
小数部の長さfafc = fafc = fa
勾配Sa (2 進小数点スケーリングを使用する場合は 2-fa)Sc = SaSc = Sa
バイアスBa (2 進小数点スケーリングを使用する場合は 0)Bc = –BaBc = –Ba

混在する数値型を使った算術

次の表は、固定小数点数と別の数値型のオペランドとの間の二項演算の固定小数点上位変換規則をまとめたものです。

2 番目のオペランドの数値型アクション言語が MATLABアクション言語が C の場合

浮動小数点数:

  • single

  • double

演算を実行する前に、チャートは浮動小数点オペランドを固定小数点数にキャストします。キャストに使用する型は、演算によって異なります。

  • 加算演算と減算演算では、固定小数点オペランドと同じ型を使用します。

  • 乗算演算では、語長と符号属性は固定小数点オペランドと同じとなり、固定小数点結果の最高精度の小数部の長さを使用します。

演算の結果は固定小数点数となります。

演算を実行する前に、チャートは固定小数点オペランドを浮動小数点数にキャストします。キャスト演算では、浮動小数点オペランドと同じ型 (single または double) を使用します。演算の結果は浮動小数点数となります。

整数:

  • int64

  • int32

  • int16

  • int8

  • uint64

  • uint32

  • uint16

  • uint8

整数オペランドは、勾配が S = 1 でバイアスが B = 0 の、語長と符号属性が同じ固定小数点数として扱われます。演算の結果は固定小数点数となります。

整数オペランドは、勾配が S = 1 でバイアスが B = 0 の、語長と符号属性が同じ固定小数点数として扱われます。演算の結果は固定小数点数となります。

関連するトピック