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