【发布时间】:2011-04-04 17:22:52
【问题描述】:
我有两个整数变量 a 和 b 和一个常量 s 分别。 d。我需要分别计算(a*b)>>s 的值。 a*b/d。问题是乘法可能会溢出,即使a*b/d 可以适合给定的整数类型,最终结果也不会正确。
如何有效地解决这个问题?直接的解决方案是将变量a 或b 扩展为更大的整数类型,但可能没有更大的整数类型。有没有更好的方法来解决这个问题?
【问题讨论】:
-
我推断
d总是1<<s。这是真的吗? -
最好的办法是扩展成更大的整数类型。
-
总有一个更大的整数类型:
struct uint_twice_max { uintmax_t upper, lower; };。我将把操作定义留给你:p -
@pwny:这可能会导致准确性降低,尤其是当
d和b很大时。 -
你想要一个四舍五入的积分还是一个浮点数作为答案?