今天,我们的老师教我们如何在计算机中表示数字,并编写了一个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)
答案 0 :(得分: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)。