《数字逻辑电路设计及应用(10进制转2进制)(5页).doc》由会员分享,可在线阅读,更多相关《数字逻辑电路设计及应用(10进制转2进制)(5页).doc(5页珍藏版)》请在淘文阁 - 分享文档赚钱的网站上搜索。
1、-数字逻辑电路设计及应用(10进制转2进制)-第 5 页数字逻辑电路设计及应用C程序设计报告(1)问题:设计一个C程序实现任意十进制数到二进制数的转换,二进制精度为11位。思路:1. 十进制数转二进制数对整数和小数的处理时不一样的。所以设计程序时,也应该对读入的整数和小数的数据分开处理。(分开的办法可以先直接对浮点数强制类型转换,即可得到整数部分,再用浮点数减整数部分,即可得到小数部分)。2. 对于整数部分,采用的是“除2法”(不知道是不是这个名字)。即,每次将该数除以2,得到的余数作为该位的二进制数,商作为下一次的除数,依此类推,直到商为1或0为止。3. 对于小数部分,采用的是“乘2法”(依
2、然不知道是不是这个名字)。即,每次将小数部分乘2,得到的整数部分即为该位的二进制数,小数部分为下一次的乘数。依此类推,这样做下去是一个无限不循环的小数,所以一般会要求二进制数中小数的精度,本题目要求的是11位。4. 在实际程序设计过程中,我发现了这样一个问题,当小数部分二进制码采用浮点型数据时,单独输出准确无误,但与整形的整数部分二进制码结合在一起后,最后3位总是不准确的,怀疑是在相加的过程中产生了“大数吃小数”的问题。按照一般思维,此时应提高精度,采用long double型变量,但是我采用的编译器是采用Windows C的运行库(MS C编译器)的MinGW,其对printf函数不支持lo
3、ng double型。无奈之下,我只能把小数部分存为一个11位长的数组,再对其输出。流程:程序:/* this is a program to transform decimal nubers to binary nubers./* Huang Bohao/*2013.3.8:/*将小数部分用数组形式存储,避免了整数部分与小数部分相加而出现的/*大数吃小数的情况#include int Integer2Binary(int integer); /将十进制整数转换为二进制数的函数void Fraction2Binary(double fraction, int BinaryFraction11)
4、; /将十进制小数转化为二进制数的函数void main()int i,integer,BinaryInt,BinaryFraction11; /待转化数据的整数部分以及转化完成的二进制数float x,fraction; /待转化数据和带转化数据的小数部分printf(please input the decimal number you want to transformn);scanf(%f,&x);integer = (int)x;fraction = x - integer;BinaryInt = Integer2Binary(integer);Fraction2Binary(fra
5、ction,BinaryFraction);printf(the binary number of integer part is %dn,BinaryInt);printf(the binary number of fraction part is );for(i = 0; i 11; i+) printf(%d,BinaryFractioni); printf(n);printf(the binary number is %d.,BinaryInt);for(i = 0; i 11; i+) printf(%d,BinaryFractioni); printf(n);/* function
6、 name: Integer2Binary/* input parameter: int integer (integer waiting to be transformed)/* output parameter: int output (transformed integer)int Integer2Binary(int integer) int B,Y,output,flag; /B被除数,Y为余数,output为输出数据,flag为位置标记位 B = integer; flag = 1; output = 0; while(1) Y = B%2; /求得余数 B = B/2; /求得下
7、一次的被除数 output += Y*flag; flag *= 10; if(B = 0)break; return(output);/* function name: Fraction2Binary/* input parameter: double fraction (fraction waiting to be transformed), int BinaryFraction11/* output parameter: float output (transformed integer)void Fraction2Binary(double fraction, int BinaryFraction11) int i,C; /C为乘数 double output = 0; double flag = 0.1; for(i = 0; i 11; i+) C = (fraction*2) / 1; /求得乘数 fraction = (fraction*2) - (int)(fraction*2); /下一次计算的乘数 BinaryFractioni = C;运行结果:
限制150内