微波EDA网,见证研发工程师的成长!
首页 > 硬件设计 > 嵌入式设计 > 第65节:大数据的除法运算

第65节:大数据的除法运算

时间:11-22 来源:互联网 点击:

  1. */
  2. void ClearAllData(uchar ucARRAY_MAX,uchar *destData)
  3. {
  4. uchar i;
  5. for(i=0;i
  6. {
  7. destData[i]=0;
  8. }
  9. }
  10. /* 注释五:
  11. *函数介绍:获取数组的有效长度
  12. *输入参数:*destData--被获取的数组。
  13. *输入参数:ucARRAY_MAX代表数组定义的最大长度
  14. *返回值:返回数组的有效长度。比如58786这个数据的有效长度是5
  15. *电子开发者作者:吴坚鸿
  16. */
  17. uchar GetDataLength(const uchar *destData,uchar ucARRAY_MAX)
  18. {
  19. uchar i;
  20. uchar DataLength=ucARRAY_MAX;
  21. for(i=0;i
  22. {
  23. if(0!=destData[ucARRAY_MAX-1-i])
  24. {
  25. break;
  26. }
  27. else
  28. {
  29. DataLength--;
  30. }
  31. }
  32. return DataLength;
  33. }
  34. /* 注释六:
  35. *函数介绍:比较两个数的大小
  36. *输入参数:
  37. *(1)*destData--被比较数的数组。
  38. *(2)*sourceData--比较数的数组。
  39. *返回值:9代表小于,10代表相等,11代表大于。
  40. */
  41. uchar CmpData(const uchar *destData,const uchar *sourceData)
  42. {
  43. uchar cmpResult=10; //开始默认相等
  44. uchar destCnt=0;
  45. uchar sourceCnt=0;
  46. uchar i;
  47. destCnt=GetDataLength(destData,BCD8_MAX);
  48. sourceCnt=GetDataLength(sourceData,BCD8_MAX);
  49. if(destCnt>sourceCnt)//大于
  50. {
  51. cmpResult=11;
  52. }
  53. else if(destCnt
  54. {
  55. cmpResult=9;
  56. }
  57. else if((destCnt==0)&&(sourceCnt==0))//如果都是等于0则等于
  58. {
  59. cmpResult=10;
  60. }
  61. else//否则就要继续判断
  62. {
  63. for(i=0;i
  64. {
  65. if(destData[destCnt-1-i]>sourceData[destCnt-1-i]) //从最高位开始判断,如果最高位大于则大于
  66. {
  67. cmpResult=11;
  68. break;
  69. }
  70. else if(destData[destCnt-1-i]
  71. {
  72. cmpResult=9;
  73. break;
  74. }
  75. //否则继续判断下一位
  76. }
  77. }
  78. return cmpResult;
  79. }
  80. /* 注释七:
  81. *函数介绍:两个数相减
  82. *输入参数:
  83. *(1)*destData--被减数的数组。
  84. *(2)*sourceData--减数的数组。
  85. *(3)*resultData--差的数组。注意,调用本函数前,必须先把这个数组清零
  86. *返回值:10代表计算结果是负数或者超出范围出错,11代表正常。
  87. */
  88. uchar SubData(const uchar *destData,const uchar *sourceData,uchar *resultData)
  89. {
  90. uchar subResult=11; //开始默认正常
  91. uchar destCnt=0;
  92. uchar i;
  93. uchar carryData=0;//进位
  94. uchar maxCnt=0; //最大位数
  95. uchar resultTemp=0; //存放临时运算结果的中间变量
  96. //为什么不在本函数内先把resultData数组清零?因为后面章节中的除法运算中要用到此函数实现连减功能。
  97. //因此如果纯粹实现减法运算时,在调用本函数之前,必须先在外面把差的数组清零,否则会计算出错。
  98. if(CmpData(destData,sourceData)==9)//被减数小于减数,报错
  99. {
  100. subResult=10;
  101. return subResult;//返回判断结果,并且退出本程序,不往下执行本程序余下代码
  102. }
  103. destCnt=GetDataLength(destData,BCD8_MAX);//获取被减数的有效数据长度
  104. maxCnt=destCnt;
  105. for(i=0;i
  106. {
  107. resultTemp=sourceData[i]+carryData; //按位相加
  108. if(resultTemp>destData[i])
  109. {
  110. resultData[i]=destData[i]+10-sourceData[i]-carryData; //借位
  111. carryData=1;
  112. }
  113. else
  114. {
  115. resultData[i]=destData[i]-sourceData[i]-carryData; //不用借位
  116. carryData=0;
  117. }
  118. }
  119. return subResult;
  120. }
  121. /* 注释八:
  122. *函数介绍:两个数相加
  123. *输入参数:
  124. *(1)*destData--被加数的数组。
  125. *(2)*sourceData--加数的数组。
  126. *(3)*resultData--和的数组。注意,调用本函数前,必须先把这个数组清零
  127. *返回值:10代表计算结果超出范围出错,11代表正常。
  128. */
  129. uchar AddData(const uchar *destData,const uchar *sourceData,uchar *resultData)
  130. {
  131. uchar addResult=11; //开始默认返回的运算结果是正常
  132. uchar destCnt=0;
  133. uchar sourceCnt=0;
  134. uchar i;
  135. uchar carryData=0;//进位
  136. uchar maxCnt=0; //最大位数
  137. uchar resultTemp=0; //存放临时运算结果的中间变量
  138. //为什么不在本函数内先把resultData数组清零?因为后面章节中的乘法运算中要用到此函数实现连加功能。
  139. //因此如果纯粹实现加法运算时,在调用本函数之前,必须先在外面把和的数组清零,否则会计算出错。
  140. destCnt=GetDataLength(destData,BCD8_MAX); //获取被加数的有效位数
  141. sourceCnt=GetDataLength(sourceData,BCD8_MAX);//获取加数的有效位数
  142. if(destCnt>=sourceCnt)//找出两个运算数据中最大的有效位数
  143. {
  144. maxCnt=destCnt;
  145. }
  146. else
  147. {
  148. maxCnt=sourceCnt;
  149. }
  150. for(i=0;i
  151. {
  152. resultTemp=destData[i]+sourceData[i]+carryData; //按位相加
  153. resultData[i]=resultTemp%10; //截取最低位存放进保存结果的数组
  154. carryData=resultTemp/10; //存放进位
  155. }
  156. resultData[i]=carryData;
  157. if((maxCnt==BCD8_MAX)&&(carryData==

Copyright © 2017-2020 微波EDA网 版权所有

网站地图

Top