- 积分
- 42
- 注册时间
- 2005-10-22
- 仿真币
-
- 最后登录
- 1970-1-1
|
发表于 2006-10-31 09:31:19
|
显示全部楼层
来自 湖北武汉
%我没用过。
发信人: xxhn (小湖南), 信区: MathTools
标 题: Re: 在Matlab中如何任意整数转换成任意进制的数?
发信站: BBS 水木清华站 (Wed May 7 20:33:52 2003), 转信
我仿照des2base写了一个,给你参考
function s=double2base(d,b,n,tol)
%DOUBLE2BASE Convert double to base B string.
% DOUBLE2BASE(D,B) returns the representation of D as a string in
% base B. D must be smaller than 2^52
% and B must be an integer between 2 and 36.
%
% DOUBLE2BASE(D,B,N) produces a representation with at most N digits.%
% DOUBLE2BASE(D,B,N,TOL) produces a tolreance of TOL
%
% See also DEC2BASE,BASE2DEC, DEC2HEX, DEC2BIN.
% 算法说明:先将d分成两部分,整数部分利用matlab自己的函数dec2base,小数部分
% 实现如下:
% 循环:i从1到n
% 小数部分乘以基数b为一新数,取新数的整数部分为转化后的小数第i位,
% 取新数的小数部分继续循环
% 由于abs,floor等matlab内置的函数也有些误差,可能是double型造成的,大家可以
% 试一下用floor(4.56*25)-floor(3.56*25)他并不等于25,而是24,所以本函数用了
% 一个精度控制,所以很多情况下精度有限,也许这是matlab自己没有这个函数的原因
if nargin<2
error('Incorrect number of inputs,at least 2');
end
d = d(:);
if any(d > 1/eps)
error('D must be smaller than 2^52.');
end
if b ~= floor(b) | b < 2 | b > 36
error('B must be an integer, 2 <= B <= 36.');
end
din=floor(abs(d)); %The interger part of d
dfloat=abs(d)-din; %The float part of d
sin=dec2base(din,b);
if nargin < 3
n = 20;
end
if nargin <4
tol=1e-10;
end
for i=1:n
s1=dfloat*b;
s2=floor(s1);
s2(abs(s1-s2-1)<tol)=s2(abs(s1-s2-1)<tol)+1;
% sfloat(:,i)=floor(dfloat*b);%本来可以直接用这句话的,可是由于abs,floor等
% 的带来的误差,
% 这儿直接用floor可能会产生错误的结果(如调用double2base(4.56,3.56,25)时)
% ,所以我用了一个tol控制精度,大侠们可以试一下
sfloat(:,i)=floor(s2);
dfloat=dfloat*b-sfloat(:,i);
dfloat(abs(dfloat)<tol)=0;
if any(dfloat)==0
break;
end
end
symbols = '0123456789ABCDEFGHIJKLMNOPQRSTUVWXYZ';
sfloat = reshape(symbols(sfloat + 1),size(sfloat));
s=strcat(sin,strcat('.',sfloat));
if sum(d>=0)==length(d)
return;
end
sign=repmat('-',size(d)); %d中负数,给这些加上负号,其他的加上+号
sign(d>=0)=repmat('+',sum(d>=0),1);
s=strcat(sign,s);
[ 本帖最后由 bainhome 于 2006-10-31 14:24 编辑 ] |
评分
-
1
查看全部评分
-
|