找回密码
 注册
Simdroid-非首页
查看: 156|回复: 4

十进制实数转化为定点的二进制

[复制链接]
发表于 2006-10-31 00:51:04 | 显示全部楼层 |阅读模式 来自 浙江杭州
贴两个最近写的小程序
哈。。。最近比较忙。。。写的都是随手用到的程序。。。

function y=deci_dec2bin(x,n);
%10进制小数转化二进制小数
%存在浮点到定点的转化
%n 是二进制小数位的输出位数
%x为输入十进制,y为输出二进制
% last revised by bzzz @ Aug. 29th, 2006

if(x>=1)
    y=floor(x);
    y=dec2bin(y);
    x=x-floor(x);
else
    y='0';
end
z=round(2^n*x);
z=dec2bin(z);
[m1,n1]=size(z);
deci=[repmat('0',1, n-n1), z];
y=[y '.' deci];

[ 本帖最后由 bzzz 于 2006-10-31 01:07 编辑 ]

评分

1

查看全部评分

发表于 2006-10-31 09:31:19 | 显示全部楼层 来自 湖北武汉
Simdroid开发平台
%我没用过。
发信人: 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

查看全部评分

发表于 2006-11-1 09:12:52 | 显示全部楼层 来自 河南郑州
我曾经也碰上过类似问题,写了一个,是用于十进制整数转换为二进制整数的,调用了某个工具箱里的“量化”函数,看看,程序是不是很短?
y=deci_dec2bin(x)
q=quantizer([ceil(log2(x)+1),0]);
y=num2bin(q,x);
y=b(2:end)


运行举例(欢迎验证):
y=deci_dec2bin(1234)
y=10011010010



--------------------------------------------------------------------------------
【长期兼职:建模仿真,代写程序,英语笔译,寻求项目合作】
本人擅长:现代智能算法(遗传,退火,神经网络,蚁群,免疫,拟物拟人,支持向量机),数学建模与算法仿真(有扎实的理论基础和丰富的实践经验),通信与信息系统(硕士专业),英语笔译(累计20万字翻译经历),精通Matlab、C/C++等工具。
Email:cheng_aihua@163.com
QQ:330264704
MSN:aihuacheng@hotmail.com
Google Talk:aihuacheng@gmail.com

[ 本帖最后由 aiwa 于 2006-11-1 09:18 编辑 ]

评分

1

查看全部评分

 楼主| 发表于 2006-11-1 23:39:48 | 显示全部楼层 来自 浙江杭州
1楼的那个用了辗转相除的想法,和我的想法有类似的地方,但是循环会限制速度...不过我没试过这个函数,大概看了一下...
2楼那个相当于用了通信里面的量化器,其实本质上来说并不方便。。。哈,一家之言啊

评分

1

查看全部评分

发表于 2010-3-30 10:33:36 | 显示全部楼层 来自 上海
一楼的好像运行不了
回复 不支持

使用道具 举报

您需要登录后才可以回帖 登录 | 注册

本版积分规则

Simapps系列直播

Archiver|小黑屋|联系我们|仿真互动网 ( 京ICP备15048925号-7 )

GMT+8, 2024-10-7 07:27 , Processed in 0.049116 second(s), 21 queries , Gzip On, MemCache On.

Powered by Discuz! X3.5 Licensed

© 2001-2024 Discuz! Team.

快速回复 返回顶部 返回列表