6

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

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

我正在研究该区域并试图弄清楚是否有某种方法可以在我实际进行计算之前粗略预测操作是否会导致溢出。我也不那么担心误报。

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

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

检测上溢/下溢的最理智、最有效的方法是什么?

4

3 回答 3

2

仅取两个数字中的最高位,左移一位,如果这些数字的结果(例如:乘法)会导致溢出,则很有可能发生溢出。

虽然它并不精确,但它的速度非常快,并且很好地表明您需要更大的数据类型来获得结果。

这可能只对运算符成本高昂的大型数据类型有意义,对于简单的事情(即使对于 64 位数字),我认为你可以依赖 CPU 的内置算法.. 看到这个问题:Undefined behavior when exceeded 64 bits

于 2011-11-08T23:32:20.063 回答
2

John Regehr 的论文就是关于这一点的。

于 2011-11-08T23:37:40.557 回答
0

进行简单计算并检测是否发生溢出几乎总是更容易(而且通常更快)。您是否有特定原因要在进行计算之前检测这种可能性?

一旦计算完成,通常很容易检测是否发生溢出。因为简单的操作很便宜,所以如果确实发生了溢出,这也不会增加你的计算成本,即使你最终需要重做一些工作。(但是,通常您甚至不需要这样做)。

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

于 2011-11-08T23:42:22.327 回答