c – 这个乘除功能是否正确?

我试图在一些计算中避免长long和整数溢出,所以我想出了下面的函数来计算(a * b)/ c(由于截断整数除法,顺序很重要).

unsigned muldiv(unsigned a, unsigned b, unsigned c)
 {
      return a * (b / c) + (a * (b % c)) / c;
 }

是否存在任何不能按预期工作的边缘情况?

编辑:对于原始明显逻辑正确的值的超集,这是正确的.如果c>它仍然没有给你买b并且可能在其他条件下.也许你对c的价值有所了解,但这可能没有你期望的那么多. a,b,c的某些组合仍然会溢出.

编辑:假设你因为严格的C 98可移植性原因而长期避免使用,你可以通过将无符号转换为具有积分值来进行数学计算的双精度来获得大约52位的精度.使用双数学实际上可能比进行三个积分除法更快.

相关文章
相关标签/搜索