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 mod
tem 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.