0

今日、私たちの先生は、コンピューターで数値がどのように表現されるかについて教えてくれました。彼は、システムの最小指数、最大指数、およびビット数を取得し、システムで表現可能なすべての数値を表示する Matlab 関数をプログラムしました。

例: 最小指数が -1、最大指数が 1 の場合、2 ビット システムで作業します。

f(-1,1,2)

ans =

    0.5000
    0.6250
    0.7500
    0.8750
    1.0000
    1.2500
    1.5000
    1.7500
    2.0000
    2.5000
    3.0000
    3.5000

しかし、私は彼が書いたコードを本当に理解していません。誰かが私に説明してくれれば幸いです。彼の基本的な考え方は、行列で 2 進数 (00,01,10,11) を表し、その行列にベクトルを掛けることです。私は完全に彼を見失い、彼のコードを理解できません。

これは彼が書いたものです:

%% Computing the Matrix A
m = 2^p;
A = zeros(m,p);
for i=1:p
   temp = [zeros(m/2^i,1); ones(m/2^i,1)];
   A(:,i) = repmat(temp,2^(i-1),1);
end


%% Computing the numbers
V = zeros(p,1);
for i=1:p 
    V(i) = 1/2^i;
end
N = zeros((emax-emin+1)*2^p,1);
k=1;
for e = emin:emax
    N(k:k+2^p-1) = 2^e*A*V+2^e*ones(2^p,1);
    k = k + 2^p;
end
 sort(N)
4

1 に答える 1

1

暗黙の先行ビットがあるため、実際には 3 ビットあります。

例:1.75 = 2^0 + 2^-1 + 2^-2

したがって、数値は、先行する暗黙の 1 + 2 ビット b1 b2 を含む仮数で形成されます。

1.b1b2 = 1 + b1/2 + b2/4

指数 e に累乗した基数 (2) を掛けると、最終的に

(1 + b1/2 + b2/4) * 2^e

すべての組み合わせを形成するために使用されるコードは、不必要に複雑です。

考えられる意味記号はすべて、次のように形成できます。

significands = 1 + (0:2^p-1)/2^p;

次に、すべての指数:

exponents = 2.^(emin:emax);

次に、すべての数字:

floats = significands' * exponents;
floats = floats(:);

その代わりに、最初のループは列ごとに可能なすべてのビットの組み合わせを形成します (行ごとに 1 つの組み合わせ、2^p 行あります)。

例として p=3 を考えてみましょう: 最初のビットの値は[0 0 0 0 1 1 1 1]'

次に、2 番目のビットの値[0 0 1 1 0 0 1 1]'

次に、3 番目のビットの値[0 1 0 1 0 1 0 1]'

これらの列をまとめると、3 ビットの 8 つの可能な組み合わせが得られます。

[ 0 0 0 ;
  0 0 1 ;
  0 1 0 ;
  0 1 1 ;
  1 0 0 ;
  1 0 1 ;
  1 1 0 ;
  1 1 1 ]

2 番目のループ[2^-1 2^-2 ... 2^-p]'は、これらの各列の乗数であるベクトルを形成するだけです。

3 番目のループは、各指数の乗算を実行します (2^e で乗算された先頭の項を加算する 2 番目の項に注意してください)。

于 2013-07-04T22:00:44.210 に答える