3

如何在汇编中将整数四舍五入到最接近的整数?这里不允许使用分支。

例如,195 * .85 = 165.75。通常,我会将 195 乘以比例因子 (100),然后相乘,然后再除以比例因子。这会给我 165。我如何得到 166?

如果这是一个可怕的问题,我很抱歉 - 我是组装新手!谢谢你。

4

5 回答 5

6

例如,195 * .85 = 165.75。通常,我会将 195 乘以比例因子 (100),然后相乘,然后再除以比例因子。这会给我 165。我如何得到 166?

传统上,您会使用两个比例因子的幂并移位而不是乘法和除法;我想现在除法和乘法的成本与许多架构上的转变相同,您可能更关心保持一定的精度。

无论如何,正如halex 所建议的那样,在除法之前你要加0.5。最终效果是,如果小数部分已经是 0.5 或更大,您将进入整数部分。如果没有,那么将没有携带。

所以:

195 * 100 = 19500
19500 * 0.85 = 16575
16575 + 50(即 0.5)= 16625
16625 / 100 = 166

于 2012-10-10T21:08:55.083 回答
3

假设您只获得了整数,并且只是告诉您需要使用比例因子将其中一个整数视为小数......那么您可以通过使用两倍于您需要的比例因子来做到这一点。因此,您使用 200 而不是 100。这将导致结果的最后一位为 1 或 0,具体取决于您是否要四舍五入。

所以在c风格中它看起来像这样

result = (195 * 85) / (100 / 2);
add = result & 1;
result = result / 2 + add;

如果您不应该向上取整(即向下取整),则“添加位”将为 0。否则,如果您应该向上取整,“添加位”将为 1。

我认为这应该为您提供正确将其转换为程序集所需的伪代码。

于 2012-10-10T21:06:29.947 回答
3

在 x86 汇编中,有 FRNDINT 指令。

于 2012-10-10T21:12:13.367 回答
-2

整数没有小数位,因此它已经是一个整数。

于 2012-10-10T21:03:22.853 回答
-2

对于正数和负数,asm 中有 6 个字符串。

double round(double x) {
  return (long)(x + 0.5 + (*(long*)&x >> 63));
}
于 2021-03-28T18:18:24.277 回答