50字范文,内容丰富有趣,生活中的好帮手!
50字范文 > 十进制转二进制定点小数MATLAB代码

十进制转二进制定点小数MATLAB代码

时间:2019-04-19 15:01:59

相关推荐

十进制转二进制定点小数MATLAB代码

十进制数和有符号二进制定点小数转换MATLAB代码

我是在做一个FPGA的比赛时写的该MATLAB代码,原因是在FPGA中遇到了很多定点小数的运算,手动变换格式过于繁琐,因此通过代码解决。

一、十进制转二进制:

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;elsebefore_point_arr(integer + 1) = 0;flag = 0;end%------------------------------%before_point = fix(num);for i = 1:integerbefore_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;endend%------------------------------%after_point = num - fix(num);for j = 1:decimalafter_point_arr(j) = fix(after_point * 2);after_point = after_point * 2;if (after_point >= 1)after_point = after_point - 1;endend%------------------------------%if (flag == 1)for i = 1:integerswitch (before_point_arr(i))case 0before_point_arr(i) = 1;case 1before_point_arr(i) = 0;endendfor k = 1:integerbefore_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;endendendfor j = 1:decimalswitch (after_point_arr(j))case 0after_point_arr(j) = 1;case 1after_point_arr(j) = 0;endendend%------------------------------%if (flag == 1)fprintf('%d', 1);else if(flag == 0)fprintf('%d', 0);endendfor i = 1:integerfprintf('%d', before_point_arr(integer + 1 - i));endfor j = 1:decimalfprintf('%d', after_point_arr(j));endfprintf('\n');a%------------------------------%before_point_arr = 0;after_point_arr = 0;flag = 0;end

说明:输出的二进制定点小数最高位(最左边一位)为符号位。

如上图所示,直接输入十进制数即可,输出结果为一串连续的0和1,圆圈处为最高位符号位,因为我定的是四位整数位,所以终端方框处为整数位,所以总二进制位数为1+4+14=19位。

二、二进制转十进制

clc;clear;format long g;%正数原码位数限制integer + decimal < 23,负数补码位数限制integer + decimal < 16integer = 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 + 1before_point_arr(i) = fix(mod(tempt, 10));tempt = tempt / 10;endif (before_point_arr(integer + 1) == 1)flag = 1;elseflag = 0;end%------------------------------%if(mod(decimal, 2))odd = 1;elseodd = 0;endif(odd)x = (decimal - 1) / 2;y = (decimal + 1) / 2;z = 10.^x;tempt = fix(mod(num, z));for j = 1:xafter_point_arr(j) = fix(mod(tempt, 10));tempt = tempt / 10;endtempt = num / z;for j = y:decimalafter_point_arr(j) = fix(mod(tempt, 10));tempt = tempt / 10;endelsex = decimal / 2;y = x + 1;z = 10.^x;tempt = mod(fix(num), z);for j = 1:xafter_point_arr(j) = mod(fix(tempt), 10);tempt = tempt / 10;endtempt = num / z;for j = y:decimalafter_point_arr(j) = mod(fix(tempt), 10);tempt = tempt / 10;endend%------------------------------%if (flag == 1)for i = 1:integerswitch (after_point_arr(i))case 0before_point_arr(i) = 1;case 1before_point_arr(i) = 0;endendfor k = 1:integerbefore_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;endendendfor j = 1:decimalswitch (after_point_arr(j))case 0after_point_arr(j) = 1;case 1after_point_arr(j) = 0;endendend%------------------------------%for i = 1:integersum_before_point = sum_before_point + before_point_arr(i) * 2.^(i - 1);endfor j = 1:decimalsum_after_point = sum_after_point + after_point_arr(j) * 2.^(j - decimal - 1);endsum = 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

说明:因为MATLAB取模函数mod有位数限制,所以输入的二进制位数也有限制,

如上图所示,输入时直接输入一串二进制0和1,但是注意输入正数和负数的位数限制。

本内容不代表本网观点和政治立场,如有侵犯你的权益请联系我们处理。
网友评论
网友评论仅供其表达个人看法,并不表明网站立场。