如果无符号计算可能会溢出,如何确定?

时间:2011-11-08 23:28:19

标签: c math arbitrary-precision

作为个人项目,我正在为我的宠物项目实施任意精度数字类型。

我已经知道所有流行,经过测试和强大的库都可以做到这一点。我想将解决方案作为自我改进教育项目。

我正在研究该领域并试图找出是否有某种方法粗略预测在我实际进行计算之前操作是否会导致溢出。我也不太关心误报。

我希望能够使用适合计算的最小空间。如果计算将保持在其原生范围内,我会将其保留在那里。

例如:Multiplying two 64 bit Integers if each are large enough will cause an overflow.我想检测到这一点,并且仅当结果可能超过64位分辨率时才将数字上转换为我的数字类型。我将在此实验中使用签名号码。

检测溢出/下溢的最有效,最有效的方法是什么?

3 个答案:

答案 0 :(得分:2)

只取两个数字中的最高位,向左移一,如果这些数字的结果(例如:乘法)会导致溢出,那么溢出就会有很好的机会。 / p>

虽然它不精确,但速度非常快,是一个很好的指标,表明你需要更大的数据类型。

这可能只适用于操作员成本高昂的大型数据类型,对于简单的事情(即使是64位数字),我认为您可以依赖CPU的内置算法..请参阅此问题:Undefined behavior when exceed 64 bits

答案 1 :(得分:2)

John Regehr的paper就此而言。

答案 2 :(得分:0)

进行简单计算几乎总是更容易(通常更快),并检测是否发生溢出。是否有一个特定原因可以在进行计算之前检测的可能性?

一旦计算完成,通常很容易检测是否发生了溢出。由于天真的操作很便宜,如果发生溢出,这也不会增加计算成本,即使你最终需要重做一些工作。 (通常,你甚至不需要那样做。)

这是一个(非常)简单的例子:如果我添加两个无符号的64位数字,我可以通过比较任何一个加数的总和来检查溢出 - 如果它小于溢出。因此,在计算之后检测溢出只需要一次比较(确实非常便宜)。