假设我们希望将 int 𝑥(源自用户的输入,可能是 0 到 2·10⁹ 之间的任何位置)除以 65781.76,向下舍入并得到一个整数。如何在C中正确地做到这一点? 显然,
𝑥/65781.76f
将涉及定点/浮点运算,而100*𝑥/6578176L
=25*𝑥/1644544
则有太多溢出的风险。还有其他选择吗?我对仅涉及整数算术的解决方案和(最重要的是)正确的解释感兴趣。
PS。理想情况下,我们希望有一个非常便携的解决方案;如果可能的话,让我们坚持使用 C89–C90 左右的某个地方,而不需要外部库。
这是一种从原始整数出发的方法:
x
--------------------------
7227
65536 * ----
100
------------
72
72x
--------------------------
7227
65536 * ----
100
7200x
--------------------------
65536 * 7227
if(x < INT_MAX / 7200) // no overflow will happen
res = 7200 * x / (65536 * 7227);
else // overflow would happen
res = x / ((65536 * 7227) / 7200);