【发布时间】:2012-04-25 19:11:31
【问题描述】:
我试图在某些计算中避免long longs 和整数溢出,所以我想出了下面的函数来计算(a * b) / c(由于截断整数除法,顺序很重要)。
unsigned muldiv(unsigned a, unsigned b, unsigned c)
{
return a * (b / c) + (a * (b % c)) / c;
}
是否有任何边缘情况无法按预期工作?
【问题讨论】:
-
你没有说为什么你要避免
long long,但如果是为了速度,我强烈怀疑任何额外的 div/mod 操作都会使节省的费用相形见绌。 -
我假设你已经检查了
c=0。 -
您没有提到您是否希望输出为整数或双精度 - 因为您正在进行除法。如果这是您担心的溢出问题,那么您可以标准化“a”、“b”和“c”,然后(取消)标准化结果。通过归一化,我的意思是除/乘以 10 的幂。
-
@Ben Jackson:我并没有避免 long long 的速度,这是一个任意的约束。 @twain249:是的,是的,我有。 @Santosh Tiwari:函数签名的返回类型为
unsigned,所以它是整数输出。 -
另外,如果
(a * b) / c不适合,我确实希望使用通常的无符号包装。
标签: c++ c algorithm math numbers