assembly 如何四舍五入到一个整数没有分支在大会?

yhuiod9q  于 2023-10-19  发布在  其他
关注(0)|答案(5)|浏览(131)

如何在汇编中将一个真实的数四舍五入到最接近的整数?这里不允许使用分支。
例如,195 * .85 = 165.75。通常,我会将195乘以比例因子(100),然后相乘,然后除以比例因子。这将给我165给予。如何获得166?

i86rm4rw

i86rm4rw1#

例如,195 * 0.85 = 165.75。通常,我会将195乘以比例因子(100),然后相乘,然后除以比例因子。这将给我165给予。如何获得166?
传统上,你会使用2的幂的比例因子和移位,而不是乘和除;我想现在除法和乘法的成本与许多架构上的移位相同,您可能更关心保持一定的精度。
不管怎样,就像halex建议的那样,你应该在除之前加上0.5。净效果是,如果小数部分已经是0.5或更大,你会进位到整数部分。如果没有,那么就没有进位。
所以:
195 * 100 = 19500
19500 * 0.85 = 16575
16575 + 50(即0.5)= 16625
16625 / 100 = 166

pvabu6sv

pvabu6sv2#

假设你只给了整数,并且只告诉你其中一个整数需要用比例因子像小数一样对待.那么你可以通过使用一个两倍于你需要的比例因子来做到这一点。所以不是100,而是200。这将导致结果的最后一位为1或0,这取决于您是否要向上舍入。
所以在c风格中它看起来像这样

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

如果你不想把它(即。向下舍入),则“加法位”将为0。否则,如果你要向上舍入,“加法位”将为1。
我想这应该会给你给予你所需要的伪代码来正确地把它翻译成汇编。

wooyq4lh

wooyq4lh3#

在x86汇编中,有FRNDINT指令。

ma8fv8wu

ma8fv8wu4#

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

nfeuvbwi

nfeuvbwi5#

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

double round(double x) {
  return (long)(x + 0.5 + (*(long*)&x >> 63));
}

相关问题