我创建了以下简单的Matlab函数,用于将任意进制的数字转换为十进制和反向转换。以下是第一个函数:
由于数字的大小存在限制,这些函数无法成功转换非常大的向量,但是在测试它们时我注意到了以下错误。
让我们使用下面的测试函数。
function decNum = base2decimal(vec, base)
decNum = vec(1);
for d = 1:1:length(vec)-1
decNum = decNum*base + vec(d+1);
end
这是另一个
function baseNum = decimal2base(num, base, Vlen)
ii = 1;
if num == 0
baseNum = 0;
end
while num ~= 0
baseNum(ii) = mod(num, base);
num = floor(num./base);
ii = ii+1;
end
baseNum = fliplr(baseNum);
if Vlen>(length(baseNum))
baseNum = [zeros(1,(Vlen)-(length(baseNum))) baseNum ];
end
由于数字的大小存在限制,这些函数无法成功转换非常大的向量,但是在测试它们时我注意到了以下错误。
让我们使用下面的测试函数。
num = 201;
pCount = 7
x=base2decimal(repmat(num-1, 1, pCount), num)
repmat(num-1, 1, pCount)
y=decimal2base(x, num, 1)
isequal(repmat(num-1, 1, pCount),y)
一个在基数为201时由七(7)个数字组成的矢量能够正常工作,但是同样有着相对较小的数字且理论上应该成功转换的在基数为200时的矢量并不能返回期望的结果。
200
和向量[199,199,199,199,199,199,199]
,在循环的最后一步中,base2decimal
函数计算出63999999999999.0*200+199,由于浮点数限制,我认为结果应该是12800000000000000.0而不是12799999999999999.0。但这不应该是浮点误差,因为eps(12799999999999999.0) = 0.5
,所以它似乎可以保持这种精度...尽管如eps(1.28e16)=2
,计算出的数字是最后一个整数值双精度浮点数,其精度小于1。 - RTL