Main Content

固定小数点データの作成

この例では、固定小数点数値オブジェクト 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

fi の表示とログの基本設定に関する現在の状態を取得し、既定値にリセットします。

fiprefAtStartOfThisExample = get(fipref);
reset(fipref);

既定のプロパティによる固定小数点数の作成

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

たとえば、fi オブジェクト a および b を作成します。fi コンストラクターへの最初の入力は値です。

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

固定小数点の既定の属性が表示されます。変数 fi の作成時にこれらの属性を指定できます。

既定の WordLength は 16 ビットです。FractionLength プロパティを指定しない場合、オーバーフローを回避し、その値の最上位ビットを保持しながら、所定の語長で最高精度が得られる小数部の長さに自動的に設定されます。

符号属性と語長のプロパティの指定

fi コンストラクターへの 2 番目と 3 番目の入力では、それぞれ符号属性とビット単位の語長を指定します。

符号付き 8 ビット fi オブジェクトを作成します。

a = fi(pi,1,8)
a = 
                   3.15625

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

符号なし 20 ビット fi オブジェクトを作成します。

b = fi(exp(1),0,20)
b = 
          2.71828079223633

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

精度

データは、指定された限りの精度で内部的に格納されます。ただし、高精度の固定小数点変数を倍精度浮動小数点変数で初期化すると、最初に予期していた結果にならない可能性があります。

たとえば、符号なしの 100 ビット固定小数点変数を値 0.1 で初期化し、その 2 進展開を調べます。

a = fi(0.1,0,100)
a = 
                       0.1

          DataTypeMode: Fixed-point: binary point scaling
            Signedness: Unsigned
            WordLength: 100
        FractionLength: 103
bin(a)
ans = 
'1100110011001100110011001100110011001100110011001101000000000000000000000000000000000000000000000000'

無限に繰り返される 2 進展開 0.1 は、52 番目のビットで途切れています。53 番目は有効ビットであり、52 番目のビットに丸められています。これは、倍精度浮動小数点変数 (既定の MATLAB® データ型) が 64 ビットの浮動小数点形式で保存されており、そのうち符号用に 1 ビット、指数用に 11 ビットが使用され、仮数用には 52 ビットと、さらに隠れた 1 ビットがあるためです。その結果、実質的に精度には 53 ビットが割り当てられます。倍精度浮動小数点の範囲が非常に広い場合でも、その精度は 53 ビットに制限されます。浮動小数点の算術の詳細については、Numerical Computing with MATLAB (Cleve Moler 著) の第 1 章を参照してください。

大半の固定小数点プロセッサでは、データが低い精度で保存された後、高い精度で計算されるため、倍精度浮動小数点よりも高精度な fi オブジェクトの作成が必要になる場合があります。

たとえば、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 の精度に量子化された、a の倍精度浮動小数点の実際値を返します。

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

実際値を double で設定することもできます。たとえば、a の実際値を、a の数値型に量子化された e に設定します。

a.double = exp(1)
a = 
             2.71826171875

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

関数 storedInteger を使用して、保存整数を、利用可能な最小の組み込み整数型で返します。最大 64 ビットです。

storedInteger(a)
ans = int16
   22268

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

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

Real-world value=(Stored integer)2-Fraction length.

勾配とバイアスのスケーリングもあり、その場合は以下の関係になります。

Real-world value=(Stored integer)Slope+Bias

ここで、

Slope=(Slope adjustment factor)2Fixed exponent.

および

Fixed exponent=-Fraction length.

です。fi の数学演算子は、2 進小数点スケーリングおよび実数値の勾配とバイアスでスケーリングされた fi オブジェクトと一緒に使用されます。

その他のデータ形式

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

bin(a)
ans = 
'0101011011111100'
oct(a)
ans = 
'053374'
dec(a)
ans = 
'22268'
hex(a)
ans = 
'56fc'

ドット表記を使用して、保存整数を 2 進数、8 進数、符号なし 10 進数、および 16 進数文字列から設定できます。

fi(π)

a.bin = '0110010010001000'
a = 
              3.1416015625

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

fi(ϕ)

a.oct = '031707'
a = 
           1.6180419921875

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

fi(e)

a.dec = '22268'
a = 
             2.71826171875

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

fi(0.1)

a.hex = '0333'
a = 
           0.0999755859375

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

小数部の長さの指定

FractionLength プロパティを指定しない場合、オーバーフローを回避しながら値の大きさと所定の語長で最高精度が得られるように計算されます。小数部の長さを fi コンストラクターで 4 番目の数値引数として直接指定することもできます。

a の小数部の長さ (明示的に 0 に設定されている) と b の小数部の長さ (値の大きさに対して最高精度が得られるように設定されている) を比較します。

a = fi(10,1,16,0)
a = 
    10

          DataTypeMode: Fixed-point: binary point scaling
            Signedness: Signed
            WordLength: 16
        FractionLength: 0
b = fi(10,1,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 = int16
   10

storedInteger(b)
ans = int16
   20480

名前と値のペアの引数によるプロパティの指定

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

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

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

数値型プロパティ

fi オブジェクトには numerictype オブジェクトが関連付けられています。numerictype オブジェクトには、語長、小数部の長さ、符号属性など、fi オブジェクトに関する情報が格納されています。

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

実際値の表示

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

a = fi(1,1,8,7)
a = 
                 0.9921875

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

100 ビットの分数は正確に表すことができません。

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

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

正確な値が 1 - 2^-99 の場合は、出力に 1 と表示されます。

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

bin(b)
ans = 
'0111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111'

表示基本設定

fipref オブジェクトを使用して、fi の表示基本設定を設定します。関数 savefipref を使用して、表示基本設定を MATLAB セッション間で保存します。

fi オブジェクトの表示は、関数 format の影響も受けます。実際値を表示する場合は、以下を使用して

format long g

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

クリーンアップ

例によって変更された表示設定または基本設定を元の状態に戻します。

fipref(fiprefAtStartOfThisExample);
set(0,'format',originalFormat);
%#ok<*NOPTS,*NASGU>

参考

| | | | | | | |