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

但我真的不明白他写的代码。如果有人可以向我解释,我会很高兴。他的基本思想是用一个矩阵表示二进制数(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

乘以底数 (2) 的指数 e,所以最后

(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]'

然后第二位的值[0 0 1 1 0 0 1 1]'

然后是第三位的值[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^-1 2^-2 ... 2^-p]',它是每列的乘数

第三个循环为每个指数执行乘法(注意第二项加上前导,乘以 2^e)。

于 2013-07-04T22:00:44.210 回答