基于IEEE-754浮点数格式的matlab仿真
背景:本人开发有关硬件加速IP,遇到了浮点运算的需求,在开始之前,需要了解浮点数表示的具体形式,当前以单精度32bit为例,进行仿真,后续可以扩展为双精度64bit。
以下为matlab代码,可以直接运行,有任何问题,我们可以相互沟通学习。
(1)32bit中符号位占1bit,阶码位占8bit,尾数位占23bit。
(2)本仿真只仿真了一般情况,对于非规格数,无穷大(小)数,Nan并未涉及
%%==================================
% description: The simulation about float data about IEEE-754
%
% author : yangxiaoyu
%
% version : v1.0
%%==================================
%假设输入的数据先进行定点化,frac=23bit
num = 176.0625;
scale = 10^floor(log10(abs(num))); % 确定小数点后的位数
integerPart = floor((num * scale) / scale); % 获取整数部分
decimalPart = num - integerPart; % 获取小数部分
%单精度从-126到127
%定义128长度来作为整数二进制store
int_s=zeros(128,1);
in_b_f=zeros(128,1);
fra_s=zeros(23,1);
%
in_b=dec2bin(integerPart);
in_b=in_b';
ll=length(in_b);
in_b_p=zeros(ll,1);
%翻转一下
j=0;
for j=1:1:llin_b_p(ll+1-j,1) = bin2dec(in_b(j,1));
end
q=0;
for q=1:1:128if(q<=ll) in_b_f(q,1) = (in_b_p(q,1));else in_b_f(q,1) = 0;end
endi=0;shift_f=0;E=0;
for i=128:-1:1if(in_b_f(i,1)==1)shift=i;break;end
end
remain_part = zeros(shift-1,1);
for r=1:1:shift-1remain_part(r,1) = in_b_f(r,1);
endshift_f = shift-1;
E=shift_f + 127;
zhi_d_w = 8;
zhi_d = dec2bin(E);zhi_d = zhi_d';
zhi_d_s = zeros(zhi_d_w,1);
for n=1:1:zhi_d_wzhi_d_s(n,1) = bin2dec(zhi_d(zhi_d_w+1-n,1));
end
%
fra_d=decimalPart*2^23;
fra_d_b = dec2bin(fra_d);fra_d_b= fra_d_b';
fra_d_l= length(fra_d_b);
ll_f=23;
fra_f = zeros(ll_f,1);
for c=1:1:ll_fif(c<=fra_d_l)fra_f(c,1) = bin2dec(fra_d_b(fra_d_l+1-c,1));elsefra_f(c,1) = 0;end
end
%output
ff_o = zeros(32,1);
for o=32:-1:1if(num>=0) ff_o(32,1)=0;else ff_o(32,1)=1;endif (o<=31 && o>=24)ff_o(o,1) = zhi_d_s(o-23,1);endif(o>=1 && o<=23)if (o<=23 && (o>=23-(shift-1)+1))ff_o(o,1) = remain_part(o-(23-(shift-1)),1);elseff_o(o,1) = fra_f(o+shift-1,1);endend
end%方便同rtl对应
ff_o_f = zeros(32,1);
for qq=1:1:32ff_o_f(qq,1) = ff_o(33-qq,1);
end
也希望用到的同学,如果有问题及时反馈给我,感谢感谢。
注:其中shift_f就是小数点左移的位数。
经过简单测试,基本的对应关系正确。