固定小数点データの作成
この例では、固定小数点数値オブジェクト fi の基本的な使用方法を説明します。固定小数点データ型を数値または変数に割り当てるには、fi コンストラクターを使用して fi オブジェクトを作成します。fi コンストラクターで、または numerictype オブジェクトと fimath オブジェクトを使用して、数値属性と算術ルールを指定できます。
例の設定
この例で使用される表示設定または基本設定は、現在ご使用のものと異なっている場合があります。この例を実行することで、現在ご利用の表示設定および基本設定が変更されないように、現在の設定は自動的に保存、復元されます。次のコードを実行して、例で変更されるすべての表示設定またはプロパティの現在の状態を取得します。
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 進小数点スケーリングでは、保存整数値と実際値の関係は以下のようになります。
傾きとバイアスのスケーリングもあり、その場合は以下の関係になります。
ここで、
および
です。fi の数学演算子は、2 進小数点スケーリングおよび実数値の傾きとバイアスでスケーリングされた fi オブジェクトと一緒に使用されます。
その他のデータ形式
関数 bin、oct、dec および 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 進数文字列から設定できます。
a.bin = '0110010010001000'a =
3.1416015625
DataTypeMode: Fixed-point: binary point scaling
Signedness: Signed
WordLength: 16
FractionLength: 13
a.oct = '031707'a =
1.6180419921875
DataTypeMode: Fixed-point: binary point scaling
Signedness: Signed
WordLength: 16
FractionLength: 13
a.dec = '22268'a =
2.71826171875
DataTypeMode: Fixed-point: binary point scaling
Signedness: Signed
WordLength: 16
FractionLength: 13
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
a と b の保存整数値は、実際値が同じであったとしても異なります。それは、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
numerictype オブジェクトで渡すことによって、fi オブジェクトのすべての数値型プロパティを一度に設定できます。これにより、たとえば同じ数値型プロパティを共有する複数の 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>
詳細
固定小数点数値オブジェクトは fi と呼ばれます。これは、J.H. Wilkinson がその古典的名著『Rounding Errors in Algebraic Processes』(1963) と『The Algebraic Eigenvalue Problem』(1965) で、固定小数点演算を表すのに fi を使用したことに由来します。
参考
fi | fipref | savefipref | numerictype | storedInteger | bin | oct | dec | hex