如何将非负变量整数除以正常量浮点数而不冒太多溢出风险?

问题描述 投票:0回答:1

假设我们希望将 int 𝑥(源自用户的输入,可能是 0 到 2·10⁹ 之间的任何位置)除以 65781.76,向下舍入并得到一个整数。如何在C中正确地做到这一点? 显然,

𝑥/65781.76f
将涉及定点/浮点运算,而
100*𝑥/6578176L
=
25*𝑥/1644544
则有太多溢出的风险。还有其他选择吗?我对仅涉及整数算术的解决方案和(最重要的是)正确的解释感兴趣。

PS。理想情况下,我们希望有一个非常便携的解决方案;如果可能的话,让我们坚持使用 C89–C90 左右的某个地方,而不需要外部库。

c integer division integer-division integer-arithmetic
1个回答
0
投票

这是一种从原始整数出发的方法:

            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);
© www.soinside.com 2019 - 2024. All rights reserved.