Decimal a binario decimal de punto fijo código MATLAB

Número decimal y conversión decimal de coma fija binaria firmada código MATLAB

Escribí este código de MATLAB cuando estaba haciendo una competencia de FPGA. La razón es que encontré muchos cálculos decimales de punto fijo en el FPGA, y la conversión de formato manual era demasiado engorrosa, así que lo resolví a través del código.

1. Convertir decimal a binario:

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

Explicación: El bit más alto (el bit más a la izquierda) del decimal de punto fijo binario de salida es el bit de signo.

Como se muestra en la figura anterior, puede ingresar directamente el número decimal, y el resultado de salida es una serie de 0 y 1 consecutivos, y el círculo es el bit de signo más alto, porque configuré cuatro bits enteros, por lo que la caja de terminales es un bit entero, por lo que el número total de dígitos binarios es 1+4+14=19 bits.

2. Convierte binario a 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


Explicación: Debido a que la función de módulo de MATLAB modtiene un límite en el número de dígitos, los dígitos binarios de entrada también están limitados.Como

se muestra en la figura anterior, ingrese directamente una cadena de 0s y 1s binarios al ingresar, pero preste atención a la limitación en el número de dígitos de números positivos y negativos.

Supongo que te gusta

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