【问题标题】:Division Round Up in C++C++ 中的除法舍入
【发布时间】:2020-05-26 22:43:14
【问题描述】:

在不使用 std::ceil 的情况下,在 C++ 中对两个 int 值执行除法时如何进行舍入?

通常我最终会执行以下操作:

double res = ceil(a / (double) b);

有什么方法可以在不使用std::ceil 的情况下复制结果?

【问题讨论】:

  • ab有哪些类型?
  • 他们是int
  • (int)(a / (double)b + 0.5)?

标签: c++ c++11 division integer-division ceil


【解决方案1】:

如果ab 都是正数,则可以完全避免浮点数,通过经典方法获得准确的结果(FP 舍入没有问题)和更快的执行时间:

int res = (a + (b - 1)) / b;

对于负的a,您不需要任何更正 - 整数除法执行的截断已经具有与您的ceil 公式匹配的语义;所以,如果你想要一个更一般的情况:

int res = (a<0 ? a : (a + (b - 1))) / b;

【讨论】:

  • 这里的整数溢出怎么办? (如果 a 和 b 中的任何一个足够大)
  • 否定的b呢?
  • @LuisMachuca 如果有问题,您可以执行a / b + !!(a % b) 之类的操作,这应该不会造成任何问题,但它可能会慢一些(它有一个分支,一般来说更多复杂的代码)。
  • 如果都是肯定的,(a-1)/b + 1更好,因为它不会溢出。
  • @norok2 到目前为止,当ab 都被允许签名时,所提议的解决方案中的none 比较等于std::ceil
【解决方案2】:

你可以这样做

double res = (double) (((a % b) == 0) ? (a / b) : (a / b) + 1);

基本上如果有余数,将截断的整数结果加1

【讨论】:

  • 或者,更简洁地说,a/b + !!(a%b)
猜你喜欢
  • 2013-04-23
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2013-01-21
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多