Decimal para código MATLAB decimal de ponto fixo binário

Número decimal e código MATLAB de conversão de decimal de ponto fixo binário com sinal

Escrevi este código MATLAB quando estava participando de uma competição de FPGA. O motivo é que encontrei muitos cálculos decimais de ponto fixo no FPGA, e a conversão de formato manual era muito complicada, então resolvi por meio de código.

1. Converta decimal para binário:

clc;
clear;

integer = 4; %整数位数
decimal = 14; %小数位数

sum_before_point = 0;
sum_after_point = 0;
sum = 0;
before_point_arr = zeros(1, integer + 1);
after_point_arr = zeros(1, decimal);

while (1)
    prompt = 'What is the deciaml value? ';
    num = input(prompt);
    lenrth_data = length(num);
    %------------------------------%
    if (num < 0)
        before_point_arr(integer + 1) = 1;
        num = abs(num);
        flag = 1;
    else
        before_point_arr(integer + 1) = 0;
        flag = 0;
    end

    %------------------------------%
    before_point = fix(num);

    for i = 1:integer
        before_point_arr(i) = mod(before_point, 2);
        before_point = fix(before_point / 2);
        if (before_point <= 1)
            before_point_arr(i + 1) = before_point;
            break;
        end
    end

    %------------------------------%
    after_point = num - fix(num);
    for j = 1:decimal
        after_point_arr(j) = fix(after_point * 2);
        after_point = after_point * 2;
        if (after_point >= 1)
            after_point = after_point - 1;
        end
    end
    %------------------------------%
    if (flag == 1)
        for i = 1:integer
            switch (before_point_arr(i))
                case 0
                    before_point_arr(i) = 1;
                case 1
                    before_point_arr(i) = 0;
            end
        end
        for k = 1:integer
            before_point_arr(k) = before_point_arr(k) + 1;
            if (before_point_arr(k) == 1)
                break;
            else if(before_point_arr(k) == 2)
                before_point_arr(k) = 0;
                end
            end
        end
        for j = 1:decimal
            switch (after_point_arr(j))
                case 0
                    after_point_arr(j) = 1;
                case 1
                    after_point_arr(j) = 0;
            end
        end
    end
    %------------------------------%
    if (flag == 1)
        fprintf('%d', 1);
    else if(flag == 0)
        fprintf('%d', 0);
        end
    end
    for i = 1:integer
        fprintf('%d', before_point_arr(integer + 1 - i));
    end
    for j = 1:decimal
        fprintf('%d', after_point_arr(j));
    end
    fprintf('\n');a
    %------------------------------%
    before_point_arr = 0;
    after_point_arr = 0;
    flag = 0;
end

Explicação: O bit mais alto (o bit mais à esquerda) do decimal de ponto fixo binário de saída é o bit de sinal.

Como mostrado na figura acima, você pode inserir diretamente o número decimal, e o resultado da saída é uma série de 0 e 1 consecutivos, e o círculo é o bit de sinal mais alto, porque eu defino quatro bits inteiros, então a caixa terminal é um bit inteiro, então o número total de dígitos binários é 1+4+14=19 bits.

2. Converter binário para decimal

clc;
clear;
format long g;

%正数原码位数限制integer + decimal < 23,负数补码位数限制integer + decimal < 16
integer = 1; %整数位数
decimal = 21; %小数位数

sum_before_point = 0;
sum_after_point = 0;
sum = 0;

while (1)    
    prompt = 'What is the binary value? ';
    num = input(prompt);
    lenrth_data = length(num);
    
    before_point_arr = zeros(1, integer + 1);
    after_point_arr = zeros(1, decimal);

    %------------------------------%
    tempt = num;
    z = 10.^decimal;
    tempt = tempt / z;

    for i = 1:integer + 1
        before_point_arr(i) = fix(mod(tempt, 10));
        tempt = tempt / 10;
    end

    if (before_point_arr(integer + 1) == 1)
        flag = 1;
    else
        flag = 0;
    end

    %------------------------------%
    if(mod(decimal, 2))
        odd = 1;
    else
        odd = 0;
    end
    
    if(odd)
        x = (decimal - 1) / 2;
        y = (decimal + 1) / 2;
        z = 10.^x;
        
        tempt = fix(mod(num, z));
        for j = 1:x
            after_point_arr(j) = fix(mod(tempt, 10));
            tempt = tempt / 10;
        end
        tempt = num / z;
        for j = y:decimal
            after_point_arr(j) = fix(mod(tempt, 10));
            tempt = tempt / 10;
        end
    else
        x = decimal / 2;
        y = x + 1;
        z = 10.^x;
        
        tempt = mod(fix(num), z);
        for j = 1:x
            after_point_arr(j) = mod(fix(tempt), 10);
            tempt = tempt / 10;
        end
        tempt = num / z;
        for j = y:decimal
            after_point_arr(j) = mod(fix(tempt), 10);
            tempt = tempt / 10;
        end
    end

    %------------------------------%
    if (flag == 1)
        for i = 1:integer
            switch (after_point_arr(i))
                case 0
                    before_point_arr(i) = 1;
                case 1
                    before_point_arr(i) = 0;
            end
        end

        for k = 1:integer
            before_point_arr(k) = before_point_arr(k) + 1;
            if (before_point_arr(k) == 1)
                break;
            else if (before_point_arr(k) == 2)
                before_point_arr(k) = 0;
                end
            end
        end

        for j = 1:decimal
            switch (after_point_arr(j))
                case 0
                    after_point_arr(j) = 1;
                case 1
                    after_point_arr(j) = 0;
            end
        end
    end

    %------------------------------%
    for i = 1:integer
        sum_before_point = sum_before_point + before_point_arr(i) * 2.^(i - 1);
    end

    for j = 1:decimal
        sum_after_point = sum_after_point + after_point_arr(j) * 2.^(j - decimal - 1);
    end

    sum = sum_before_point + sum_after_point;

    if (flag == 1)
        sum = -sum;
    end

    %------------------------------%
    disp(sum);

    flag = 0;
    sum = 0;
    sum_before_point = 0;
    sum_after_point = 0;
    before_point_arr = 0;
    after_point_arr = 0;
end


Explicação: Como a função do módulo MATLAB modtem um limite no número de dígitos, os dígitos binários de entrada também são limitados.

Conforme mostrado na figura acima, insira diretamente uma string de 0s e 1s binários ao inserir, mas preste atenção à limitação em o número de dígitos de números positivos e negativos.

Acho que você gosta

Origin blog.csdn.net/SnowyForest___/article/details/127585749
Recomendado
Clasificación