我有两个数字(DWORD number_A和DWORD number_B)。我不知道如何将这两个数字相除,以得到一个小数,四舍五入到最接近的千分之一。
(即)
DWORD number_A 20
DWORD number_B 10A/B = 2.00是我试图得到的答案的格式。
如何在汇编语言中进行除法,然后像上面那样显示答案?如果有帮助的话,我们也在使用irvine库。
发布于 2020-04-10 22:47:37
如果您希望使用整数运算来完成此操作,则(方法1):
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):
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):
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):
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的优点是它们不会以这种方式出错。
https://stackoverflow.com/questions/61134309
复制相似问题