Fixed-Point Designer

最新のリリースでは、このページがまだ翻訳されていません。 このページの最新版は英語でご覧になれます。

固定小数点データの作成

この例では、固定小数点数値オブジェクト fi の基本的な使用方法を説明します。

表記法

固定小数点数値オブジェクトは fi と呼ばれます。これは、J.H. Wilkinson がその古典的名著『Rounding Errors in Algebraic Processes』 (1963) と『The Algebraic Eigenvalue Problem』 (1965) で、固定小数点演算を表すのに fi を使用したことに由来します。

設定

この例で使用される表示設定は、現在ご使用のものと異なっている場合があります。この例を実行することで、現在ご利用の表示設定が変更されないように、現在の表示設定は自動的に保存、復元されます。以下のコードにより、例で変更される表示設定またはプロパティの現在の状態が取得されます。

originalFormat = get(0, 'format');
format loose
format long g
% Capture the current state of and reset the fi display and logging
% preferences to the factory settings.
fiprefAtStartOfThisExample = get(fipref);
reset(fipref);

固定小数点の既定の属性

固定小数点データ型を、既定の固定小数点パラメーターをもつ数字または変数に割り当てるには、fi コンストラクターを使用します。結果として得られる固定小数点値は fi オブジェクトと呼ばれます。

たとえば以下では、fi オブジェクト a および b が作成され、表示される属性はすべて、その変数の作成時に指定できます。FractionLength プロパティを指定しない場合、その値の最上位ビットを保持しながら、保持所定の語長で "最高精度" が得られるように自動的に設定されます。WordLength を指定しない場合、既定値の 16 ビットに設定されます。

a = fi(pi)
a = 

              3.1416015625

          DataTypeMode: Fixed-point: binary point scaling
            Signedness: Signed
            WordLength: 16
        FractionLength: 13
b = fi(0.1)
b = 

        0.0999984741210938

          DataTypeMode: Fixed-point: binary point scaling
            Signedness: Signed
            WordLength: 16
        FractionLength: 18

Signed および WordLength プロパティの指定

2 番目と 3 番目の数値引数により、Signed (true は 1 = signedfalse は 0 = unsigned) と WordLength (ビット単位) がそれぞれ指定されます。

% Signed 8-bit
a = fi(pi, 1, 8)
a = 

                   3.15625

          DataTypeMode: Fixed-point: binary point scaling
            Signedness: Signed
            WordLength: 8
        FractionLength: 5

sfi コンストラクターを使用して符号付き fi オブジェクトを作成することもできます。

a1 = sfi(pi,8)
a1 = 

                   3.15625

          DataTypeMode: Fixed-point: binary point scaling
            Signedness: Signed
            WordLength: 8
        FractionLength: 5
% Unsigned 20-bit
b = fi(exp(1), 0, 20)
b = 

          2.71828079223633

          DataTypeMode: Fixed-point: binary point scaling
            Signedness: Unsigned
            WordLength: 20
        FractionLength: 18

ufi コンストラクターを使用して符号なし fi オブジェクトを作成することもできます。

b1 = ufi(exp(1), 20)
b1 = 

          2.71828079223633

          DataTypeMode: Fixed-point: binary point scaling
            Signedness: Unsigned
            WordLength: 20
        FractionLength: 18

精度

データは、指定された限りの精度で内部的に格納されます。ただし、高精度の固定小数点変数を倍精度浮動小数点変数で初期化すると、最初に予期していた結果にならない可能性があることに注意してください。たとえば、符号なしの 100 ビット固定小数点変数を 0.1 で初期化し、その 2 進拡張を調べてみましょう。

a = ufi(0.1, 100);
bin(a)
ans =

1100110011001100110011001100110011001100110011001101000000000000000000000000000000000000000000000000

無限に繰り返される 2 進展開 0.1 は、52 番目のビットで途切れています (実は、53 番目は有効ビットであり、52 番目のビットに丸められています)。これは、倍精度浮動小数点変数 (既定の MATLAB® データ型) が 64 ビットの浮動小数点形式で保存されており、そのうち符号用に 1 ビット、指数用に 11 ビットが使用され、仮数用には 52 ビットと、さらに "隠れた" 1 ビットがあり、実質的に精度には 53 ビットが割り当てられるためです。倍精度浮動小数点の範囲が非常に広い場合でも、その精度は 53 ビットに制限されます。浮動小数点の算術の詳細は、Cleve Moler の著書『MATLAB による数値計算』の第 1 章を参照してください。pdf バージョンはこちらです。http://www.mathworks.co.jp/company/aboutus/founders/clevemoler.html

