⼗进制浮点数-半精度⼆进制浮点数转换MATLAB代码
最近设计⽤到了⼗进制浮点数->半精度⼆进制浮点数的⼤批量转换,发现没有现成的转换代码,就根据原理⽤matlab撸了⼀个,与在线转换器对⽐暂时没有发现bug,通过写blog的⽅式debug(⼩黄鸭调试法),也欢迎⼤家帮我茬,⼀起debug.
半精度浮点数数据格式16bit,遵循IEEE754的标准,1bit符号位,5bit阶码,10bit尾数。
关于浮点数的计算可以看下⾯这个blog,写的很详细:
IEEE754 在线计算器链接,可以benchmark:
下⾯是matlab函数:
function [half_float_num]=dec2half_float(input_num)
%UNTITLED2 此处显⽰有关此函数的摘要
%此处显⽰详细说明
integer =abs(fix(input_num));
Decimal =abs(input_num)- integer;
if(input_num >=0)
sign ='0';
else
sign ='1';
end
integer_bin =dec2bin(integer);
Decimal_bin =dec2bin(0,24);
d(1)= Decimal;
for i =1:24
if(d(i)*2>=1)
d(i+1)=d(i)*2-1;
Decimal_bin(i)='1';
else
d(i+1)=d(i)*2;
Decimal_bin(i)='0';
end
end
input_num2_bin =strcat(integer_bin,Decimal_bin);
if(abs(input_num)>=0.000061035)%code !=00000
for i =1:length(input_num2_bin)
if(input_num2_bin(i)=='1')
pos = i;
break;
end
end
code =15+(length(integer_bin)- pos);
code_bin =dec2bin(code,5);
else
code_bin =dec2bin(0,5);
end
if(abs(input_num)>=1)
mantissa =input_num2_bin(2:11);
elseif(abs(input_num)<=0.000061035)
mantissa =input_num2_bin(16:25);
else
mantissa =input_num2_bin(16- code +1:25-code +1); end
half_float_num =strcat(sign,code_bin,mantissa);
end
附python版本:
def dec2half(input_num):
sign ='0'
if(input_num<0):
sign ='1'
else:
sign ='0'
integer =abs(int(input_num))
Decimal =abs(input_num)- integer
decimal = np.zeros(25)
decimal[0]= Decimal
integer_bin =bin(integer)[2:]
Decimal_bin =''
for i in range(0,24):
if(decimal[i]*2>=1):
decimal[i+1]= decimal[i]*2-1
Decimal_bin = Decimal_bin +'1'
else:
decimal[i+1]= decimal[i]*2
Decimal_bin = Decimal_bin +'0'
input_num2_bin = integer_bin + Decimal_bin
if(abs(input_num)>=0.000061035):
for i in range(0,len(input_num2_bin)):
if(input_num2_bin[i]=='1'):
pos = i
break
code =15+(len(integer_bin)- pos)-1
code_bin =bin(code)[2:]
while(len(code_bin)<5):
code_bin ='0'+ code_bin
else:
code_bin ='00000'
if(abs(input_num)>=1):
mantissa = input_num2_bin[1:11]
elif(abs(input_num)<=0.000061035):
mantissa = input_num2_bin[15:25]
else:
mantissa = input_num2_bin[16- code :25-code +1]
half_float_num = sign + code_bin + mantissa万能在线进制转换器转换器网
return(half_float_num)
版权声明:本站内容均来自互联网,仅供演示用,请勿用于商业和其他非法用途。如果侵犯了您的权益请与我们联系QQ:729038198,我们将在24小时内删除。
发表评论