间接二进制编码——实现十进制小数的二进制编码

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
原创文章 35 获赞 17 访问量 7853

猜你喜欢

转载自blog.csdn.net/dear_jing/article/details/104261620