浮動小数点よりも高精度なのはなぜでしょうか。それは、大半の固定小数点プロセッサでは、データが低い精度で保存された後、高い精度で計算されるためです。たとえば、40 ビットの符号なし fi を初期化し、積の最大精度を使用して乗算してみましょう。

40 ビットのオペランドの最大精度の積は 80 ビットであり、標準の倍精度浮動小数点よりも高精度です。

a = fi(0.1, 0, 40);
bin(a)
ans =

1100110011001100110011001100110011001101

b = a*a
b = 

        0.0100000000000045

          DataTypeMode: Fixed-point: binary point scaling
            Signedness: Unsigned
            WordLength: 80
        FractionLength: 86
bin(b)
ans =

10100011110101110000101000111101011100001111010111000010100011110101110000101001

データへのアクセス

組み込みデータ型と 2 進数文字列にマップするデータへのアクセス方法はいくつかあります。以下に例を示します。

DOUBLE(A)

a = fi(pi);
double(a)
ans =

              3.1416015625

a の精度に量子化された、a の倍精度浮動小数点の "実際" 値が返されます。

A.DOUBLE = ...

実際値を double で設定することもできます。

a.double = exp(1)
a = 

             2.71826171875

          DataTypeMode: Fixed-point: binary point scaling
            Signedness: Signed
            WordLength: 16
        FractionLength: 13

a の実際値が、a の数値型に量子化された e に設定されます。

STOREDINTEGER(A)

storedInteger(a)
ans =

  22268

"保存整数" が、利用可能な最小の組み込み整数型で返されます。最大 64 ビットです。

保存整数値と実際値の関係

BinaryPoint スケーリングでは、保存整数値と実際値の関係は以下のようになります。

$$ /mbox{Real-world value} = (/mbox{Stored integer})/cdot
2^{-/mbox{Fraction length}}.$$

SlopeBias スケーリングもあり、その場合は以下の関係になります。

$$ /mbox{Real-world value} = (/mbox{Stored integer})/cdot
/mbox{Slope}+ /mbox{Bias}$$

ここで、

$$ /mbox{Slope} = (/mbox{Slope adjustment factor})/cdot
2^{/mbox{Fixed exponent}}.$$

および

$$/mbox{Fixed exponent} = -/mbox{Fraction length}.$$

です。fi の数学演算子は、BinaryPoint スケーリングおよび実数値の SlopeBias でスケーリングされた fi オブジェクトと一緒に使用されます。

BIN(A)、OCT(A)、DEC(A)、HEX(A)

保存整数がそれぞれ 2 進数、8 進数、符号なし 10 進数、および 16 進数文字列で返されます。

bin(a)
ans =

0101011011111100

oct(a)
ans =

053374

dec(a)
ans =

22268

hex(a)
ans =

56fc

A.BIN = ...、A.OCT = ...、A.DEC = ...、A.HEX = ...

保存整数がそれぞれ 2 進数、8 進数、符号なし 10 進数、および 16 進数文字列から設定されます。

$$/mbox{/texttt{fi}}(/pi)$$

a.bin = '0110010010001000'
a = 

              3.1416015625

          DataTypeMode: Fixed-point: binary point scaling
            Signedness: Signed
            WordLength: 16
        FractionLength: 13

$$/mbox{/texttt{fi}}(/phi)$$

a.oct = '031707'
a = 

           1.6180419921875

          DataTypeMode: Fixed-point: binary point scaling
            Signedness: Signed
            WordLength: 16
        FractionLength: 13

$$/mbox{/texttt{fi}}(e)$$

a.dec = '22268'
a = 

             2.71826171875

          DataTypeMode: Fixed-point: binary point scaling
            Signedness: Signed
            WordLength: 16
        FractionLength: 13

$$/mbox{/texttt{fi}}(0.1)$$

a.hex = '0333'
a = 

           0.0999755859375

          DataTypeMode: Fixed-point: binary point scaling
            Signedness: Signed
            WordLength: 16
        FractionLength: 13

FractionLength の指定

FractionLength を指定しない場合、値の大きさと所定の語長で最高精度が得られるように計算されます。小数部の長さを fi コンストラクターで 4 番目の数値引数として直接指定することも、sfi または ufi コンストラクター で 3 番目の数値引数として直接指定することもできます。以下の例で、a の小数部の長さ (明示的に 0 に設定されている) と b の小数部の長さ (値の大きさに対して最高精度が得られるように設定されている) を比較します。

a = sfi(10,16,0)
a = 

    10

          DataTypeMode: Fixed-point: binary point scaling
            Signedness: Signed
            WordLength: 16
        FractionLength: 0
b = sfi(10,16)
b = 

    10

          DataTypeMode: Fixed-point: binary point scaling
            Signedness: Signed
            WordLength: 16
        FractionLength: 11

