【发布时间】:2019-05-20 22:27:28
【问题描述】:
我正在使用 Assembly (x86) 并且正在使用百分比。我的问题是以下一个:
我有一些价值 total_sum 代表 100%。
我计算total_sum/100得到代表1%的值:
xorl %edx, %edx
movl total_sum, %eax
movl $100, %ecx
divl %ecx
稍后在我的程序中,我使用这个除法的结果来计算其他值所代表的百分比。
使用计算器完成的示例计算(浮点数):
515代表100%,506代表百分之几?
515/100 = 5.15
506/5.15 = 98.25这意味着:506 约占 515 的 98%。
不幸的是,使用汇编语言和整数运算,计算看起来像这样:
515/100 = 5
506/5 = 101这意味着 506 代表 515 的 101%。
但是,我不希望结果 > 100%。
我试图使用第一个部门的%edx 中的值进行一些更正。但是,对%eax 进行四舍五入(如果%edx 表示小数点后的第一位为5 或更多,则递增)并没有多大帮助。
如何确保我不会得到大于 100% 的值?
【问题讨论】:
-
请包含将数字相加到 total_sum 中的代码,并包含一组示例值。根据描述,如果值不是太大,您可以将它们乘以 10 的某个幂,可能是 10,000 或 1,000,000,然后再进行适当的除法。
-
需要更多关于以后计算的信息。一般来说;除法会导致精度损失,因此您希望将所有除法推迟到尽可能晚 - 例如而不是早点做
k = total/100,晚点a = b*k,你可能什么都不做,早点a = (b*total)/100晚点。 -
@Brendan 我编辑了这个问题,因为我想我已经理解了 OP 想要问的问题。然而,问题比你想象的还要糟糕:OP 执行两次除法(均具有精度损失),而不是一次乘法和一次除法。
-
8086 还是 X86?他们不一样
-
(506*100) / 515 给你你想要的结果。整数除法不像连续实数那样工作。
标签: assembly x86 att integer-division