ドキュメンテーション

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

固定小数点の数値円の表示

この例では、符号付き/なしの 2 の補数整数と固定小数点数を定義する方法を説明します。

固定小数点数の定義

この例では、符号付き/なしの 2 の補数整数と固定小数点数の定義を説明します。

符号なしの整数

符号なしの整数は、2 進数体系で以下のように表示されます。次のように仮定します。

b = [b(n) b(n-1) ... b(2) b(1)]

n ビットの符号なしの整数の 2 進桁とし、各 b(i) が 1 または 0 のいずれかであるとします。b の値は次のようになります。

u = b(n)*2^(n-1) + b(n-1)*2^(n-2) + ... + b(2)*2^(1) + b(1)*2^(0)

たとえば、3 ビット符号なしの整数の量子化器を定義して、その範囲を列挙してみましょう。

originalFormat = get(0, 'format'); format

q = quantizer('ufixed',[3 0]);
[a,b] = range(q);
u = (a:eps(q):b)'

% Now, let's display those values in binary.
b = num2bin(q,u)
u =

     0
     1
     2
     3
     4
     5
     6
     7


b =

  8x3 char array

    '000'
    '001'
    '010'
    '011'
    '100'
    '101'
    '110'
    '111'

符号なしの整数の数値円

2 進数値とそれに対応する 10 進数値を、時計の文字盤状に配置してみましょう。

fidemo.numbercircle(q);

符号なし固定小数点

符号なし固定小数点値は、2 の二乗によってスケーリングされる符号なしの整数です。2 の二乗の負の表現を「fractionlength」とします。

符号なしの整数 u が前述のように定義され、fractionlength が f の場合、符号なし固定小数点数の値は次のようになります。

  uf = u*2^-f

たとえば、fractionlength が 1 の 3 ビット符号なし固定小数点の量子化器を定義して、その範囲を列挙してみましょう。

q = quantizer('ufixed',[3 1]);
[a,b] = range(q);
uf = (a:eps(q):b)'

% Now, let's display those values in binary.
b = num2bin(q,uf)
uf =

         0
    0.5000
    1.0000
    1.5000
    2.0000
    2.5000
    3.0000
    3.5000


b =

  8x3 char array

    '000'
    '001'
    '010'
    '011'
    '100'
    '101'
    '110'
    '111'

符号なし固定小数点の数値円

2 進数値とそれに対応する 10 進数値を、時計の文字盤状に配置してみましょう。

fidemo.numbercircle(q);

符号なし小数固定小数点

符号なし小数固定小数点数は、fractionlength f が wordlength n と等しい固定小数点数で、数の範囲が 0 ~ 1-2^-f までのスケーリングを生成します。これは、固定小数点数では最も一般的な形式です。その理由は、すべての数が 1 より小さく、1 より小さい 2 つの数の積が 1 より小さい数であるといった適切な特性をもち、乗算をしてもオーバーフローにならないためです。

このように、符号なし固定小数点の定義は、f = n (n はビット単位の wordlength) という制限付きの符号なし固定小数点と同じです。

  uf = u*2^-f

たとえば、fractionlength が 3 であることを意味する 3 ビット符号なし小数固定小数点の量子化器を定義してみましょう。

q = quantizer('ufixed',[3 3]);
[a,b] = range(q);
uf = (a:eps(q):b)'

% Now, let's display those values in binary.
b = num2bin(q,uf)
uf =

         0
    0.1250
    0.2500
    0.3750
    0.5000
    0.6250
    0.7500
    0.8750


b =

  8x3 char array

    '000'
    '001'
    '010'
    '011'
    '100'
    '101'
    '110'
    '111'

符号なし小数固定小数点の数値円

2 進数値とそれに対応する 10 進数値を、時計の文字盤状に配置してみましょう。

fidemo.numbercircle(q);

符号付き 2 の補数整数

符号付き整数は、2 進数体系における 2 の補数で以下のように表示されます。次のように仮定します。

b = [b(n) b(n-1) ... b(2) b(1)]

