寻找这个溢出问题的规范示例

时间:2011-02-15 04:56:47

标签: c overflow

最近在一次采访中提出了这个概念,我今天和一位朋友讨论过这个问题。这是个主意:

假设您正在计算三维向量的点积。简单的函数是“return(x1 * x2)+(y1 * y2)+(z1 * z2)”。

但是,如果第一个和第二个术语是大的正数,即使它们的回答在可接受的范围内,它们也可能溢出。例如,假设整数限制为128. 100 + 100 - 80 = 120,但如果先进行前两次添加,则会溢出。

在大学课堂上,这是一个C作业,我们在计算一些我们之前可能做过一千次的事情,但从未注意过溢出(这是我们学习编写卫生代码时的部分) ,比如取一个平均值或类似的东西。

任何人都知道这可能发生在什么情况下?我知道在某些情况下你必须在加/减前使用比较来代替加/减来避免这种溢出

1 个答案:

答案 0 :(得分:3)

二进制搜索是一个典型的例子。许多实现都进行了基本上找到两个索引中点的计算:     (高+低)/ 2 但如果高和低各自接近Integer.MAX_VALUE或等同于您的语言,则在除数发生之前高+低溢出,并且您的答案是错误的:

http://googleresearch.blogspot.com/2006/06/extra-extra-read-all-about-it-nearly.html

在这种情况下可以轻松解决:     高/ 2 +低/ 2 相反,它不会溢出,但它是二进制搜索实现中几乎普遍的错误,当有人谈论计算中的溢出应该导致非溢出值时,首先要考虑到这一点。