如何在汇编中将整数四舍五入到最接近的整数?这里不允许使用分支。
例如,195 * .85 = 165.75。通常,我会将 195 乘以比例因子 (100),然后相乘,然后再除以比例因子。这会给我 165。我如何得到 166?
如果这是一个可怕的问题,我很抱歉 - 我是组装新手!谢谢你。
如何在汇编中将整数四舍五入到最接近的整数?这里不允许使用分支。
例如,195 * .85 = 165.75。通常,我会将 195 乘以比例因子 (100),然后相乘,然后再除以比例因子。这会给我 165。我如何得到 166?
如果这是一个可怕的问题,我很抱歉 - 我是组装新手!谢谢你。
例如,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
假设您只获得了整数,并且只是告诉您需要使用比例因子将其中一个整数视为小数......那么您可以通过使用两倍于您需要的比例因子来做到这一点。因此,您使用 200 而不是 100。这将导致结果的最后一位为 1 或 0,具体取决于您是否要四舍五入。
所以在c风格中它看起来像这样
result = (195 * 85) / (100 / 2);
add = result & 1;
result = result / 2 + add;
如果您不应该向上取整(即向下取整),则“添加位”将为 0。否则,如果您应该向上取整,“添加位”将为 1。
我认为这应该为您提供正确将其转换为程序集所需的伪代码。
在 x86 汇编中,有 FRNDINT 指令。
整数没有小数位,因此它已经是一个整数。
对于正数和负数,asm 中有 6 个字符串。
double round(double x) {
return (long)(x + 0.5 + (*(long*)&x >> 63));
}