做FPGA算法经常用到有符号定点数,万能的百度竟然没找到好用的工具,有的竟然还要收费?为方便使用写了一个10进制转二进制的小函数,基于该函数可以添加一个UI,实现整个文件的数据转化。
function binaryComplement=decgetbin(N_inter,N_fract,decimalNumber)
% 输入任意十进制数
% N_inter%有符号二进制整数位宽
% N_fract%小数位宽
% decimalNumber%输入数据
% 将十进制数拆分为整数部分和小数部分
integerPart = fix(decimalNumber);
fractionalPart = abs(decimalNumber - integerPart);
% 转换整数部分为二进制补码形式
if integerPart >=0 && decimalNumber >=0
integerBinary = dec2bin(integerPart, N_inter);
elseif integerPart < 0 && fractionalPart == 0
integerBinary = dec2bin(abs(integerPart), N_inter);
elseif integerPart < 0 && fractionalPart ~= 0
integerBinary = dec2bin(abs(integerPart), N_inter);
for i = 1:numel(integerBinary)
if integerBinary(i) == '0'
integerBinary(i) = '1';
else
integerBinary(i) = '0';
end
end
else
for i = 1:N_inter
integerBinary(i) = '1';
end
end
integerBinary=num2str(integerBinary(:));
% 转换小数部分为二进制补码形式
fractionalBinary = '';
for i = 1:N_fract
fractionalPart = fractionalPart * 2;
bit = fix(fractionalPart);
fractionalBinary = [fractionalBinary, num2str(bit)];
fractionalPart = fractionalPart - bit;
end
%%%%%%%%
% 将字符串转换为数字数组
bits = str2num(fractionalBinary(:));
if decimalNumber <0
% 取反
bits = ~bits;
% 加1
carry = 1;
for i = length(bits):-1:1
if bits(i) + carry == 2
bits(i) = 0;
else
bits(i) = 1;
carry = 0;
break;
end
end
end
% 将数字数组转换为字符串
fractionalBinary = num2str(bits);
%%%%%
% 显示结果
binaryComplement = [integerBinary;fractionalBinary]';
%disp(binaryComplement);
end
使用举例
-1.25转为fix16_12为:
使用时注意位宽问题,