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

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

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

  1. if((maxCnt==BCD8_MAX)&&(carryData==1))//如果数组的有效位是最大值并且最后的进位是1,则计算溢出报错
  2. {
  3. ClearAllData(BCD8_MAX,resultData);
  4. addResult=10;//报错
  5. }
  6. return addResult;
  7. }
  8. /* 注释九:
  9. *函数介绍:数组向大索引值移位,移一位相当于放大10倍
  10. *输入参数:*destData--被移位的数组。
  11. *输入参数:enlarge_cnt--被移位的个数。
  12. */
  13. void EnlargeData(uchar *destData,uchar enlarge_cnt)
  14. {
  15. uchar i;
  16. if(enlarge_cnt!=0)
  17. {
  18. for(i=0;i<(BCD8_MAX-enlarge_cnt);i++)
  19. {
  20. destData[BCD8_MAX-1-i]=destData[BCD8_MAX-1-enlarge_cnt-i];
  21. }
  22. for(i=0;i
  23. {
  24. destData[i]=0;
  25. }
  26. }
  27. }
  28. /* 注释十:
  29. *函数介绍:两个数相乘
  30. *输入参数:
  31. *(1)*destData--被乘数的数组。
  32. *(2)*sourceData--乘数的数组。
  33. *(3)*resultData--积的数组。
  34. *返回值:10代表计算结果超出范围出错,11代表正常。
  35. */
  36. uchar MultData(const uchar *destData,const uchar *sourceData,uchar *resultData)
  37. {
  38. uchar multResult=11; //开始默认正常
  39. uchar destCnt=0;
  40. uchar sourceCnt=0;
  41. uchar i;
  42. uchar j;
  43. uchar carryData=0;//进位
  44. uchar resultTemp=0; //存放临时运算结果的中间变量
  45. uchar nc_add_result;//接收相加的运算是否超出范围,这里不用判断,因为不会溢出
  46. uchar multArrayTemp[BCD8_MAX]; //存放临时运算结果的数组中间变量
  47. destCnt=GetDataLength(destData,BCD8_MAX); //获取被乘数的长度
  48. sourceCnt=GetDataLength(sourceData,BCD8_MAX); //获取乘数的长度
  49. ClearAllData(BCD8_MAX,resultData); //清零存储的结果
  50. if((0==destCnt)||(0==sourceCnt)) //被乘数或者乘数为0,则结果为0
  51. {
  52. return multResult;
  53. }
  54. if((destCnt+sourceCnt+2)>BCD8_MAX)
  55. {
  56. multResult=10; //运算结果有可能超范围报错
  57. return multResult;
  58. }
  59. for(i=0;i
  60. {
  61. carryData=0; //清零进位
  62. ClearAllData(BCD8_MAX,multArrayTemp); //清零一位乘数相乘的结果中间变量数组
  63. for(j=0;j
  64. {
  65. resultTemp=destData[j]*sourceData[i]+carryData;//乘数的一位依次与被乘数各位相乘,并且加进位
  66. multArrayTemp[j]=resultTemp%10;//存储一位乘数相乘的结果
  67. carryData=resultTemp/10; //保存进位
  68. }
  69. multArrayTemp[j]=carryData; //存储最后的进位
  70. EnlargeData(multArrayTemp,i); //移位。移一次相当于放大10倍。
  71. nc_add_result=AddData(resultData,multArrayTemp,resultData); //把一位乘数相乘的结果存储进总结果
  72. }
  73. return multResult;
  74. }
  75. /* 注释十一:
  76. *函数介绍:局部两个数相除,商不超过10。当商为0时,余数是被除数
  77. *原理精髓:根据手工除法的原理,我们都是从高位开始借位相除,此时是局部相除,因此商都不超过10,剩下的余数继续借位
  78. *依次除下去。这个程序的除法原理是挨个猜值,反正商是从0,1,2.。。。9这10个数中的其中一个,为了快速找到我们想要的那个商,我是
  79. *利用中间法则进行寻找,先猜是5,然后判断一下是大了还是小了,如果是大了,就猜是3,如果小了就猜是7,最后肯定会找到商。
  80. *输入参数:
  81. *(1)*destData--被除数的数组。
  82. *(2)*sourceData--除数的数组。
  83. *(3)*resultData--商的数,不是数组,传址进去,是0,1,2到9中的某个数
  84. *(4)*remData--余数的数组。
  85. *返回值:10代表计算结果超出范围出错,11代表正常。
  86. */
  87. uchar DivLessTenData(const uchar *destData,const uchar *sourceData,uchar *resultData,uchar *remData)
  88. {
  89. uchar DivLessTenResult=11; //开始默认正常
  90. uchar destCnt=0;
  91. uchar sourceCnt=0;
  92. uchar i;
  93. uchar resultRunStep=5;
  94. uchar cmpError=10;
  95. uchar DivLessTenArrayTemp[BCD8_MAX]; //存放临时运算结果的数组中间变量
  96. uchar DivLessTenArrayResult[BCD8_MAX]; //存放临时运算结果的数组中间变量的结果
  97. uchar DivLessTenArrayBackup[BCD8_MAX]; //存放临时运算结果的数组中间变量的备份
  98. uchar while_flag=0;//结束猜算的中间变量
  99. uchar multError=11;
  100. uchar subError=11;
  101. destCnt=GetDataLength(destData,BCD8_MAX); //获取被除数的数据有效长度
  102. sourceCnt=GetDataLength(sourceData,BCD8_MAX); //获取除数的数据有效长度
  103. cmpError=CmpData(destData,sourceData); //比较被除数和除数的大小
  104. ClearAllData(BCD8_MAX,remData); //清空余数,余数为0
  105. if(cmpError==9) //被除数比除数小
  106. {
  107. *resultData=0; //商肯定为0
  108. for(i=0;i
  109. {
  110. remData[i]=destData[i]; //余数等于被除数
  111. }
  112. return DivLessTenResult;
  113. }
  114. else if(cmpError==10) //被除数与除数相等
  115. {
  116. *resultData=1; //商等于1余数为0
  117. return DivLessTen

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

网站地图

Top