能否预测数学运算是否会导致溢出?

3

假设你有两个数字,对于每个典型的数学运算,是否有可能预测(不会有显著的开销)这些操作是否会导致溢出,而这些数字就是当前所表示的类型?

3个回答

2

是的。

为了简单起见,假设溢出发生在100处。

a * b >= 100,我们会有溢出。

因此,对于a = n,如果b >= 100 / n,我们就会有溢出。如果ab为0,则不会发生溢出。

对于任何需要增加右侧常量的数学设置,这种方法都不适用,因为您的溢出检测会溢出。然而,每个操作的任何给定步骤都可能会溢出,因此您确实需要在机器级别而不是算法级别上在进行每次加法和乘法之前检查。因此,您需要将问题分成最小的已知数量,以有效地使用此溢出检测。

我宁愿让语言抛出异常,但这只是我的个人意见。


最终,让语言自行处理(在特殊情况下除外)可能比费尽心思地覆盖所有可能溢出的情况更便宜。 - Will A
不幸的是,旧语言不采用这种方法,而幸运的是,除非你的内存耗尽,否则较新的语言就不会出现这个问题 :P - Stefan Kendall
除非你的内存用完了,这是正确的吗?溢出异常发生在算术运算产生的结果超出操作返回的数据类型范围时。 - Rohan West

0

求和:

MAX_NUMBER - A < B

会发生溢出


1
如果A为负数,则在测试中会出现溢出。 - Paul R
@Paul R 您是正确的,需要检查A>0。如果检查两者是否为负数,则会溢出MIN_NUMBER。 - Daniel Moura

0

打开溢出保护,然后进行操作。如果引发了溢出异常,或者错误寄存器设置了溢出位,或者无论你的环境如何告诉你有问题,那么你就知道如果再次执行相同操作,将会发生溢出。


并非所有的机器都具备此功能。 - Stefan Kendall

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接