首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >组件中的除法和舍入

组件中的除法和舍入
EN

Stack Overflow用户
提问于 2020-04-10 13:02:34
回答 1查看 406关注 0票数 0

我有两个数字(DWORD number_A和DWORD number_B)。我不知道如何将这两个数字相除,以得到一个小数,四舍五入到最接近的千分之一。

(即)

代码语言:javascript
复制
DWORD number_A 20
DWORD number_B 10

A/B = 2.00是我试图得到的答案的格式。

如何在汇编语言中进行除法,然后像上面那样显示答案?如果有帮助的话,我们也在使用irvine库。

EN

回答 1

Stack Overflow用户

发布于 2020-04-10 22:47:37

如果您希望使用整数运算来完成此操作,则(方法1):

代码语言:javascript
复制
  q = A / B      -- integer division  ) assuming unsigned numbers, that's
  r = A % B      -- integer remainder ) q = eax and r = edx after a DIV

  r = r * 1000
  f = r / B      -- also integer division/remainder, as above
  r = r % B

  f += ((r * 2) >= B)  -- where >= returns 0 or 1

  if (f > 999) { q += 1 ; f = 0 ; }

然后输出q,后跟'.',然后是f的3位数字,并根据需要加上前导零。

您还可以按如下方式进行舍入和分数部分(方法2):

代码语言:javascript
复制
  q = A / B          -- as above
  r = A % B

  r = r * 2000
  f = r / B          -- result f is in half-thousandths
  f = (f + 1) >> 1   -- round to nearest thousandth

  if (f > 999) { q += 1 ; f = 0 ; } 

在这种形式和以前的形式中,如果B (非常)大,那么r * 2000 (实际上是r * 1000)可能会大于32位--但这没问题,因为只要商小于2^32,DIV就可以处理64位的被除数--我们知道本例中的商小于2000 (或1000)。

正如其他地方所指出的,您也可以这样做(方法3):

代码语言:javascript
复制
  A = A * 1000
  q = A / B
  r = A % B

  q += ((r * 2) >= B)  -- where >= returns 0 or 1

  f = q % 1000         -- alternatively, when outputting, convert f to  
  q = q / 1000         -- decimal and insert '.' before last 3 digits

或者(方法4):

代码语言:javascript
复制
  q = (A * 2000) / B   -- again half-thousandths
  q = (q + 1) >> 1     -- round to nearest thousandth

但是:如果A * 1000 (或A * 2000)大于或等于B * 2^32,那么除法将失败--因为q大于或等于2^32。

方法1和方法2的优点是它们不会以这种方式出错。

票数 1
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/61134309

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档