ab の保存整数値は、実際値が同じであったとしても異なります。それは、a の実際値が 2^0 = 1 でスケーリングされた保存整数であるのに対して、b の実際値は 2^-11 = 0.00048828125 でスケーリングされた保存整数であるからです。

storedInteger(a)
ans =

     10

storedInteger(b)
ans =

  20480

パラメーターと値の組み合わせによるプロパティの指定

ここまでは、数値引数を fi コンストラクターに渡すことによって数値型プロパティを指定してきました。プロパティを指定するその他の方法としては、プロパティの名前を、そのプロパティの値の前の文字列として指定することもできます。

a = fi(pi,'WordLength',20)
a = 

          3.14159393310547

          DataTypeMode: Fixed-point: binary point scaling
            Signedness: Signed
            WordLength: 20
        FractionLength: 17

fi プロパティの詳細を参照するには、

help fi

または

doc fi

と MATLAB コマンド ラインで入力してください。

数値型プロパティ

fi のすべての数値型プロパティは、numerictype という名前のオブジェクトにカプセル化されています。

T = numerictype
 
T =
 

          DataTypeMode: Fixed-point: binary point scaling
            Signedness: Signed
            WordLength: 16
        FractionLength: 15

数値型プロパティを変更できるのは、オブジェクトがパラメーター/値の引数で渡されることによって作成される場合

T = numerictype('WordLength',40,'FractionLength',37)
 
T =
 

          DataTypeMode: Fixed-point: binary point scaling
            Signedness: Signed
            WordLength: 40
        FractionLength: 37

またはドット表記を使用して割り当てることができる場合です。

T.Signed = false
 
T =
 

          DataTypeMode: Fixed-point: binary point scaling
            Signedness: Unsigned
            WordLength: 40
        FractionLength: 37

fi のすべての数値型プロパティは、numerictype オブジェクトで渡すことによって一度に設定できます。これは、たとえば同じ数値型を共有する複数の fi オブジェクトを作成する場合などに便利です。

a = fi(pi,'numerictype',T)
a = 

          3.14159265359194

          DataTypeMode: Fixed-point: binary point scaling
            Signedness: Unsigned
            WordLength: 40
        FractionLength: 37
b = fi(exp(1),'numerictype',T)
b = 

          2.71828182845638

          DataTypeMode: Fixed-point: binary point scaling
            Signedness: Unsigned
            WordLength: 40
        FractionLength: 37

numerictype オブジェクトは、fi コンストラクターに直接渡すこともできます。

a1 = fi(pi,T)
a1 = 

          3.14159265359194

          DataTypeMode: Fixed-point: binary point scaling
            Signedness: Unsigned
            WordLength: 40
        FractionLength: 37

numerictype プロパティの詳細を参照するには、

help numerictype

または

doc numerictype

と MATLAB コマンド ラインで入力してください。

表示設定

fi の表示は、fipref オブジェクトを使用して設定できます。この表示設定は、MATLAB セッション間に savefipref コマンドを使用して保存できます。

実際値の表示

実際値を表示すると、最も近い倍精度浮動小数点値が表示されます。これまで見てきたように、倍精度浮動小数点が、高精度の固定小数点数の正確な値を表すことができるとは限りません。たとえば、8 ビットの分数であれば double で正確に表すことができます。

a = sfi(1,8,7)
a = 

                 0.9921875

          DataTypeMode: Fixed-point: binary point scaling
            Signedness: Signed
            WordLength: 8
        FractionLength: 7
bin(a)
ans =

01111111

これに対して、100 ビットの分数は正確に表すことができません (正確な値が 1 - 2^-99 の場合は 1 と表示されます)。

b = sfi(1,100,99)
b = 

     1

          DataTypeMode: Fixed-point: binary point scaling
            Signedness: Signed
            WordLength: 100
        FractionLength: 99

ただし、最大精度の値は fi の内部表現で保持されます。

bin(b)
ans =

0111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111

fi オブジェクトの表示は、MATLAB の format コマンドの影響も受けます。特に、実際値を表示する場合は、以下を使用して

format long g

できる限り高い精度で表示されるようにすると便利です。

数値型プロパティをさらに省略して表示する表示オプションや、値の表示を (実際値、2 進数、8 進数、10 進数整数、または 16 進数として) 制御するオプションもあります。

表示設定の詳細を参照するには、

help fipref
help savefipref
help format

または

doc fipref
doc savefipref
doc format

と MATLAB コマンド ラインで入力してください。

クリーンアップ

以下のコードでは、例によって変更された表示設定を元の状態に戻します。

% Reset the fi display and logging preferences
fipref(fiprefAtStartOfThisExample);
set(0, 'format', originalFormat);