を各 b(i) が 1 または 0 のいずれかである n ビットの符号付き整数の 2 進桁とします。b の値は次のようになります。

s = -b(n)*2^(n-1) + b(n-1)*2^(n-2) + ... + b(2)*2^(1) + b(1)*2^(0)

これと符号なし数値の相違は最上位ビット (MSB) の負の重みであることに注意してください。

たとえば、3 ビット符号付き整数の量子化器を定義して、その範囲を列挙してみましょう。

q = quantizer('fixed',[3 0]);
[a,b] = range(q);
s = (a:eps(q):b)'

% Now, let's display those values in binary.
b = num2bin(q,s)

% Note that the most-significant-bit of negative numbers is 1, and positive
% numbers is 0.
s =

    -4
    -3
    -2
    -1
     0
     1
     2
     3


b =

  8x3 char array

    '100'
    '101'
    '110'
    '111'
    '000'
    '001'
    '010'
    '011'

符号付き 2 の補数整数の数値円

2 進数値とそれに対応する 10 進数値を、時計の文字盤状に配置してみましょう。

負の数の定義が不格好な理由は、正負両方のすべての数の加算があたかもすべての数が正であるように行われ、n+1 キャリー ビットが破棄されるためです。オーバーフローがなければ、結果は正しいことになります。

fidemo.numbercircle(q);

符号付き固定小数点

符号付き固定小数点値は、2 の二乗によってスケーリングされる符号付き整数です。2 の二乗の負の表現を「fractionlength」とします。

符号付き整数 s が以前と同様に定義され、fractionlength が f の場合、符号付き固定小数点数の値は次のようになります。

  sf = s*2^-f

たとえば、fractionlength が 1 の 3 ビット符号付き固定小数点の量子化器を定義して、その範囲を列挙しましょう。

q = quantizer('fixed',[3 1]);
[a,b] = range(q);
sf = (a:eps(q):b)'

% Now, let's display those values in binary.
b = num2bin(q,sf)
sf =

   -2.0000
   -1.5000
   -1.0000
   -0.5000
         0
    0.5000
    1.0000
    1.5000


b =

  8x3 char array

    '100'
    '101'
    '110'
    '111'
    '000'
    '001'
    '010'
    '011'

符号付き固定小数点の数値円

2 進数値とそれに対応する 10 進数値を、時計の文字盤状に配置してみましょう。

fidemo.numbercircle(q);

符号付き小数固定小数点

符号付き小数固定小数点数は、fractionlength f が wordlength n より 1 小さい固定小数点数で、数の範囲が -1 ~ 1-2^-f までのスケーリングを生成します。これは、固定小数点数では最も一般的な形式です。その理由は、1 より小さい 2 つの数の積が 1 より小さい数であるといった適切なプロパティをもち、乗算をしてもオーバーフローにならないためです。唯一の例外は、+1 がこの数体系の要素ではないために -1 × -1 の乗算を行う場合です。プロセッサによってはこの場合には特別な乗算の指示があり、余分なビットを積に加算してオーバーフローをガードします。

このように、符号付き小数固定小数点の定義は、f = n-1 (n はビット単位の wordlength) という制限付きの符号付き固定小数点と同じです。

  sf = s*2^-f

たとえば、fractionlength が 2 の 3 ビット符号付き小数固定小数点の量子化器を定義しましょう。

q = quantizer('fixed',[3 2]);
[a,b] = range(q);
sf = (a:eps(q):b)'

% Now, let's display those values in binary.
b = num2bin(q,sf)
sf =

   -1.0000
   -0.7500
   -0.5000
   -0.2500
         0
    0.2500
    0.5000
    0.7500


b =

  8x3 char array

    '100'
    '101'
    '110'
    '111'
    '000'
    '001'
    '010'
    '011'

符号付き小数固定小数点の数値円

2 進数値とそれに対応する 10 進数値を、時計の文字盤状に配置してみましょう。

fidemo.numbercircle(q);

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