matlab中只能够实现十进制整数转换为二进制,对于小数部分会直接忽略,这对于精确度很高的数据来说,非常不合理。
下面是自己编写的实现十进制小数的二进制编码的matlab代码。
基本原理:
- 整数部分:除二取整,逆序排列
- 小数部分:乘二取整,顺序排列
代码:
含小数的十进制数转二进制:dec2inderectBin()
% d 十进制数(或数组)
% down 十进制数取值范围的下界
% up 十进制数取值范围的上界
% esp 精度
function [dec2inbin,intL,decL] = dec2inderectBin(d,down,up,esp)
% dec2inbin 二进制数组。行数为输入的十进制数的个数,列数为m
% intL 整数部分长度,个数为输入的十进制数的个数
% decL 小数部分长度,个数为输入的十进制数的个数
% 老师讲的公式,十进制数用几位二进制表示
m = ceil(log2((up-down)/esp));
dec2inbin=[];
intL=[];
decL=[];
for i=1:size(d,2)
dec=d(i);
% 整数部分
integer=floor(dec);
integer2bin=dec2bin(dec);
intL=[intL size(integer2bin,2)];
% 小数部分
decimal=dec-integer;
decimal2bin=[];
for j = 1 : m-size(integer2bin,2)
decimal2bin = [decimal2bin num2str(floor(decimal*2))];
decimal=decimal*2-floor(decimal*2);
end
decL=[decL size(decimal2bin,2)];
% 整数和小数拼接
dec2inbinS=[integer2bin decimal2bin];
dec2inbin=[dec2inbin;dec2inbinS];
end
end
二进制表示的小数转十进制数:inderectbin2dec()
% b 二进制编码数组。行数为需要解码的二进制数个数,列数为二进制编码位数
% down 十进制数取值范围的下界
% up 十进制数取值范围的上界
% intL 整数部分长度,个数为输入的十进制数的个数
% decL 小数部分长度,个数为输入的十进制数的个数
function dec=inderectbin2dec(b,down,up,intL,decL)
% dec 十进制数
dec=[];
for i=1:size(b,1)
bin=b(i,:);
% 整数部分
integer=bin2dec(bin(1:intL(i)));
% 小数部分
decimal=0;
for j = intL(i)+1 : intL(i)+decL(i)
decimal=decimal+str2num(bin(j))*2^(intL(i)-j);
end
dec=[dec;integer+decimal];
end
end